[英]I don't understand PHP sleep() behavior
我有这样的形式:
<form method="post" action="secret.php">
<label for="pw">Password: </label><input type="password" name="pw" id="pw" />
</form>
这是secret.php:
<?php
if(isset($_POST["pw"])) {
if($_POST["pw"] == "hello") {
echo("<strong>Good pw.</strong><br />");
} else {
echo("<strong>Bad pw.</strong><br />");
echo("<a href=\"form.php\">Back</a>");
sleep(5);
}
} else {
header("Location: /tut/first/form.php");
}
?>
如果密码错误,它会在显示Bad pw之前休眠。 当我提交表单时,它会在表单页面上睡5秒钟,然后更改页面并显示Bad pw。 为什么?
发生的事情是您正在使PHP脚本进入睡眠状态。 在将结果发送回客户端(浏览器)之前,脚本必须完成。*因此,在响应客户端它不是一个好密码之前,您要使脚本花费5秒钟。
既然你不想在这里避免蛮力的情况,我会建议这样的事情:
<?php
if(isset($_POST["pw"])) {
if($_POST["pw"] == "hello") {
echo("<strong>Good pw.</strong><br />");
} else {
echo("<strong>Bad pw.</strong><br />");
echo("<script type=\"text/javascript\">");
echo ("setTimeout(function() {");
echo ("window.location = form.php;"); //might need a more complete URL here
echo ("}, 5)"); //sleep for 5 seconds before redirecting
echo("</script>");
sleep(5);
}
} else {
header("Location: /tut/first/form.php");
}
?>
* 输出实际上是在PHP脚本中写回来发回的,但是在缓冲的情况下,除了头文件和非常大的页面之外,你看不出这有什么区别。
你需要研究输出缓冲,尽管从我看来,逻辑是有缺陷的。
这可能有所帮助
如果您想立即向浏览器回显某些内容,请在要将输出缓冲区刷新到浏览器时尝试执行flush()
。 此外,您可能需要禁用可能干扰输出缓冲的压缩(如gzip)。
然而,话虽如此,你说这完全错了。 用户必须做的就是打开另一个选项卡/刷新,服务器将再次验证登录信息,因此执行sleep()
不会产生您认为的效果。
我实际上设计了类似于此的东西,这就是我所做的:
创建一个名为failed_logins的数据库表,另一个名为login_bans,两者都基于IP地址。 每次用户提供不正确的信息时,请在failed_logins表中添加一个条目。 您想要做的是对其进行分层,以便在第一次登录后,用户被禁止5秒,在第二次登录后,它会在一定时间内(例如说2小时)达到15秒和3或更长时间被禁止禁止45秒。 这一切都是在服务器端完成的,因此用户无法绕过禁令。 因此,每次访问页面时都必须检查其IP,以查看其IP是否已被禁止。
然后在客户端显示一个倒计时器,其中包含禁令中剩余的秒数并禁用提交按钮。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.