为了模拟 CSRF,您不会在恶意代码中包含 cookie 或会话信息。CSRF 的全部意义在于执行的代码不知道您的会话或 cookie 信息。它只是假设浏览器会将其包含在对应用程序的请求中。
因此,为了测试,假设您有一个页面 Transfer.aspx,它接受一个 POST 方法和 txtFrom、txtTo 和 txtAmount 参数,并带有一个按钮 btnSubmit,并且您想尝试从帐户 1 转移到帐户 2。您的恶意代码可能是这样的:
<form action="http://www.mysite.com/Transfer.aspx" method="post">
<input type="hidden" name="txtFrom" value="1" />
<input type="hidden" name="txtTo" value="2" />
<input type="hidden" name="txtAmount" value="500" />
<input type="hidden" name="__VIEWSTATE" value="[PUT VIEWSTATE VALUE HERE]" />
<input type="hidden" name="__EVENTVALIDATION" value="[PUT EVENTVALIDATION VALUE HERE]" />
<input type="submit" name="btnSubmit" value="Go" />
</form>
您必须事先知道 viewstate 和 eventvalidation 的值是什么,所以当您正确登录时,您需要从您的页面复制它们。这假设您的视图状态是恒定的,无论用户或会话如何。
现在你有一个恶意页面。如果您在一个选项卡上登录,请在另一个选项卡中打开它并提交,如果您容易受到攻击,那么您的转移将发生。原因是属于 mysite.com 的 cookie 已发送,这意味着将使用您在另一个选项卡上活动的会话。
要解决此问题,您需要在帖子中包含一个唯一的每次会话值。这很容易通过使用 ViewStateUserKey 并将其设置为您的 ASP.NET 会话 ID 或它的哈希来完成。这将使您的 __VIEWSTATE 值在每个会话中都是唯一的,这意味着您将不再容易受到攻击,因为没有人可以预测您的 __VIEWSTATE 值将是什么。