【问题标题】:Prevention against CSRF? [closed]预防 CSRF? [关闭]
【发布时间】:2014-12-13 18:35:55
【问题描述】:

我经常像这样使用AJAX写入MYSQL数据库

$.ajax({ 
    url: "writescript.php",
    type: "POST",
    data: { data : mydata,//this could be anything
     },
    success: function (html) {
      //do something
  }
});

writescript.php 看起来像这样

$data=$_POST["data"];
//and then write into database.

现在一切正常,但任何人都可以查看 ajax 请求,因为它是纯 JS 并且可以从页面源中查看。鉴于有关脚本名称和参数的信息,攻击者也可以尝试调用writescript 并写入我的数据库或根据脚本的功能进行读取。这显然不好。那么我在这里错过了什么吗? AJAX 不是为这些东西设计的吗?还是我用错了?

【问题讨论】:

    标签: javascript php jquery ajax csrf


    【解决方案1】:

    我认为这里没有出现 CSRF 问题。 CSRF 是指攻击者通过单击链接或任何其他方式诱骗合法且经过身份验证的用户访问页面,进而代表他们执行操作。如果您的应用程序检查标头以确保请求是来自浏览器的 ajax 调用,并且不允许跨域 ajax 请求,理论上攻击者无法执行 CSRF 攻击

    您提出的问题更多是授权问题。您担心攻击者可以对您的数据库进行写入/读取,但是任何合法用户都应该能够做到这一点,因此解决方案自然是添加一个身份验证层来抵御攻击者。

    【讨论】:

    • 当然,一旦你有了一个 auth/authz 系统,你就需要给它添加 CSRF 保护。
    • 我明白了,但有没有办法实现这一点,而不必区分黑白合法用户和攻击者。更详细地说,请求是来自外部来源还是来自我的应用程序本身。
    【解决方案2】:

    当用户请求页面时,在该页面上生成一个安全令牌并在服务器上记录它。然后返回响应,只需将收到的安全令牌与保存的安全令牌进行比较即可。

    https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet

    【讨论】:

      【解决方案3】:

      您缺少“会话”。您可以使用会话或任何其他身份验证方法来避免这种情况。也就是说,确保用户在 php 代码的开头登录。

      【讨论】:

        猜你喜欢
        • 2018-07-11
        • 2016-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-22
        • 2010-11-08
        相关资源
        最近更新 更多