我是否需要jQuery .ajax()的CSRF令牌?

时间:2012-02-01 02:25:37

标签: jquery ajax security post csrf

所以我有一个PHP文件的基本.ajax()POST方法。

我需要哪些安全措施?

一些帖子提到使用您通过AJAX发送并在PHP文件中验证的隐藏MD5输入字段。这是一个足够好的方法吗?

4 个答案:

答案 0 :(得分:35)

CSRF的风险是外部网站可以向您发送数据,用户浏览器会自动发送身份验证cookie。

您需要的是接收操作(您的$.ajax()方法将POST数据发送到)的某种方式,以便能够检查请求是否来自您网站上的其他网页,而不是外部网站

有几种方法可以做到这一点,但建议的方法是在您可以检查的请求中添加一个令牌,黑客无法访问。

最简单的方法:

  • 登录时,创建一个长的随机字符串标记并将其保存为用户。
  • 向包含令牌的$.ajax()请求添加参数。
  • 根据请求检查令牌是否与您为用户保存的令牌相匹配。
  • 如果令牌不匹配,则表示您有CSRF黑客攻击。

黑客无法访问您的数据库并且无法实际读取您发送给用户的页面(除非他们受到XSS攻击,但这是另一个问题)因此无法欺骗令牌。 / p>

令牌的重要性在于您可以预测(并验证)它以及黑客无法

由于这个原因,生成一些长而随机的东西并将其存储在数据库中是最容易的,但你可以建立一些加密的东西。我不会只是MD5用户名 - 如果CSRF攻击者弄清楚如何生成你的令牌你将被黑客入侵。

另一种方法是将令牌存储在cookie(而不是数据库)中,因为攻击者无法读取或更改您的cookie,只是让它们被重新发送。然后,您就是HTTP POST数据中的令牌匹配cookie中的令牌。

你可以使这些变得更加复杂,例如每次成功使用时都会改变的令牌(防止重新提交)或特定于用户和动作的令牌,但这是基本模式。

答案 1 :(得分:2)

就请求伪造而言,客户端如何发送请求并不重要。与任何其他类型的帖子一样,相同的CSRF规则适用于ajax帖子。

我建议您阅读CSRF prevention cheat sheet。使用每用户秘密令牌是最常见的保护形式。

答案 2 :(得分:0)

不需要令牌,但您仍应保护任何根据CSRF更改状态的功能。

执行此操作的一种简单方法是添加随AJAX请求一起发送的标头。不需要随机令牌。

这是因为:

  • HTML表单无法由攻击者添加自定义标头。
  • 如果未启用CORS,则无法跨域传递自定义标头。

当然,服务器端代码需要确保在执行其操作之前存在标头。

更多信息:What's the point of the X-Requested-With header?

答案 3 :(得分:0)

这是一个可以使用django尝试的简单演示:

在HTML页面上

{%block content%}
<form id="userForm">
{%csrf_token%}
  <input type="text" id="username" placeholder="User Name">
  <input type="password" id="password" placeholder="Password">
</form>
{%endblock%}

Java脚本代码

%(document).on('submit','#userForm',function(e){
   e.preventDefault();

 $.ajax({

    type = 'POST',

    url:'path/to/url',

    data:{
     username:$('#username').val(),
     password:$('#password').val(),
     csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken').val()
    },

   success:function(data){
       alert('Successfull');
   }
  });

});