草庐IT

php - 如何防止自动 AJAX 攻击

coder 2023-10-05 原文

如何防止 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 - 如何防止自动 AJAX 攻击的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  4. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  5. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  6. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  7. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  8. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  9. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  10. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

随机推荐