我想知道是否有可能创建一个限制,如果用户已经提交了一次表单,php将不接受表单数据。那么我的客户想要的系统就像一个开放的系统。不需要用户注册,因此在他们可以再次提交表单之前,我无法使用会话技巧为每个用户设置10分钟的限制。
任何解决方案都将非常感谢。我不想对IP施加限制,因为许多用户使用共享IP。
答案 0 :(得分:1)
使用会话可以限制来自同一浏览器会话的其他表单提交。
以下内容并未检查“重复”字样。提交,在10分钟内提交多份文件。
如果您想检查重复的提交,可以将表单数据的哈希值与时间戳一起存储。
<?php
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$timestamp = isset($_SESSION['form_submitted_ts'])
? $_SESSION['form_submitted_ts']
: null;
if(is_null($timestamp) || (time() - $timestamp) > 10 * 60) {
if(process_data($_POST)) {
$_SESSION['form_submitted_ts'] = time();
echo 'Success!';
}
} else {
// Form submitted in last 10 minutes. Perhaps send HTTP 403 header.
die('Failure! (Form submissions are rate limited.)');
}
}
function process_data($data)
{
// Your code here...
return true;
}
?>
<form method="post">
<input type="submit" value="submit">
</form>
答案 1 :(得分:1)
使用sessions
是您问题的解决方案。
方式强>
session_start();
$_SESSION['user']['login_time'];
$_SESSION['time']['login_time'] = currentTime();
中
- &GT;请注意,currentTime()是获取当前时间的函数。if newtime - currentTime >= 10
_i会建议使用Javascript,因为它会减少服务器上的影响,并且它在浏览器上运行而不是服务器。使用JS也可以实现同样的目的,而且非常容易。
答案 2 :(得分:1)
您可以使用会话,自定义Cookie或发布/获取变量 - 您需要一种方法来存储他们已经提交过表单的内容,因此这些是您最好的选择。
最简单的方法是使用$ _SESSION - 我假设您启动会话并将其作为cookie写入用户(几乎是默认设置)。
您可以使用javascript并在提交时写一个cookie,您可以在PHP($ _COOKIE)中查看,并停止用户再次提交表单,您也可以在页面上的javascript中查看。
如果您使用Javascript制作cookie,则有人可以更改内容,但如果他们清除了存储$ _SESSION的cookie,除非您在GET和POST请求中传递它,否则同样如此。
您可以使用表单上的隐藏输入变量(GET / POST)来执行此操作,首次访问时会使用会话ID填充,如果您真的不想使用Cookie来存储会话,那么需要查看session_id()。这仍然是使用会话,但没有对cookie的依赖。