等待30秒以便在PHP和MySQL上进行新操作?

Dom*_*oSL 2 php mysql

在我的网页中,用户填写了一个将信息发送到MySql数据库的表单.发送的数据输入之一是日期/时间,格式(我可以根据需要更改格式)date('l jS \of F Y h:i:s A');

因此,当用户提交表单时,我想检查实际时间/日期是否比发送的时间/日期多30秒,以便允许或不允许提交表单.谢谢!

Ric*_*uen 6

所以你有......

<form action="wtv.php" method="POST">
    <input type="hidden" name="date" value="<?php echo date('l jS \of F Y h:i:s A'); ?>" />
    <input type="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)

...当用户点击"提交"时,您想检查"日期"输入的值是否小于30秒之前?

你可以用Ken Keenan建议的东西做到这一点......但问题是你不能相信客户的输入.在您对jeroen的回答的评论中,您表明了一种意识到客户端脚本是不值得信任的,但这不仅限于脚本; 如果你真的需要这个是安全的,这样在请求之后30秒内没有人可以提交这个表格<form>,你必须做其他事情.

问题是服务器对"日期"输入的期望是可预测的; 如果我访问你<form>并打开Firebug甚至保存HTML文档并在记事本中打开它,我可以很容易地猜测如何更新,<input />以便我可以提交.

而是使用令牌.

随机生成一种唯一的随机ID并将其存储在会话或数据库中......

$unique = md5(uniqid()).md5(time()); // there are better ways to get a unique random ID
$_SESSION['tokens'][$unique] = time();
Run Code Online (Sandbox Code Playgroud)

然后包括令牌的(不是日期/时间!)<form>...

<form action="wtv.php" method="POST">
    <input type="hidden" name="token" value="<?php echo htmlentities($unique); ?>" />
    <input type="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)

...并在提交时检查该令牌的时间是否少于30秒.

<?php
    // partially borrowed from Ken Keenan's answer...
    if((time() - $_SESSION['tokens'][$_POST['token']]) > 30) {
        echo "Time's up!";
    } 
?>
Run Code Online (Sandbox Code Playgroud)