Prevention against CSRF?



我经常使用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不是设计用来做这些事情的吗?还是我用错了?

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

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

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

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

https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_事件_备忘单

最新更新