1. 程式人生 > >解決視圖狀態消息驗證代碼 (MAC) 錯誤

解決視圖狀態消息驗證代碼 (MAC) 錯誤

box library rdquo 主機 cli 加密算 虛擬主機 head cti

https://blog.csdn.net/bingtingabc/article/details/49148745

2015年10月15日 10:05:56 bingtingabc 閱讀數:3397

什麽是視圖狀態?

視圖狀態是指在 ASP.NET 應用程序的 WebForms (.aspx) 頁面中往返的信息。__VIEWSTATE 字段的 HTML 標記如下所示:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="..."/>
例如,可以將按鈕控件的文本存儲在 __VIEWSTATE 字段中。如果用戶單擊該按鈕,則 Button_Click 事件處理程序將能夠從視圖狀態字段中提取該按鈕的文本。有關 ASP.NET 視圖狀態的更詳細概述,請參閱 Microsoft Developer Network (MSDN) 網站上的 ASP.NET 視圖狀態概述主題。

由於 __VIEWSTATE 字段包含用於在回發時重建頁面的重要信息,因此請確保攻擊者無法篡改此字段。如果攻擊者提交惡意的 __VIEWSTATE 負載,則攻擊者可能會誘騙應用程序執行本不會執行的操作。

若要避免此類篡改攻擊,可以使用消息驗證代碼 (MAC) 來保護 __VIEWSTATE 字段。回發時,ASP.NET 會驗證與 __VIEWSTATE 負載一起提交的 MAC。在 Web.config 文件中,應用程序 元素中指定了用於計算 MAC 的密鑰。由於攻擊者無法猜測 <machineKey> 元素的內容,因此也就無法在試圖篡改 __VIEWSTATE 負載時提供有效的 MAC。ASP.NET 會檢測到有效的 MAC 沒有提供,並拒絕此惡意請求。 _________________________________________________________________________________________________________ 按照MSDN的標準說法:“對密鑰進行配置,以便將其用於對 Forms 身份驗證 Cookie 數據和視圖狀 態數據進行加密和解密,並將其用於對進程外會話狀態標識進行驗證。”也就是說Asp.Net的很多加密, 都是依賴於machineKey裏面的值,例如Forms 身份驗證 Cookie、ViewState的加密。默認情況下, Asp.Net的配置是自己動態生成,如果單臺服務器當然沒問題,但是如果多臺服務器負載均衡, machineKey還采用動態生成的方式,每臺服務器上的machinekey值不一致,就導致加密出來的結果也不一 致,不能共享驗證和ViewState,所以對於多臺服務器負載均衡的情況,一定要在每臺站點配置相同的 machineKey。
------------------------------------------------------------------------------------
  查下MSDN就明白了,validationKey和decryptionKey的默認值是AutoGenerate,由系統隨機生成密鑰 ,如果在本地或者使用的是獨立主機通常不會有什麽問題,但是使用虛擬主機,一臺服務器上有多個虛擬 主機存在時就會出現以上問題,MSDN中也特別指出不能在群集中使用 AutoGenerate應該指定固定的密鑰 值,至此真相水落石出,立刻在web.config中添加關於machineKey的配置項,並手動設置其中的密鑰值, 這裏請註意,不同加密算法對於密鑰的最大字符長度是不同的,在這裏能夠使用的有AES,DES,3DES, SHA1,MD5,我只知道DES的密鑰字符長度為16,3DES長度為48,手動設置時密鑰長度必須等於其最大長度 ,否則會出錯!至於密鑰的16進制值可以隨便輸入。 參考的matchineKey配置: <system.web>
<machineKey validation="3DES" validationKey="319B474B1D2B7A87C996B280450BB36506A95AEDF9B51211" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A87" decryption="3DES"/>
</system.web>
方案二 <pages validateRequest="false"/>改為: <pages enableEventValidation="false" viewStateEncryptionMode ="Never" /> 自我分析: 要麽是兩臺服務器的文件不一致 添加上machineKey 後就可以解決訪問的是同一個程序 <machineKey validationKey="90C28AC11E1522312CC38F3C650F8429C6C6F9C1CF0ADEE230911763106B0E" decryptionKey="9231F8824A9F9F1601B510F93D084A78B05BAA2907F3E723" decryption="3DES" validation="SHA1"/>

解決視圖狀態消息驗證代碼 (MAC) 錯誤