0

我在一页上有多个表单(〜30),有些带有文件上传。

每个表单都有自己的提交按钮。

结构是 bootstrap-tab 和 -collapsebox-design - 因此您可以在不重新加载的情况下更改选项卡并访问“控制面板”中的每个表单。

我尝试为所有表单运行“mysql注入我”(firefox插件),结果:

服务器响应错误 500。

没有改变任何东西,不得不等待 5 分钟,一切都好起来了。

我的问题是:如何防止快速自动/用户提交这些表单(服务器端)?这有可能吗?这样每个用户每 ~ 1 秒只能提交一个。

4

3 回答 3

1

为什么没有一个带有用户 ID 的 MySQL 表,并有一个名为 'last_submit' 的行,它是一个datetime.

每次用户提交内容时更新它。

然后让 PHP 检查他们最近没有提交过什么。

于 2013-11-11T08:06:05.713 回答
1
  1. 给用户一个会话
  2. 在会话中定义一个名为last-submit的变量,并将当前时间作为值。
  3. 当表单结果出现时:
    1. 检查上次提交的值是多少。
    2. 如果超过x秒前,则将时间保存为最后一次提交和响应。
    3. 如果小于x秒,则拒绝表单并分别回复。

如果要阻止机器人或脚本,请执行以下操作:

  1. 在表单中添加一个输入字段,将其命名为 _robo_trap_ 并通过将样式设置为 使其对人眼不可见display: none
  2. 当表单进来时,检查是否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 ...
    }
}

PS只是一个示例代码给你一些想法,我没有测试它。

于 2013-11-11T08:14:10.363 回答
0

您可以暂时禁用其他表单提交操作:

$(document).ready(function(){

    $(':input[type="submit"]').click(function(){

         var otherButtons = $(':input[type="submit"]').not($(this));
         otherButtons.prop('disabled', true);

         setTimeout(function(){
             otherButtons.prop('disabled', false);
         },
         1000); //disable for 1 second


    });

});

在服务器端,您可以进行重新提交检查,如下所示:PHP Avoid browser reposting $_POST on page refresh?

于 2013-11-07T13:49:51.563 回答