防止在重定向时刷新重复记录

时间:2011-01-30 12:09:12

标签: php post http-post postdata

我有这个脚本:

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功能并将成员重定向到同一页面来防止这种情况发生。是否可以在不重定向成员的情况下解决此问题?

2 个答案:

答案 0 :(得分:2)

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

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

如果你正确实现了这一点,那么你也可以使你的应用程序能够证明csrf次攻击。

答案 1 :(得分:0)

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