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

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

我需要哪些安全措施?

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

CSRF的风险是外部站点可以向您发送数据,用户浏览器将自动发送身份validationcookie。

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

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

最简单的:

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

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

对令牌而言,重要的是你可以预测 (并validation)它, 而黑客则不能

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

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

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

在请求伪造方面,客户端如何发送请求并不重要。 与任何其他类型的post一样,相同的CSRF规则适用于ajaxpost。

我建议阅读CSRF预防备忘单 。 使用每用户秘密令牌是最常见的保护forms。

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

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

这是因为:

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

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

更多信息: X-Requested-With标题有什么意义?