在代码编写器中防止对不属于表单的内容进行CSRF


Prevent CSRF on things which aren't part of forms in codeigniter

我知道Codeigniter有一个非常有用的安全类,可以防止CSRF/XSRF,如果你使用表单帮助器,但由于CI url结构调用了很多函数非常直接,我怎么能防止CSRF的东西,如/action/logout没有像SE有一个额外的确认表单?

我的想法:

  • 检查页面引用
  • 检查请求的MIME类型(甚至可能?)(对于图像CSRF如<img src="http://example.com/action/logout" />)
  • 使所有动作成为表单的一部分(不可取)
  • 在页面URL中包含CSRF令牌(丑陋和非常糟糕,用户喜欢复制和粘贴URL而不考虑存储的会话id或其他私人信息)

我不会费心保护像/account/view/1/cyclone/这样的东西,因为它不执行任何动作,最多只是浪费带宽。

当然,我知道有些人喜欢编写代码来自动化他们的网站使用,我尊重这一点,这就是为什么我要创建一个API来通过代码或自动执行操作。

作为一般规则,任何执行操作的表单请求都应该使用POST。对于所有其他的GET是允许的。使用POST肯定会有帮助。我相信您还可以将令牌作为表单中的隐藏字段,而不是URL中的丑陋字符串。至于检查请求的MIME类型,这是不可能的。做一个print_r($_SERVER),里面基本上是你从用户和服务器端得到的所有东西。