我是否需要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标题有什么意义?