预防CSRF?

时间:2014-10-18 07:51:44

标签: javascript php jquery ajax 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不是设计用于这样的东西吗?或者我使用它错了?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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