【问题标题】:Stop a post from resending information阻止帖子重新发送信息
【发布时间】:2015-05-28 12:24:14
【问题描述】:

在此之前,我有一个question 被问到,我询问了一种方法来阻止帖子在提交时被重新发送。

社区给了我这个功能:

function cansend($token) {
    if(isset($_SESSION['token'])) {        
        if ($token == $_SESSION['token']){
            $continue = false;
        }
        else {
            $continue = true;
        }
    }
    else {
        $_SESSION['token'] = $token;
        $continue = true;
    }
    return $continue;
}

这是完美的,并且做了我需要的,但是,由于某种原因,这现在总是返回 true,并且不会停止再次发布该方法。

我的表格是这样的:

<?php
$token = rand();

if ($_POST) {
    if (isset($_POST['submit'])) {
        if (cansend($_POST['token'])) {
            print $_POST['textinput'];
        }
    }
}
?>

<form action="#" method="post">
    <input type="hidden" name="token" value="<?php echo $token ?>" />
    <input type="text" name="textinput" />
    <input type="submit" value="Submit" name="submit" />
</form>

我需要更改哪些内容以及在哪里再次进行这项工作?

编辑

实际代码:

$_SLIP = new BettingSlip();
if ($_SLIP->CanSend($_POST['token'])) {
    if (isset($_POST['creditAcc'])) {
        $_SLIP->SetUserBalance($_POST['id'], $_POST['amount'], 'in');
    }
    if (isset($_POST['setLimit'])) {
        $_USERMAN->setlimit($_POST['id'], $_POST['limit']);
    }
}
else {
    echo "Cannot resend the same information twice";
}

【问题讨论】:

  • 我会删除 if ($_POST) 包装器。它只是增加了不必要的复杂性。 if (isset($_POST['submit'])) 绰绰有余
  • 你破解了我给你写的代码吗? :(
  • 貌似每次页面加载都会生成$token
  • 不,是为了避免表单被提交两次。
  • @KevinNagurski,Epodax 是对的,我想说{ 如果会话令牌与表单令牌相同,则拒绝调用对象并传回false,否则如果设置且不等于,它允许发布,如果没有设置会话令牌,则将其设置为等于发布令牌并允许发布}

标签: php html post


【解决方案1】:

最简单的方法是在页面启动时创建一个随机值,并将其设置为会话和隐藏表单,就像您现在所做的那样。

<?php 
$_SESSION['token'] = $somerandom; //give the session token a random value
$token = $somerandom; //give the same value to the variable token
?>

接下来,您将令牌回显到一个隐藏的表单中,就像您已经在做的那样

<form action="#" method="post">
    <input type="hidden" name="token" value="<?php echo $token ?>" />
    <input type="text" name="textinput" />
    <input type="submit" value="Submit" name="submit" />
</form>

在处理表单中,您只需检查 $_SESSION 令牌是否与 $_POST 令牌相同。

if($_POST['token'] == $_SESSION['token']){
    //Do something
}

每次打开主页时,它都会更改会话变量。所以仍然包含旧令牌的帖子值将不再匹配新的会话令牌。

这在我看来更简单,不需要您为其创建函数。

【讨论】:

  • 我想要这个功能,因为我有很多页面我想停止重新发送,而且 sessiontoken 和 posttoken 将始终以这种方式相同,因为它们都设置为 $somerandom,因此,它永远不会发布信息,这不是我想要的,我希望它只发送一个帖子,而不是随后的重新提交。另外我希望帖子在提交后与会话匹配,这将删除
  • @samswift 如果有人使用我认为您试图阻止的旧帖子数据刷新页面,旧的 $_POST['token'] 仍将包含旧值,而 $_SESSION[ 'token'] 将包含一个新的令牌。编辑* 稍后我有时间时会为此添加一个函数
  • 这仍然存在这样一个问题,即如果旧的 post 令牌 = 1234,新的会话令牌可能等于 2345,这意味着比较将不起作用并在每次后续重新提交时重新发送数据
  • 1234 == 2345如何返回true? :/ 特别是如果你创建一个更大的随机值,它们可能是完全相同的字符串或极不可能
  • 因为 post 令牌 (1234) !== 会话令牌 (2345),所以函数应该返回 true
猜你喜欢
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
相关资源
最近更新 更多