【问题标题】:Prevent duplicate record insertion on refresh without redirecting在不重定向的情况下防止在刷新时插入重复记录
【发布时间】:2011-06-18 02:04:53
【问题描述】:

我有这个脚本:

if (isset($_POST['comment_posted'])) {
    $user_comment = mysql_real_escape_string($_POST['user_comment']);
    $add_user_comment = Event::addUserComment($id,$user->user_id,$user_comment);
}

用户提交评论并刷新页面后,系统会向他显示“您将重新发送帖子数据”警告。如果用户接受,它将重新插入用户评论。

我知道我可以通过使用 header 函数添加并将成员重定向到同一页面来防止这种情况。是否可以在不重定向成员的情况下解决此问题?

【问题讨论】:

    标签: php post http-post postdata


    【解决方案1】:

    没有。您将执行 post-redirect-get 或后续刷新将向用户显示此对话框。

    如果您选择不执行 PRG,您需要以某种方式检测提交是否重复。一种简单的方法是使用随机哈希/数字(例如称为令牌)注入隐藏参数。提交后,您必须检查您期望的令牌(您可能存储在 http 会话中)是否与其他 POST 参数一起发送。在有效提交时,您将删除/使此令牌无效。这样,当一个 POST 出现一个不可识别的令牌时,它很可能是一个重复或过期的请求。

    如果您正确实施此操作,那么您还将使您的应用程序能够抵御csrf 攻击。

    【讨论】:

      【解决方案2】:

      您可以在提交成功后设置一些会话变量。对于每次提交,您检查是否设置了变量,然后插入数据。

      【讨论】:

        猜你喜欢
        • 2012-08-17
        • 2011-04-13
        • 1970-01-01
        • 2020-02-03
        • 2016-08-24
        • 1970-01-01
        • 2020-04-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多