繁体   English   中英

php防止使用会话重新提交表单

[英]php prevent form resubmission using sessions

所以我试图防止使用会话重新提交表单,这是我的代码:

<?php
session_start();
if(isset($_GET['unid']))
{
    if ($_GET['unid']==$_SESSION["uid"])
    {
        echo "Form is Submited do something";
    }
    else
    {
        echo "no you can't do that";
    }
}
$unid = md5(uniqid());
$_SESSION["uid"] = $unid;
?>
<form method="GET">
    <input name="name" value="test">
    <input name="unid" value="<?php echo $unid;?>">
<input type="submit">

并且可以正常工作...但是,如果用户打开另一个选项卡,它将中断,那么我该如何解决呢?

我不确定这一点,但可能会分配一个新的全局会话变量,例如$_SESSION['checkSub'] 因此,一旦提交表单,请将其设置为1true ,如果不是1false ,则仅让表单提交。

您可以在生成新的唯一ID之前检查是否在unid中设置了unid 请参阅下面的更新代码:

<?php
    session_start();
    if(isset($_GET['unid']))
    {
        if (isset($_SESSION['unid']) && $_GET['unid']==$_SESSION['unid'])
        {
            //form has been submitted with matching unid - process it as needed
            unset($_SESSION['unid']);
        }
        else
        {
            // Form was resubmitted or some other logic error
        }
    }
    $unid = ''; //declare here for good scope
    if (isset($_SESSION["unid"])) {
            $unid = $_SESSION["unid"];
    }
    else {
            $unid = md5(uniqid());
            $_SESSION["unid"] = $unid;
    }
    ?>
    <form method="GET">
        <input name="name" value="test">
        <input name="unid" value="<?php echo $unid;?>">
    <input type="submit">

与其使用表单方法GET ,不如尝试使用POST 它将为您工作。 $_POST数组仅在提交表单时才包含数据,因此您不必使用会话来了解是否提交了表单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM