我在一页上有多个表单(~30),其中一些带有文件上传。
每个表单都有自己的提交按钮。
结构是 bootstrap-tab 和 -collapsebox-design - 因此您可以更改选项卡而无需重新加载并访问“控制面板”中的每个表单。
我尝试对所有表单意外地运行“mysql Inject me”(firefox插件),结果:
服务器响应错误 500。
没有改变任何东西,等了 5 分钟,一切又恢复正常了。
我的问题是:如何防止快速自动/用户提交这些表单(服务器端)?无论如何这可能吗?因此每个用户每约 1 秒只能提交一个。
最佳答案
- 向用户提供 session
- 在名为 last-submit 的 session 中定义一个变量,并将当前时间作为值。
- 当表单结果出现时:
- 检查最后提交值是多少。
- 如果超过x秒前,则将时间保存为最后提交并分别响应。
- 如果少于x秒,则拒绝该表单并分别回复。
如果您想阻止机器人或脚本,请执行以下操作:
- 向表单添加一个输入字段,将其命名为 _robo_trap_ 并将样式设置为
display: none
使其对人眼不可见。 - 当表单进来时,检查
robo_trap
是否有任何值或其默认值是否已更改。如果是,则丢弃该表格,因为人类看不到也不需要填写该表格。
例如:
<?php
/* User Session */
session_start();
/* Current Time */
$now = new DateTime();
/* First Time ... */
if ( empty($_SESSION['last-submit']) ) {
$_SESSION['last-submit'] = $now;
}
/* On Form Submit ... */
if ( !empty($_POST) ) {
/* How fast?! */
$gap = now->diff( $_SESSION['last-submit'] );
$gap = $gap->format('%s');
if ( $gap > 1 ) {
// good ...
$_SESSION['last-submit'] = $now;
} else {
// bad ...
}
}
附注只是一个示例代码,给您一些想法,我没有测试它。
关于php - 一张表单上有多个表单 "page"- 多次提交 "block",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19837001/