避免因页面刷新而提交的最佳方式

2022-08-30 16:50:47

我认为这个问题经常发生在Web应用程序开发中。但我会尝试详细解释我的问题。

我想知道如何纠正这种行为,例如,当我有这样的代码块时:

<?
    if (isset($_POST['name'])) {
        ... operation on database, like to insert $_POST['name'] in a table ...
        echo "Operation Done";
        die();
    }

?>

<form action='page.php' method='post' name="myForm">
    <input type="text" maxlength="50" name="name" class="input400" />
    <input type="submit" name="Submit" />
</form>

提交表单后,数据将插入到数据库中,并生成消息“操作完成”。然后,如果我刷新页面,数据将再次插入到数据库中。

如何避免此问题?任何建议将不胜感激,:)


答案 1

创建操作后不显示响应;改为在操作完成后重定向到另一个页面。如果有人刷新,他们正在刷新您重定向到的 GET 请求页面。

// submit
// set success flash message (you are using a framework, right?)
header('Location: /path/to/record');
exit;

答案 2

显示表单时,在会话中设置一个随机数,并将该数字放在隐藏字段中。如果发布的号码和会话号匹配,删除会话,运行查询;如果没有,请重新显示表单,并生成新的会话编号。这是XSRF令牌的基本思想,您可以在此处阅读有关它们及其安全性用途的更多信息:http://en.wikipedia.org/wiki/Cross-site_request_forgery

下面是一个示例:

<?php
session_start();

if (isset($_POST['formid']) && isset($_SESSION['formid']) && $_POST["formid"] == $_SESSION["formid"])
{
    $_SESSION["formid"] = '';
    echo 'Process form';
}
else
{
    $_SESSION["formid"] = md5(rand(0,10000000));
?>
    <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
    <input type="hidden" name="formid" value="<?php echo htmlspecialchars($_SESSION["formid"]); ?>" />
    <input type="submit" name="submit" />
</form>
<?php } ?>

推荐