生成的 Webresource.axd 參數無效
原始問題:
我們在生成 WebResource.axd url 時遇到了一個奇怪的錯誤。(這似乎與相當常見的“WebRsource.axd 填充無效且無法刪除”問題無關)。
我們有一個 ASP.NET 網頁,它在創建時會添加對 WebResource.axd 的腳本引用。
在這種情況下,我們看到 WebResource.axd 連結偶爾會在某個時間點變成垃圾,取而代之的是看起來像 javascript 的內容。更糟糕的是,url 生成失敗似乎並不一致。
在我們的例子中,連結應該(並且通常看起來像):
/WebResource.axd?d=D-wd7RbHCvSp_p0mHAmE4g2&t=633464867255568315一切都很好。但是,我們收到使用者記錄的錯誤……他們嘗試訪問的 url 看起來像(在一種情況下):
/WebResource.axd?d=D-wd7RbHCvS/../../images/icons/Ico_resize.gif')}}function%20ShowFilter_Manufacturer(){var%20div.......$$ the remaining encoded javascript from that link has been removed as irrelevant $$ 更奇怪的是,我們從同一個使用者那裡快速連續地獲得了其中的一些,顯然他正試圖重新載入頁面……每個 url 略有不同。
/WebResource.axd?d=D-wd7RbHCvS<garbage> /WebResource.axd?d=D-wd7RbHCvSp<garbage> /WebResource.axd?d=D-wd7RbHCvSp_<garbage>在某些情況下,垃圾是用 JavaScript 編碼的,我看到了 url 的一部分……完全為空的參數字元串……我沒有看到明顯的模式。
順便說一句,如果它是相關的,應該注意的是,我不相信這個 WebResource 不是股票 WebResource 之外的任何東西,當頁面上包含某些功能時,.NET 會自動包含它……在這種情況下,一個欄位驗證器。查看實際 WebResource.axd 的內容會發現一組看起來非常標準的 Javascript 函式,這些函式似乎旨在處理通用 .NET 事件。不是我們創造的任何東西。
有沒有人見過這樣的事情?(或者更好的是,有沒有人理解為什麼會發生這種情況,並想出一種方法來消除它?)
**編輯 0:**一些附加資訊:
第 1 項:針對一個答案,我們確保我們的腳本用 CDATA 標記封裝,因為我們的 doctype 是 xhtml 過渡:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">不幸的是,雖然我們寄予厚望,但它似乎並沒有解決問題。我們在 IE 8 作為瀏覽器時更經常注意到這一點,這會讓人相信這是與瀏覽器相關的想法……也許是瀏覽器解析流的方式……但是為什麼我們會得到微妙的不同響應在隨後的嘗試中讓我感到困惑。
第 2 項:事實證明,省略的部分似乎是相當規則大小的塊。有人報告說他看到 1k 或 4k 塊失去,我(到目前為止……我只看過兩個案例)會同意(我的都失去了 4096 字節的數據)。
根據這篇文章:
http://bytes.com/topic/asp-net/answers/861764-invalid-viewstate-system-string-decryptstringwithiv
似乎問題是由於未指定文件類型時瀏覽器呈現頁面的方式不同引起的。
這是我在這個主題上發現的另一篇有趣的文章,但仍然不是解決方案:
http://blog.aproductofsociety.org/?p=11
在上面的頁面上,它在評論中有“Response.Cache.SetNoStore()”作為可能的解決方案,我接下來會試試這個,看看它是否有幫助。
微軟已對此問題作出回應:
注意是 Internet Explorer 8 中的一個錯誤。Internet Explorer 團隊一直在調查此問題。
-=影響=- 到目前為止,我們認為該問題不會影響最終使用者使用 Web 應用程序的體驗;唯一的負面影響是 JavaScript 推測下載引擎發送的虛假/格式錯誤的請求。當解析器實際需要該腳本時,將在那時正確下載和使用該腳本。
-=Circumstances=- 虛假請求似乎僅在某些時間情況下發生,僅當包含帶有 CHARSET 指令的 Content-Type 的 META HTTP-EQUIV 標記出現在文件中時,並且僅當 JavaScript SRC URL 跨越第 4096 個時HTTP 響應正文的字節。
-=Workaround=- 因此,我們目前認為可以通過使用 HTTP Content-Type 標頭聲明頁面的 CHARSET 而不是在頁面中指定它來緩解此問題。
所以,而不是把
$$ META HTTP-EQUIV=“Content-Type” CONTENT=“text/html; charset=utf-8” $$ 相反,在您的 head 標記中,發送以下 HTTP 響應標頭:
內容類型:文本/html;字元集=utf-8
請注意,HTTP 標頭中的字元集規範會提高所有瀏覽器的性能,因為瀏覽器的解析器在遇到字元集聲明時無需從頭重新開始解析。此外,使用 HTTP 標頭有助於緩解某些 XSS 攻擊向量。
注意:有報導稱,當 META HTTP-EQUIV 不在頁面上時,仍然會發生此問題。當我們進行更多調查時,我們將更新此評論。Microsoft 於 2009 年 6 月 30 日下午 12:25 發布