我試圖啓用視圖狀態加密始終將作爲我在IIS6中託管的ASP.NET 3.5網站的安全措施。我們關閉了viewstate,但仍然在此字符串中看到一些「控制狀態」。在測試環境中,我可以簡單地設置在web.config中的以下內容,我再也不能解碼的base64的視圖狀態到半明文:asp.net viewstate加密問題
<pages enableViewState="false" enableViewStateMac="true" viewStateEncryptionMode="Always">
我甚至增加了以下(由machine key generater genereated)到machine.config中,仍然加密我的測試服務器上的視圖狀態罰款:
<machineKey validationKey="002..." decryptionKey="D90E..." validation="SHA1" decryption="AES" />
我非測試環境似乎並沒有拿起上述變化,因爲我總是能的base64解碼的視圖狀態,以純文本與上面的設置。我做任何改變後,我總是喜歡。
我的非測試Web服務器的一些信息:
- Web場/負載平衡(但只有一臺服務器以進行測試現在)
- SQL會話狀態(最初需要在machine.config中的machineKey設置此)
- 的machine.config:部署的零售=「真」
任何人都可以建議去哪裏尋找可能與asp.net視圖狀態加密干擾其他設置?
編輯︰現在在我的iis測試服務器上我無法撤消viewStateEncryptionMode設置,因爲它是加密視圖狀態,即使當我將其設置爲「從不」,我的其他網站似乎沒有采取持有這種設置。我可以在哪裏查看該屬性被覆蓋的位置?有沒有任何緩存存儲這個設置,除了當我iisreset /停止www服務/ touch machine.config時會做什麼需要清除?
編輯最終:經過幾天的學習配置文件,我放棄了並通過代碼實現了這一點。我已經有一個安全模塊附加到頁面事件,所以在Page_Load中我添加了:Page.RegisterRequiresViewStateEncryption();
我真的很想知道是什麼阻止了這個設置從IIS6 immediatley中獲取。當我在本地運行cassini時,如果通過頁面節點將viewStateEncryptionMode設置爲「Always」,我會立即看到它對viewstate進行編碼並呈現id =「__ VIEWSTATEENCRYPTED」的額外隱藏字段。當我將它設置爲「從不」時,我會立即看到加密關閉。如果我在我的IIS6託管網站上對網站進行相同的確切更改,它將不會立即生效,但如果我允許該設置停留在那裏,它最終會得到保留。我會停止/啓動www服務,重置IIS,清除ASPNET臨時緩存,但我不知道還有什麼要嘗試?希望這篇文章能夠ROT一段時間,未來有人會看到我經歷過的相同行爲,我們可以進一步弄清楚這一點!
原來,RegisterRequiresViewStateEncryption也打開ViewstateMAC驗證,即使我明確地在我的web.config中設置爲false。由於我的網站是一個自定義的「MVC」,位於WebForms之上,我有時在POSTS上重定向到不同的頁面,我無法進行MAC驗證。我在想,我的ViewStateMAC = false和ViewStateEncryption = true的web.config設置不是一個好的組合。 – felickz