【问题标题】:Multible forms on one "page" - Multible submit "block"一个“页面”上的多个表单 - 多个提交“块”
【发布时间】:2013-11-07 13:17:37
【问题描述】:

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

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

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

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

服务器响应错误 500。

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

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

【问题讨论】:

  • 您是否在此表单上进行了验证码验证?
  • 不,唯一的事情是:您必须登录。然后这是用户“控制面板”。一种解决方案是将标签更改为拥有“站点”,但是如果 oyu 想要更改标签,则必须重新加载……每个站点仍然会有大约 6-7 个表单……

标签: php mysql


【解决方案1】:
  1. 给用户一个会话
  2. 在会话中定义一个名为last-submit的变量,并将当前时间作为值。
  3. 当表单结果出现时:
    1. 检查 last-submit 值是多少。
    2. 如果超过x秒前,则将时间保存为last-submit并分别回复。
    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 ...
    }
}

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

【讨论】:

  • 谢谢,这应该会有所帮助。我已经在我的联系表中使用了“Ghostfield”。似乎有帮助。 lastsubmit-field 似乎是一个很好的解决方案。我会这样尝试。谢谢你好先生。
  • @idonteven 欢迎:)
  • 非常感谢。我会在 22 小时内接受它。可以自己完成脚本,但谢谢。问题是我的大脑;)不知道如何开始......
【解决方案2】:

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

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

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

【讨论】:

  • 将这样的东西存储在数据库中并查询每次都是矫枉过正,IMO。您可以通过用户会话简单地实现相同的目标。
  • 在 Users 表中添加一行并不过分。成员的最后一个活动是有用的信息。此外,由于问题的主要原因是安全性,我的方法意味着一个用户可以每 x 秒提交一份表单。如果他们只是使用不同的浏览器,您的方法允许一个用户每秒提交多个表单。
【解决方案3】:

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

$(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?

【讨论】:

  • 这不是我的意思...这不是问题 - 提交将由外部文件处理 - 用户只会收到成功或错误消息,并且他更新的选项卡将被重新加载。 ..他不能通过重新加载再次提交。编辑:我搜索的是服务器端解决方案 - js 解决方案可以轻松停用...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
相关资源
最近更新 更多