1

我有这个脚本:

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

4

2 回答 2

2

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

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

如果您正确地实现了这一点,那么您还将使您的应用程序能够抵御 csrf攻击。

于 2011-01-30T12:12:08.910 回答
0

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

于 2011-01-30T12:14:10.577 回答