【问题标题】:Using AntiCSRF with ajax将 AntiCSRF 与 ajax 一起使用
【发布时间】:2011-08-16 15:25:07
【问题描述】:
我已经安装了 AntiCSRF HTTPModule 但我需要将它与 ajax 一起使用。
令牌字段名称:RaiseException。
Cookie 名称:__CSRFCOOKIE。
我应该使用 ajax POST 手动发送令牌字段值还是还有其他事情要做?
而且由于我们在这里使用cookie,所以任何人都不能创建具有相同名称和相同值的cookie并将隐藏字段中出现的值发送到服务器并获取数据或对此有一些限制?!
谢谢
【问题讨论】:
标签:
c#
asp.net
jquery
csrf
【解决方案1】:
我不熟悉您正在使用的特定反 CSRF 模块。 ASP.Net 中内置了 anti-CSRF 支持,但它与 AJAX 有冲突。
大多数网站使用安全的仅 HTTP cookie 进行身份验证。所有浏览器都支持同源策略,这意味着只有创建 cookie 的站点才能访问它。
CSRF 攻击有效,因为黑客不需要查看 cookie,因为用户的浏览器会将它们与任何请求一起发送到您的站点。因此,黑客创建了一个向您的站点发送数据的表单:
<form action="yoursite.com/userAdmin/Create">
<input type="text" name="username" value="hackerUser" />
<input type="text" name="rights" value="godlike" />
...
</form>
黑客不是您网站的管理员,但他们可以欺骗正在为他们做事的用户。
大多数反 CSRF 保护以相同的方式工作:要求 POST 编辑的表单数据具有站点可以访问但黑客无法欺骗的附加令牌。
所以 .Net 的默认实现会添加一个带有标记的 cookie,隐藏输入中的相同标记,然后检查它们是否匹配。黑客看不到cookie,因此无法重现隐藏的输入。
这是 AJAX 调用的问题,原因有两个:
- .Net 将令牌生成为隐藏的输入标签,这意味着需要一些 Javascript 才能将其放入 AJAX 调用中。
- .Net 对令牌的检查假定它是一个表单输入,这意味着 JSON 调用以错误的格式传递它。
听起来您需要做的是将令牌字段名称的值手动添加到 AJAX 调用中,并确保您正在发送表单数据。