什么是 CSRF 攻击以及如何在 MVC 中防止它?






4.60/5 (35投票s)
CSRF(跨站请求伪造)是一种攻击网站的方法,攻击者冒充或伪造一个受信任的来源,向网站发送数据。
CSRF 代表跨站请求伪造。所以如果你查看“伪造”的字典含义
“它指的是复制或模仿行为,例如在支票或官方文件上伪造签名,以欺骗权威机构获取经济利益。”
因此,当涉及到网站时,这种伪造行为被称为 CSRF(跨站请求伪造)。
CSRF 是一种攻击网站的方法,攻击者冒充或伪造一个受信任的来源,向网站发送数据。 网站会天真地处理这些信息,认为数据来自受信任的来源。
例如,考虑下面在线银行的界面。最终用户使用此界面进行转账。
下面是一个由攻击者创建的伪造网站,从外部看起来像一个游戏网站,但实际上它会访问银行网站进行转账。
伪造网站的内部 HTML 包含隐藏字段,这些字段包含账户号码和转账金额。
Win 1000000 US$ <form action="https://:23936/Genuine/Transfer"
method=post> <input type=hidden name="amount" value="10000" />
<input type=hidden name="account" value="3002" />
<input type=submit value="Play the ultimate game" />
</form>
现在,假设用户已登录到真实的银行网站,攻击者将此伪造的游戏链接发送到他的电子邮件。最终用户认为这是一个游戏网站,点击了“玩终极游戏”按钮,恶意代码会在内部执行转账过程。
因此,可以通过使用令牌来正确解决此问题。
- 最终用户浏览到转账界面。在提供界面之前,服务器会将一个秘密令牌注入到 HTML 界面中,以隐藏字段的形式。
- 从现在开始,当最终用户发送请求时,他必须始终发送该秘密令牌。该令牌将在服务器上进行验证。
在 MVC 中实现令牌是一个两步过程
首先,在操作上应用“ValidateAntiForgeryToken
”属性。
[ValidateAntiForgeryToken]
public ActionResult Transfer()
{
// password sending logic will be here
return Content(Request.Form["amount"] +
" has been transferred to account "
+ Request.Form["account"]);
}
其次,在 HTML UI 界面中,调用“@Html.AntiForgeryToken()
”来生成令牌。
Transfer money <form action="Transfer" method=post>
Enter Amount <input type="text" name="amount" value="" />
Enter Account number <input type="text" name="account" value="" />
@Html.AntiForgeryToken() <input type=submit value="transfer money" /> </form>
因此,从现在开始,当任何不受信任的来源向服务器发送请求时,它将显示以下伪造错误。
如果你查看 HTML 的源代码,你将找到带有密钥的隐藏验证令牌字段。
<input name="__RequestVerificationToken" type="hidden"
value="7iUdhsDNpEwiZFTYrH5kp/q7jL0sZz+CSBh8mb2ebwvxMJ3eYmUZXp+uofko6eiPD0fmC7Q0o4SXeGgRpxFp0i+
Hx3fgVlVybgCYpyhFw5IRyYhNqi9KyH0se0hBPRu/9kYwEXXnVGB9ggdXCVPcIud/gUzjWVCvU1QxGA9dKPA=" />
如需进一步阅读,请观看以下面试准备视频和分步视频系列。