php - 如何防止自动 AJAX 攻击

标签 php mysql security csrf

如何防止 USER 自动发布帖子/垃圾邮件?

这是我的方式,每个页面请求都有新的 php session ,它有其自身的局限性,没有多任务。

我为每个页面使用新 session 来防御 CSRF 和自动攻击。假设我们有一个使用 AJAX 发布话题的论坛,并通过 PHP SESSION 对其进行了验证。

add_answer.php?id=123

<?php
if(!is_ajax()){// function that determines whether the request is from ajax (http header stuff)
$_SESSION['token'] = md5(rand());
}
//some ajax request to ajax.php?id=123
?>

ajax.php?id=123

<?php
if($_SESSION['token'] == $_GET['token']){
echo 'MYSQL INSERT stuff';
}else{
echo 'Invalid Request';
}
?>

一切正常,直到用户在另一个选项卡上打开 page.php?id=456,ajax 在 ajax.php?id=123 This is related to another question I asked 上返回“无效请求”。他们建议一直只使用一个 session 哈希,直到他/她注销——只有这样 session 才会重新生成。如果 token 是相同的,用户可以简单地绕过它并进行自动攻击。对此有什么想法吗?

无论如何您的方式如何防止自动 AJAX 攻击?

附言:

  1. 不要用验证码折磨用户。
  2. Google 未能向我展示这方面的有用信息。
  3. 将此视为挑战。
  4. 或者至少对专家的答案进行投票,您认为这样做的绝妙方法

最佳答案

听起来您反对只要浏览器打开就让 session 保持打开状态是自动攻击的问题。不幸的是,在每次页面加载时刷新 token 只会阻止大多数业余攻击者。

首先,我假设我们正在谈论专门针对您网站的攻击。 (如果我们谈论的是四处漫游并提交各种表格的机器人,这不仅不会阻止它们,而且还有更好更简单的方法来做到这一点。)如果是这样的话,我的目标是我的网站,这是我的机器人会做的:

  1. 加载表单页面。
  2. 读取表单页面上的 token 。
  3. 使用该 token 提交自动请求。
  4. 转到第 1 步。

(或者,如果我对您的系统进行了足够的调查,我会意识到如果我在每个请求中包含“这是 AJAX” header ,我可以永远保留一个 token 。或者我会意识到该 token 是我的 session ID,并发送我自己的 PHPSESSID cookie。)

这种在每次加载页面时更改 token 的方法绝对无法阻止那些实际上想要对您进行如此严重的攻击的人。因此,由于 token 对自动化没有影响,因此关注它对 CSRF 的影响。

从阻止 CSRF 的角度来看,创建一个 token 并维护它直到用户关闭浏览器似乎可以完成所有目标。简单的 CSRF 攻击被击败,用户能够打开多个选项卡。

TL;DR:在每次请求时刷新 token 一次不会提高安全性。追求可用性,每个 session 做一个标记。


但是!如果您非常担心重复的表单提交,无论是意外还是其他原因,这个问题仍然可以轻松解决。答案很简单:对两个不同的工作使用两个 token 。

第一个 token 将保持不变,直到浏览器 session 结束。此 token 的存在是为了防止 CSRF 攻击。此用户使用此 token 提交的任何内容都将被接受。

第二个 token 将为每个加载的表单唯一生成,并将存储在用户打开表单 token 的 session 数据列表中。此 token 是唯一的,一旦使用即失效。此用户使用此 token 提交的内容将被接受一次且仅一次。

这样,如果我打开一个标签到表单 A 和一个标签到表单 B,每个标签都有我个人的反 CSRF token (处理 CSRF)和我的一次性表单 token (处理表单重新提交) ).这两个问题都已解决,不会对用户体验造成任何不良影响。

当然,对于这样一个简单的功能,您可能会认为实现起来太多了。无论如何,我认为是的。无论如何,如果您需要,可靠的解决方案是存在的。

关于php - 如何防止自动 AJAX 攻击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4790005/

相关文章:

php - 如何调整研究的这个问题?

security - 部署组 - 您无权注册目标。请联系您的发布经理以授予权限

php - 如何限制/授权对 PHP 脚本的访问?

symfony - 动态更改 Symfony 投票策略

php - SLIM 3 中的存储库模式

php - 我如何使用php将Elasticsearch集成到mysql

php - 不支持的驱动程序 [mongodb] Laravel

php - 如何从 MySQL 列创建 php 数组?

php - 如何在 Laravel 5.3 中使用 Facebook 身份验证

mysql - 用于只读操作的快速类 SQL 数据库