kor*_*esh 5 php mysql security csrf
如何防止用户自动发帖/垃圾邮件?
这是我的方式,为每个页面请求新的php会话,它有自己的限制,没有multitabing.
我为每个页面使用了新会话来防御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
?>
Run Code Online (Sandbox Code Playgroud)
ajax.php?ID = 123
<?php
if($_SESSION['token'] == $_GET['token']){
echo 'MYSQL INSERT stuff';
}else{
echo 'Invalid Request';
}
?>
Run Code Online (Sandbox Code Playgroud)
一切正常,直到用户在另一个选项卡上打开page.php?id = 456,ajax在ajax.php上返回'invalid request'?id = 123 这与我问的另一个问题有关.他们建议一直只使用一个会话哈希,直到他/她注销 - 只有会话重新生成.如果令牌是相同的,则USER可以简单地绕过它并执行自动攻击.有什么想法吗?
无论如何,你是如何防止自动AJAX攻击的?
PS:
听起来您反对只要浏览器打开就让会话保持打开状态是自动攻击的问题。不幸的是,在每个页面加载时刷新令牌只能阻止最业余的攻击者。
首先,我假设我们正在讨论专门针对您的网站的攻击。(如果我们谈论的是那些只是四处游荡并提交各种表格的机器人,这不仅不会阻止他们,而且还有更好、更简单的方法来做到这一点。)如果是这样的话,我的目标是我的网站,这是我的机器人会做的事情:
(或者,如果我对您的系统进行了足够的调查,我会意识到,如果我在每个请求中包含“这是 AJAX”标头,我可以永远保留一个令牌。或者我会意识到该令牌是我的会话 ID,并且发送我自己的PHPSESSIDcookie。)
这种在每次页面加载时更改令牌的方法绝对无法阻止那些真正想要攻击您的人。因此,由于代币对自动化没有影响,所以重点关注它对 CSRF 的影响。
从阻止 CSRF 的角度来看,创建一个令牌并维护它直到用户关闭浏览器似乎就完成了所有目标。简单的 CSRF 攻击被击败,用户能够打开多个选项卡。
TL;DR:在每个请求上刷新一次令牌并不能提高安全性。追求可用性并在每个会话中执行一个令牌。
然而!如果您非常担心重复的表单提交(无论是意外还是其他原因),这个问题仍然可以轻松解决。答案很简单:将两个令牌用于两个不同的工作。
第一个令牌将保持不变,直到浏览器会话结束。该令牌的存在是为了防止 CSRF 攻击。该用户使用此令牌提交的任何内容都将被接受。
第二个令牌将为加载的每个表单唯一生成,并将存储在打开表单令牌的用户会话数据的列表中。该Token具有唯一性,一旦使用即失效。该用户使用此令牌提交的内容将被接受一次且仅一次。
这样,如果我打开表单 A 的选项卡和表单 B 的选项卡,每个选项卡都会有我个人的反 CSRF 令牌(已处理 CSRF)和我的一次性表单令牌(已处理表单重新提交)。这两个问题均得到解决,且不会对用户体验产生任何不良影响。
当然,您可能会认为对于这样一个简单的功能来说,实现起来太多了。无论如何,我认为是这样。无论如何,如果你想要的话,就存在一个可靠的解决方案。