在我的表单中,我有一个保存在会话中的令牌,并且在提交表单时必须存在:
$token = hash('sha256', rand() . microtime() . $_SERVER['REMOTE_ADDR']) // rand as possible
$_SERVER['token'] = $token;
现在我有一个隐藏值的形式:
<input type="hidden" name="token" value="<?php echo $token;?>">
当我提交此表单时,我会检查它是否与会话中的令牌匹配:
if ($_POST['token'] !== $_SESSION['token'])
{
// show error here
}
else
{
//carry on normally
}
但是,如果用户填写表单不正确,会发生什么?我无法在会话中再次更改令牌,因为已经发送了输出。你有什么建议?
答案 0 :(得分:0)
我建议您不要发送任何输出,只要您没有准备好标题,会话等。您可以在请求结束时生成输出,或者(如果无法使用第一个解决方案)查看手册“输出缓冲”。
答案 1 :(得分:0)
即使输出已发送,您也可以在会话中更改内容。在发送内容后,您无法启动会话,但是一旦您发送了会话标题(这应该是您做的第一件事之一),您就可以在会话中修改数据在请求期间的任何时间。