我有这个脚本:
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
功能并将成员重定向到同一页面来防止这种情况发生。是否可以在不重定向成员的情况下解决此问题?
答案 0 :(得分:2)
没有。您将执行post-redirect-get或后续刷新将向用户显示此对话框。
如果您选择不进行PRG,则需要以某种方式检测提交是否重复。一种简单的方法是使用随机散列/数字(例如称为令牌)注入隐藏参数。提交后,您必须检查您期望的令牌(您可能存储在http会话中的令牌)是否与其他POST参数一起发送。在有效提交时,您将删除/使此令牌无效。这样,当一个POST出现一个无法识别的令牌时,那么它很可能是一个重复或过时的请求。
如果你正确实现了这一点,那么你也可以使你的应用程序能够证明csrf次攻击。
答案 1 :(得分:0)
您可以在成功提交后设置一些会话变量。对于每次提交,您都要检查是否设置了变量,然后再插入数据。