将$_POST变量与令牌一起使用意味着什么


What is meant by using $_POST vars with a token?

我读到了一些PHP PDO数据净化的文章,然后看到了这篇文章:

PDO&消毒日期/删除HTML

我相信我的代码使用PDOStatement bindParam来防止SQL注入,但是我读到了的评论(转述)

"将$_POST与代币一起使用将有助于避免CSRF"

我很好奇,代币是什么意思,我该如何实现它?

令牌可能是某种哈希,您可以将其存储在会话中,也可以通过表单发送。在验证表单数据之前,请检查是否:

  1. 已发送令牌,并且
  2. 令牌存储在会话中

简单实现:


<?php
  session_start();
  if(!isset($_SESSION['token']))
  {
    $_SESSION['token']=uniqid();
  }
?>
<form method="post">
    <input name="token" type="hidden" value="<?php echo $_SESSION['token'];?>">
    <input name="something"  value="some data to send">
    <input type="submit">
</form>
<?php
  if(isset($_POST['something']))
  {
    if(!isset($_POST['token']) || $_POST['token']!==$_SESSION['token'])
    {
      echo 'missing a valid token';
    }
    else
    {
      echo 'got a valid token, I will use the data';
    }
  }
?>