1

今天我了解到,在服务器场上,我不能使用validationKey="AutoGenerate",而是为 指定一个“固定”字符串值validationKey,以确保场服务器处理请求的一致性。给出的例子是:

<machineKey  
validationKey="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75D7
               AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281B"           
decryptionKey="ABAA84D7EC4BB56D75D217CECFFB9628809BDB8BF91CFCD64568A145BE59719F"
validation="SHA1"
decryption="AES"
/>

我的印象是,为每个请求和每个用户生成一个新密钥大大增强了安全性,但如果密钥是恒定的,它会从表单上的隐藏字段中检索并用于伪造请求。

或者我必须在服务器场上停止使用隐藏字段作为此键,而是使用标头或 cookie 吗?

我说防伪密钥存储在表单中,因为这个 Razor 标记:

@Html.AntiForgeryToken()

呈现此 HTML:

<input name="__RequestVerificationToken" type="hidden" value="bH6_-oZcRMuC9tA13RrOzmr0N3sWrzgkjKOhg2igHs5K2-G0HbJbF3KaK-QMrUDcQTXFbHJ-HFMNn9AjvF-TkAuBFo5f8Afi8q0OHXBzOTI1">

除非我们在这里讨论不同的键,但那将如何工作?

4

1 回答 1

3

不,这不是安全风险。

自动生成的密钥不会在表单的隐藏字段中发送,它存储在服务器上的本地安全机构 (LSA) ( ref ) 中。如果密钥以表单形式发送,则无需在多个服务器上拥有相同的密钥。也不需要检索密钥来伪造请求,您可以在请求中发送您想要的任何密钥。

使用自动生成,服务器不会为每个请求生成一个新密钥,它会为服务器(或者如果使用该IsolateApps选项,则为应用程序)生成一个密钥。它只是为每个请求生成的消息身份验证代码 (MAC)。

于 2015-09-07T17:04:03.313 回答