2011-01-30 81 views
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函数并将成员重定向到同一页面来阻止该问题。有没有可能解决这个问题,而不重定向成员?

回答

2

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

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

如果您正确执行此操作,则还会使您的应用程序证明为csrf攻击。

0

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