【问题标题】:It doesn't return true when I am comparing my csrf token to the session token当我将我的 csrf 令牌与会话令牌进行比较时,它不会返回 true
【发布时间】:2019-05-27 09:41:16
【问题描述】:

我正在尝试使用随机令牌并将其存储为会话,然后将其放置在隐藏的输入文本中,该文本将发送到我的处理页面。如果两个令牌都匹配,则将处理表单,但是当回显两个令牌时,它们确实匹配,但在实时服务器上,它不匹配......

我尝试同时使用 !== 和 != 符号,但即使两个标记相同,它仍然无法匹配它们..

我已将此代码放在我的主表单部分。这是我的代码的一部分,因为我的表单有点太长了

$_SESSION['token'] = bin2hex(random_bytes(32));

<br></br>
         <input type="hidden" name="csrf" value="<?php echo $_SESSION['token']; ?>">
         <button type="submit" name="submit">Sign up</button>
      </form>


This is part of my processing form:

 $csrf = strip_tags($_POST['csrf']);



      // information from memberships' table

       $subscriptionplan = strip_tags($_POST['subscriptionplan']);

       $pricing_level1 = strip_tags($_POST['pricing_level1']);
       $pricing_level2 = strip_tags($_POST['pricing_level2']);
       $pricing_level3 = strip_tags($_POST['pricing_level3']);

       // referral information

       $referral = strip_tags($_POST['referral']);


       if(hash_equals($csrf, $_SESSION['token'])) {

                                              header("Location: ../signup.php?signup=wrongtoken");
                                              exit();
                                            } else {

【问题讨论】:

  • 这看起来像您为每个请求生成一个 new 会话令牌。所以表单生成和表单处理请求不同。
  • 我可能在这里感到困惑,但也许有人可以在这里帮助我......这行代码:if(hash_equals($csrf, $_SESSION['token'])) {
  • 我们是否正在检查它们是否匹配?如果是这样,我想如果他们匹配,我只是重定向了用户!
  • 傻我!我应该使用... if(!hash_equals($csrf, $_SESSION['token']){}
  • 我应该使用以下哪一项来随机生成字符串? base64_encode(openssl_random_pseudo_bytes(32));

标签: php forms session


【解决方案1】:

我敢打赌,您忘记将表单提交类型设置为 post。任何 HTML 表单的默认提交类型,如果未设置,则为 get,因此要么将其设置为 post,要么将值分配给来自 $_GET[...] 超级全局变量,而不是 $_POST[...]。

【讨论】:

    猜你喜欢
    • 2023-01-24
    • 1970-01-01
    • 2019-02-27
    • 2020-02-10
    • 1970-01-01
    • 2012-09-01
    • 2021-10-23
    • 2014-03-19
    • 2013-07-18
    相关资源
    最近更新 更多