【问题标题】:Passing token as GET variable将令牌作为 GET 变量传递
【发布时间】:2016-02-10 16:57:17
【问题描述】:

我有一个 Token 类和方法来获取和检查令牌。

如果我在链接中吐出一个新令牌:

<td><a href="users.php?delete=<?=$user['id'].'&token='.Token::generate();?>

这是类中的函数:

  public static function generate(){
    return $_SESSION['token'] = base64_encode(openssl_random_pseudo_bytes(32));
  }

如果就在该表的下方,我回显 $_SESSION['token'] 它会显示与链接中的完全不同的令牌。我很困惑。

编辑:这是页面的整个部分,显示了初始令牌的创建和回显:

<td><a href="users.php?delete=<?=$user['id'].'&token='.Token::generate();?>" class="btn btn-sm btn-default<?=(($user['id'] == $user_data['id'])?' disabled':'');?>" data-toggle="tooltip" title="delete user"><span class="glyphicon glyphicon-remove"</a></td>
            <td><?=$user['full_name'];?></td>
            <td><?=$user['email'];?></td>
            <td><?=clean_date($user['join_date']);?></td>
            <td><?php
                    if (new DateTime($user['last_login']) < new DateTime("2015-05-15 16:00:00")) {
                        echo 'Never';
                    } else {
                        echo clean_date($user['last_login']);
                    };?></td>
            <td><?=$user['permissions'];?></td>
        </tr>
    <?php endwhile ;?>
    </tbody>
</table>
<?=$_SESSION['token'];?>

还有here's a screenshot showing the two values are completely different

【问题讨论】:

  • 我们需要查看更多代码。
  • 你可能也在其他地方打电话给generate
  • @Flosculus 查看我的编辑
  • 您在 while 循环中调用 generate。因此,在每次迭代中,会话都会被覆盖。
  • 哦,哇,我是个大白痴。谢谢你……对不起!

标签: php


【解决方案1】:

我将假设您正在尝试创建一次生成单例,即生成一次的值,然后以相同的方式重新评估。

试试这个:

class Token
{
    public static function generate(){
        static $token;

        if (null === $token) {
            $_SESSION['token'] = $token = unpack('H*', openssl_random_pseudo_bytes(32))[1];
        }

        return $token;
    }
}

【讨论】:

  • 嗯,这似乎只是随机工作。我想知道这是否是base64编码的问题?也许有时令牌中存在不通过 GET 的非法字符?
  • @daninthemix 好吧,如果base64_encode 不起作用,请尝试unpack('H*', openssl_random_pseudo_bytes(32))[1];
  • @daninthemix 或者只是urlencode,取决于您的需要。
【解决方案2】:

似乎我只需要替换生成的令牌中的所有 + 符号:

$token = str_replace('+','p',$token);

编辑:这更好:

return rtrim(strtr(base64_encode($token), '+/', '-_'), '='); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2020-04-08
    • 1970-01-01
    相关资源
    最近更新 更多