我的问题是ASP.NET MVC 5,关于XSS / CSRF攻击。
ASP.NET MVC通过生成Anti Forgery Token来提供防止CSRF攻击的规定。
但此令牌只能用于POST请求。
根据我的测试团队防止CSRF攻击,每个请求都应该有一个令牌号,并且他们要求只有POST请求而不是单个GET请求。
所以我的问题是:
我们是否只需要POST请求以防止CSRF攻击?
我们如何通过GET请求生成和发送Anti Forgery Token?
答案 0 :(得分:2)
如果您有向用户显示信息的页面,则这些页面应为GET
方法。
GET
的例子: -
但是,如果某个网页对数据库进行了更改或进行了永久性更改(例如提交卡详细信息),则这些内容应为POST
。
POST
的例子: -
GET
)。如果您的网站针对每个操作使用了正确的方法,那么您只需要为POST
方法实施CSRF保护。但是,如果您不小心使用GET
应该使用POST
(例如注销),那么修复此问题就是沿着查询字符串传递CSRF令牌(例如www.example.com/UserAccount/Logout?token=12345
) - 建议改为POST
。
在这种情况下,您必须编写自己的代码来验证令牌,因为ASP.NET MVC ValidateAntiForgeryToken
仅适用于POST
个请求。请参阅此处how to make ValidateAntiForgeryToken work with GET
。
答案 1 :(得分:1)
无法使用get,POST,并且一个重要原因是HTTP GET应该 idempotent 并且它不应该更改应用程序中的任何行为,它应该只是用于获取数据。
因此,如果您要更改GET中的行为,请将其设为POST,然后您可以使用Anti Forgery Token。