65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (35投票s)

2015年5月25日

CPOL

2分钟阅读

viewsIcon

81170

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=" />

如需进一步阅读,请观看以下面试准备视频和分步视频系列。

© . All rights reserved.