保护您的 ASP.NET 应用程序免受黑客攻击 第三部分(跨站请求伪造)






4.86/5 (49投票s)
本文介绍什么是 CSRF 攻击以及如何防止 CSRF 攻击。
引言
这是我的系列文章“保护您的 ASP.NET 应用程序”的第三部分。在本文中,我将详细介绍跨站请求伪造 (CSRF) 的确切含义、攻击者如何利用它以及我们如何防止 CSRF 攻击。
背景
您可以从这里阅读我本系列的上一篇文章:
跨站请求伪造 (CSRF)
跨站请求伪造也称为一次点击攻击、海浪和会话骑行,缩写为 CSRF。CSRF 攻击是一种安全漏洞利用攻击,攻击者利用受害者浏览器中的受害者身份验证。
跨站请求伪造 (CSRF) 是一种攻击,其中恶意网站向用户当前已登录的易受攻击的网站发送请求。(定义来自 - ASP.NETt)。
此攻击能做什么?
- 它可以代表攻击者在受害者的浏览器中执行操作/代理请求。
它是如何被利用的?
- 电子邮件、任何网站或任何博客中的图片链接/任何链接。
- CSRF 可以通过跨站脚本来实现。
- 恶意网站可以利用您的身份验证执行操作。
1. 电子邮件或任何网站中的图片链接/任何链接
- 用户使用表单身份验证登录网站 www.examplewebsite.com。
- 服务器对用户进行身份验证,服务器的响应包含身份验证 cookie。
- 用户在未注销的情况下访问了恶意网站。该恶意网站可能包含恶意图片链接、向用户登录的站点发送 post 操作、恶意脚本或 Ajax 调用,这些内容对访问者完全隐藏。这就是 CSRF 攻击的“跨站”部分。

- 用户将单击图片或任何按钮(填写表单并单击提交),然后浏览器会愉快地将身份验证 cookie 发送给请求,因为 post 请求类似于 (www.examplewebsite.com/account/delete)。

- 请求将在服务器上以用户的身份验证身份运行,并可以执行用户允许执行的任何操作。
这种攻击很难被发现,并且当攻击者通过 AJAX 执行 post 操作时会变得更糟。受害者甚至不需要执行任何操作。此攻击甚至可以绕过 SSL,因为恶意用户也可以发送 HTTPS 请求,例如“https://examplewebsite.com/account/delete”。
2. XSS 也可以用于进行 CSRF 攻击
要了解 XSS 及其预防措施,请参阅我本系列的上一篇文章。
- 如果任何网站包含评论部分,恶意用户可以将脚本注入评论部分。
- 当已登录的管理员登录并访问包含恶意用户注入脚本的页面时,该脚本将被执行,结果将根据脚本执行操作。
脚本执行的结果是,ID 为四的用户将被删除。
如何防止 CSRF
适用于所有网站
- 确保您的 GET 请求仅用于检索数据/资源。
- 切勿对 GET 请求执行操作。HTTP 规范也指出不应对 GET 请求执行操作。(www.examplewebsite.com/account/delete/id=4)
POST
/PUT
/DELETE
也可以被伪造。为了防止这些,请使请求唯一且不可重复。
对于 ASP.NET Web Forms
ViewStateUserKey = Session.SessionID
,然后viewstate
将充当表单令牌。- 使用哈希和加密保护
SessionID
。 - 使用 SSL 防止
SessionID
和ViewState
被嗅探。 - 要么创建一个
BasePage
并将以下代码添加到其中,然后检查表单的ViewState
,并让所有页面继承自此基页。
ViewState
由 ASP.NET 可选维护,您可以选择性地在页面或任何控件上维护 viewstate
。Viewstate
可用作 CSRF 防御,因为攻击者很难伪造有效的 Viewstate
。伪造有效的 Viewstate
并非不可能,因为攻击者有可能获取或猜测参数值。但是,如果将当前会话 ID 添加到 ViewState
,那么每个 Viewstate
都会变得独一无二,从而免受 CSRF 攻击。
要在 Viewstate
中使用 ViewStateUserKey
属性来防止欺骗性的回发。在派生自 Page
的类中的 OnInit
虚拟方法中添加以下代码(此属性必须在 Page.Init
事件中设置)。
protected override OnInit(EventArgs e) {
base.OnInit(e);
if (User.Identity.IsAuthenticated)
ViewStateUserKey = Session.SessionID; }
以下将 Viewstate
与使用您选择的唯一值进行关联。
(Page.ViewStateUserKey)
这必须在 Page_Init
中应用,因为在加载 Viewstate
之前必须将密钥提供给 ASP.NET。自 ASP.NET 1.1 起就提供了此选项。[OWASP 参考资料]。
对于 ASP.NET MVC
- 使用
AntiForgeryTokens
。 - 使用 SSL 防止
AntiForgeryTokens
被嗅探。
基本上,这个令牌背后的思想是为表单生成一个令牌,并在服务器端执行操作之前验证此令牌。为了实现这一点,我们将在 ASP.NET MVC 的 View 中创建一个令牌,并在 MVC 的控制器操作中验证此令牌。
在 View 中生成令牌
在您的表单中使用 @Html.AntiForgeryToken()
来生成令牌。
@using (Html.BeginForm())
{
@Html.AntiForgeryToken();
<fieldset>
Select a file <input type="file" name="file" />
<input type="submit" value="Upload" />
</fieldset>
}
在您的控制器操作中验证令牌
在您的操作上使用 [ValidateAntiForgeryToken()]
。
我希望您喜欢这篇文章,希望它能帮助您使应用程序更安全。