我一直在收集有关如何防止日志页面上的强力攻击或免受多个帐户创建的骚扰的信息。
我得出的结论(感谢 Stackoverflow 的你们)最好的方法是使用验证码。
但是难以阅读的验证码或重音字符可能会阻止用户使用网站。
因此,我找到了一个适合我的网站的易于使用的小脚本。这是一个简单的数学验证码,建议对从零到十的 2 个数字求和。它显示单词“一”“二”“三”……而不是数字。 我的问题是:
1)这个小验证码本身是否提供足够的安全性?
2)我的集成方式安全吗? (有什么方法可以绕过它吗?)
为了避免粘贴800行代码我做了一个总结,希望大家看得清楚。验证码脚本:
$n1 = mt_rand(0,10);
$n2 = mt_rand(0,10);
$fig = array('zero','one','two','three','four','five','six','seven','eight','nine','ten');
$result = $n1 + $n2;
$sentence = $fig[$n1] .' plus '.$fig[$n2];
$_SESSION['captcha'] = $result;
$captcha_label = "<label for='captcha' >How much does ".$sentence."make?</label>";
echo $captcha_label."</label><input type='text' name='captcha' value=''/><br />";
echo "<input type='submit' name='create' value='create account'>";
输入字段+验证码 => 测试
if($_POST['captcha'] != $_SESSION['captcha']){
$_SESSION['captcha_control'] = "false";
}
$_POSTS 都经过注入测试 如果其中任何一个或验证码返回“false”,脚本将转向=> Problem.php
test.php
非常感谢。
如果您打算使用自己的验证码,那就太过分了——它甚至不需要是随机的。只需要求用户输入一个常量单词(例如,“在此框中输入“橙色””)即可阻止绝大多数简单的垃圾邮件机器人。
$_SESSION['captcha'] = $result;
可能在确定您是否正在与合法用户打交道之前分配服务器端会话。这可能会让您面临 DOS 攻击,因为攻击者只需在会话超时窗口内创建大量唯一会话即可耗尽服务器上的存储空间。由于您依赖于模糊性,因此将答案存储在隐藏变量中(并将所有输入放入
<form>
标签内)也可以在不占用服务器端资源的情况下完成。
function solver(captchaText){
const nums = ["zero", "one", "two", "three", "four", "five", "six", "seven","eight", "nine", "ten"];
const stringnums = String(captchaText).split(" plus ");
var ans = 0;
stringnums.forEach(element => {
for (let i = 0; i < nums.length; i++){
if (nums[i] == element) ans += i;
}
});
return ans;
}