我有一个我构建的 PHP AJAX json 登录表单。我已经有功能,如果您尝试失败超过 5 次,登录表单将被阻止。
但是如何拒绝未输入用户或未通过的快速登录尝试呢?
我的意思是在stackoverflow的登录系统中,当您快速单击登录按钮时,70% 的发往服务器的帖子都会被拒绝。
而且我不想在帖子之间进行延迟,只是在另一个帖子完成之前拒绝帖子。
那么拒绝快速点击登录帖子的最佳方法是什么?
您可以使用以下(示例)在服务器端工作的方法以及会话,以防止人们点击过快。
当前代码设置为最少 3 秒。
您可以将用于成功发布的代码放入else
条件中。
重要提示:如果您使用多个页面,则session_start();
需要在每个页面内,对于包含的文件也是如此。
目前设置为在一个文件中工作,使用action=""
<?php
session_start();
$_SESSION['start_time'] = time();
if (isset($_POST['submit'])) {
$current_time = time();
if (!empty($_POST['start_time'])) {
if (($current_time - $_POST['start_time']) < 3) { // 5 is number of seconds differential; change as you sit fit
// someone/something has submitted this form in under 5 seconds from reaching the page
// probably a bot
echo "Sorry, too fast";
exit;
}
else {
$fname = $_POST['fname'];
$fname = ucwords($fname);
echo "Thank you $fname";
}
}
}
?>
<form action="" method="post">
<input type="hidden" name="start_time" value="<?php echo $_SESSION['start_time']; ?>"/>
<!-- other form fields -->
<input type="text" name="fname">
<input type="submit" name="submit" value="Submit" />
</form>
如果您想在上一个帖子完成之前拒绝帖子
我建议在会话中存储发布状态值
因此,当发布帖子时,此状态将更改为指示其忙的值
如果有人在完成之前尝试发布,他们会从服务器收到一条消息,表明它很忙。
我不确定你是如何实现的,但这更像是解释这个想法的伪代码。
<?
if($_SESSION['busy'] == true){
$_SESSION['busy'] = true;
//PHP POST HANDLER CODE HERE
$_SESSION['busy'] = false;
//RETURN JSON FOR RESULT OF LOGIN ATTEMPT
}
else
{
//RETURN JSON FOR BUSY STATUS
}
?>