小编典典

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

ajax

因此,我对PHP文件有了一个基本的.ajax()POST方法。

我需要什么安全措施?

周围有几篇文章提到使用隐藏的MD5输入字段,您可以通过AJAX发送该字段并在PHP文件中进行验证。这足够好吗?


阅读 287

收藏
2020-07-26

共1个答案

小编典典

CSRF的风险在于,外部站点可能会将数据发送到您的站点,而用户浏览器会自动将身份验证cookie与它一起发送。

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

有两种方法可以执行此操作,但是建议的方法是在请求中添加令牌,您可以检查令牌,而黑客无法访问令牌。

最简单的说:

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

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

与令牌有关的所有事情是, 您可以预测 (并验证)令牌, 而黑客则不能

因此,最简单的方法是生成长而随机的内容并将其存储在数据库中,但是您可以构建加密的内容。我不仅会使用MD5用户名-
如果CSRF攻击者弄清楚了如何生成令牌,那么您将被黑客入侵。

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

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

2020-07-26