如何防止自动 AJAX 攻击

2023-11-24

如何防止用户自动发帖/垃圾邮件?

Here is my way这样做时,每个页面请求都会有新的 php 会话,这有其自身的局限性,没有多选项卡。

我为每个页面使用了新会话来防御 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 上返回“无效请求”这与我问的另一个问题有关。他们建议始终只使用一个会话哈希,直到他/她注销为止——只有那时会话才会重新生成。如果令牌是同一个用户,则可以简单地绕过它并进行自动攻击。对此有什么想法吗?

无论如何your way防止自动 AJAX 攻击?

PS:

  1. 不要用验证码折磨用户。
  2. 谷歌未能向我展示对此有用的东西。
  3. 将此视为一个挑战。
  4. 或者至少对专家的答案进行投票,您认为这是做到这一点的绝妙方法

听起来您反对只要浏览器打开就让会话保持打开状态是自动攻击的问题。不幸的是,在每个页面加载时刷新令牌只能阻止最业余的攻击者。

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

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

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

这种在每次页面加载时更改令牌的方法绝对无法阻止实际上的人wanted如此严重地攻击你。因此,由于代币对自动化没有影响,所以重点关注它对 CSRF 的影响。

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

TL;DR:在每个请求上刷新一次令牌并不能提高安全性。追求可用性并在每个会话中执行一个令牌。


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

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

第二个令牌将为加载的每个表单唯一生成,并将存储在打开表单令牌的用户会话数据的列表中。该Token具有唯一性,一旦使用即失效。该用户使用此令牌提交的内容将被接受一次且仅一次。

这样,如果我打开表单 A 的选项卡和表单 B 的选项卡,每个选项卡都会有我个人的反 CSRF 令牌(已处理 CSRF)和我的一次性表单令牌(已处理表单重新提交)。这两个问题均得到解决,且不会对用户体验产生任何不良影响。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何防止自动 AJAX 攻击 的相关文章

随机推荐

  • iPhone/桌面应用程序的相同代码库

    我有一个 iPhone iPad 应用程序 我想将其移植到 MacOSX 我的大多数目标 C 类只要不包含 UIKit 内容就应该可以正常工作 显然 界面会有所不同 在 Xcode 中执行此操作的最佳方法是什么 开始一个全新的项目 添加新目
  • 如何在按键时获得本地化字符?

    我需要得到本地化字符 on keypress事件 例如 在捷克语键盘上 我需要输入 而不是 5 个字符 键码 53 请参阅捷克语键盘布局 有没有其他方法来获取字符而不使用文本输入和读取值 换句话说 有什么方法可以从事件对象中获取符合当前用户
  • 如何显示从 axios 请求返回的图像(React)?

    我正在使用 React 开发一个谷歌地图项目 我为 onClick 处理程序分配以下方法 getStreetView lat lng let url https maps googleapis com maps api streetview
  • 如何在onKeyPress期间获取输入文本框的文本?

    我试图在用户输入文本时获取文本框中的文本 jsfiddle游乐场 function edValueKeyPress var edValue document getElementById edValue var s edValue valu
  • 如何从 docker 容器“avahi 浏览”?

    我正在运行一个基于 ubuntu 14 04 的容器 并且我需要能够使用avahi browse在里面 然而 env root 8faa2c44e53e opt cluster manager avahi browse a Failed t
  • PDO PHP bindValue 不起作用

    我知道这个问题已经被问了 1000 次了 但出于某种原因 我继续用头撞墙 这有效 sql SELECT a eventCode a eventTime a teamCode a playerCode b lastName b firstNa
  • 将 ImageView 中的图像保存到设备图库

    我正在尝试将图像从 ImageView 保存到设备库 我试过这段代码 代码编辑 URL url new URL getIntent getStringExtra imageURL File f new File url getPath ad
  • 为什么第二个 for 循环总是比第一个循环执行得快?

    我试图弄清楚 for 循环是否比 foreach 循环更快 并使用 System Diagnostics 类来计时任务 在运行测试时 我注意到我放在第一个循环的执行速度总是比最后一个循环慢 有人可以告诉我为什么会发生这种情况吗 我的代码如下
  • 我的 javascript 文件中的 Laravel 4 Blade 语法

    我的主页有一些内联 javascript 与一些刀片语法混合在一起 例如 它一直有效 直到我想将 javascript 移动到外部 file js 每当添加刀片语法时我都会出错 有没有办法可以在我的 javascript files js
  • 为什么在推导类型时会删除模板参数的限定符?

    在使用 Microsoft VisualStudio 2008 构建一个小示例程序时 我注意到传递给模板的类型推导有一个奇怪的事情 考虑这个例子 template
  • 在 C 中, (x==y==z) 的行为是否符合我的预期?

    我可以比较如下三个变量 而不是这样做if x y y z z x 如果所有三个变量具有相同的值 则应执行 if 语句 这些是布尔值 if debounceATnow debounceATlast debounceATlastlast deb
  • 在 Swing 中的组件顶部进行绘制?

    我有一个JPanel添加到JViewport 并且该面板还添加了几个其他面板 我正在尝试实现一种拖动选择 您可以通过拖动鼠标来选择多个组件 我面临的唯一问题是选择矩形被绘制在添加到主组件的组件后面JPanel 我怎样才能在它们上面画画 我的
  • Powershell 彩色目录列表在格式范围内不正确

    我从这里得到了这个彩色目录脚本http tasteofpowershell blogspot com 2009 02 get childitem dir results color coded html function ls regex
  • JPA 和 JSON 运算符本机查询

    我试图让这个查询在 JPA 中工作 SELECT FROM contrat WHERE contrat json gt nom hever 它完美地与postgresql但是当我将它与JPA集成时 出现以下错误 该位置 1 的参数不存在 M
  • 给定 N 个生成器,是否可以创建一个在并行进程中运行它们并生成这些生成器的 zip 的生成器?

    假设我有 N 个生成器gen 1 gen N其中每个都会产生相同数量的值 我想要一台发电机gen这样它就可以在 N 个并行进程中运行 gen 1 gen N 并产生 next gen 1 next gen 2 next gen N 这就是我
  • 静态 HttpClient 仍在创建 TIME_WAIT tcp 端口

    我在 NET Framework 4 5 1 4 6 1 和 4 7 2 中的 HttpClient 中遇到了一些有趣的行为 由于 TCP 端口使用率高的已知问题 我建议在工作中的项目中进行一些更改 以便在每次使用时不处理 HttpClie
  • C++ 异常:抛出 std::string

    当我的 C 方法遇到奇怪的事情并且无法恢复时 我想抛出异常 可以扔一个吗std string指针 这就是我期待做的事情 void Foo Bar if QueryPerformanceTimer m baz throw new std st
  • 投影球体的半径

    我想完善一个上一个问题 如何将球体投影到屏幕上 2 给出了一个简单的解决方案 approximate radius on screen CLIP SPACE world radius cot fov 2 Z with fov field o
  • 相对于容器以百分比宽度定位固定元素

    我知道position fixed使元素相对于视口而不是它的offsetParent但是我有一个问题 我有一个侧面元素需要x空间量 然后是一些固定位置标题元素 我想占用剩余视口宽度的一定百分比 参见小提琴 http jsfiddle net
  • 如何防止自动 AJAX 攻击

    如何防止用户自动发帖 垃圾邮件 Here is my way这样做时 每个页面请求都会有新的 php 会话 这有其自身的局限性 没有多选项卡 我为每个页面使用了新会话来防御 CSRF 和自动攻击 假设我们有一个使用 AJAX 发布线程的论坛