【问题标题】:Hitting the Button More Than Once - PHP多次点击按钮 - PHP
【发布时间】:2012-04-05 21:03:30
【问题描述】:

在我的 cmets 系统中,我发现了一个小的安全漏洞。在加载页面所需的几秒钟内,用户可以多次单击“发布”按钮将多个 cmets 提交到数据库而不是一个。我设法用一个简单的 Javascript 输入禁用东西来解决这个问题,但后来我记得人们可以使用 Firebug 或 Inspect Element 轻松编辑它。

是否有某种 PHP 解决方案来解决这个问题?我很新,所以请不要说技术性的话。

谢谢。 :)

【问题讨论】:

标签: php mysql sql forms


【解决方案1】:

最简单的解决方案是将所有数据存储在一个会话中,您需要确定该评论是唯一的。只要用户留在您的网站上,一个 php 会话就处于活动状态,另一个访问者将有另一个会话。这意味着,要确定您的访问者是否点击了两次按钮,您只需要 a) 消息和 b) 她/他评论的帖子(我假设)。

一个例子:

session_start();

// This is something you already have, sort-of
$message = $_POST['message']; // Message from user
$post    = $_GET['id']        // Id of post to which he commented

if (isset($_SESSION['message']
 && isset($_SESSION['id']
 && $message === $_SESSION['message']
 && $post === $_SESSION['id'])
{
  // We found out the user has already posted this
  echo 'Error: you clicked twice!';
  exit;
}

// Process message here as you already do

// Store now this just posted message in a session
$_SESSION['message'] = $message;
$_SESSION['id']      = $post;

使用这种方法,您可以确定没有数据在服务器中保存两次。但是,您仍然需要使用 javascript 禁用该按钮,因为只要您的请求正在进行,您就无法使用 php 禁用该按钮。

【讨论】:

  • 如果用户能够绕过禁用按钮,我认为他也将能够从请求中删除会话 ID,从而使所有基于会话的用户跟踪无用。
  • 非常感谢!工作完美。我也对超快的回复感到惊讶。看来我会经常使用这个网站!
  • @Sirko,我已经用我在网上找到的反会话劫持代码解决了这个问题。
  • @TerryHarvey 我不是在谈论劫持会话,而是在没有任何会话的情况下提交评论。不过,不知道您的应用是否可以做到这一点。
  • 不,不是。不过感谢您的建议。 :)
【解决方案2】:

您可以在单击时隐藏按钮并使另一个假按钮可见。

【讨论】:

  • 这仍然依赖于浏览器——你永远不能相信它。
【解决方案3】:

没有办法从服务器端禁用该按钮。客户端正在提交多个请求,这些请求由网络服务器单独执行,为每个请求创建一个新线程。您需要检查用户是否已经提交了评论 - 一种方法是首先检查数据库中该线程/该帖子中的最后一篇文章,如果用户已经发布了您的请求 - 或者只是呈现目标页面而不执行查询。

【讨论】:

    【解决方案4】:

    您可以在评论旁边记录一些内容以识别用户,例如 IP 并允许每条评论(例如 5 分钟和 IP),同时丢弃该 IP 提交的任何其他评论。

    【讨论】:

    • IP 或用户,取决于系统
    • @safarov 评论系统可能首先绑定了注册帐户。在这种情况下,您将有一个 UserId 来引用评论的来源。 Ip 只是识别唯一用户的一种简单方法,还有很多其他方法可以对特定用户进行指纹识别。
    【解决方案5】:

    你可以使用 session 来存储最后评论的内容和时间。我想这就是 Wordpress 的做法。

    所以寻找

    session_start()
    $_SESSION
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多