php - 在基于 AJAX 的应用程序中使用 token 防止 CSRF

标签 php security csrf phalcon

我在我的应用程序中使用 token 来防止 CSRF 攻击。但是这个应用程序是单页的,并且严重基于 AJAX,所以我需要找到一种方法来为单个页面中的 N 个操作提供有效的 token :

例如一个文档片段加载了 3 个可能的操作,每个操作都需要一个 token 才能正常工作,但服务器端一次只有一个有效 token ...

因为每个标记只是一个 encrypted nonce (值不是基于特定的形式),我想到了用这样的东西为每个 Action 自动分配 token :

  1. 应用程序拦截 AJAX 调用,并检查它是否是敏感操作(即删除用户)
  2. 在操作继续之前向服务器请求 token
  3. 生成 token ,然后添加到操作请求中
  4. 自请求包含有效 token 后执行的操作
  5. 对通过 AJAX 执行的任何后续操作执行相同的操作

我认为该方法不够有效,因为攻击者可以使用与我的应用完全相同的脚本(检索 token 并附加到请求)。

如何改进我的方法以有效抵御 CSRF 攻击?

附加信息:我的后端环境是 PHP/Phalcon并且标记是 generated using Phalcon .

最佳答案

比仅对 AJAX 使用 token 更简单的方法可能是检查只能出现在来自您自己域的 AJAX 请求中的 header 。

两个选项是:

Origin header 也可用于普通的 HTML 表单提交,您需要在处理表单提交之前验证它是否包含您自己站点的 URL。

如果您决定检查 X-Requested-With header ,您将需要确保将其添加到每个 AJAX 请求客户端(JQuery 将默认执行此操作)。由于此 header 不能跨域发送(未经您的服务器首先同意浏览器),检查它是否存在并设置为您自己的值(例如“XMLHttpRequest”)将验证请求是否不存在CSRF 攻击。

关于php - 在基于 AJAX 的应用程序中使用 token 防止 CSRF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23448007/

相关文章:

python - 手动CSRF验证

python - 为什么 Django 不在 Varnish 代理后面生成 CSRF 或 session Cookie?

php - 回调期间在类函数中调用外部对象

php - 查询连接 id 匹配且行存在的表

php - Laravel 如何通过用户 ID 获取关注者数量?

.NET 代码访问安全 : Useful or just overcomplicated?

php - Codeigniter 不显示页面

.net - 如何防止我的 .Net dll 被添加为引用?

android - 只允许移动应用程序向 Node.js 服务器发出请求?

Django Rest Framework 删除 csrf