我创建了脚本。来源 -
控制器 -
public function action_index() {
session_start();
$_SESSION['token'] = rand();
if (isset($_GET['do']) and $_GET['do'] == 'comment') {//Ja viss kārtībā, turpinam
var_dump($_POST['token']);
var_dump($_SESSION['token']);
if ($_SESSION['token'] == $_POST['token']) {
echo 'ok';
}
else{ echo 'error'; }
查看 -
<form action="?do=comment" class="form-komentaram" method="post" style="margin: 7.5px;">
<input type="text" name="name" required="required" placeholder="Tavs vārds..." /><br />
<input type="text" name="homepage" placeholder="Tava mājaslapa..." /><br />
<input type="hidden" name="artcl_id" value="<?php echo $article['id']; ?>" />
<input type="hidden" name="token" value="<?php echo $_SESSION['token']; ?>" />
<textarea name="text" required="required"></textarea><br />
<input type="submit" value="OK!" required="required" />
</form>
使用var_dump我看到,$ _SESSION ['token']在页面加载时发生了变化。 例如,我在输入字段中提交令牌并重新加载页面以检查令牌,但是在页面重新加载之前$ _SESSION ['token']是23456,而$ _POST ['token']是23456,但在页面重新加载$ _SESSION ['令牌之后']是12345.为什么?
答案 0 :(得分:1)
因为每次加载页面时都会为其分配一个随机值。
$_SESSION['token'] = rand();
然后你将它作为一个隐藏的输入回应。 “/&gt;
因此,下次提交表单时,它将具有回显值。
如果您想为会话分配一次,请执行以下操作:
if (!$_SESSION['token']) {
$_SESSION['token'] = rand();
}
答案 1 :(得分:1)
根据您发布的代码,每次调用action_index()时,$ _SESSION ['token']都将替换为新值。应该做的事情如下:
if (!array_key_exists('token', $_SESSION)) {
$_SESSION['token'] = rand();
}
然后对action_index()的任何后续调用都不会覆盖您的会话令牌值。
答案 2 :(得分:0)
$_SESSION['token'] = rand();
您明确更改了$_SESION['token']
。
答案 3 :(得分:0)
$_SESSION['token'] = rand();
在此处使用会话时,您首先要将$_SESSION['token']
设置为随机值。因此,每次使用代码时,值都会有所不同。 (或者,至少,非常可能会有所不同。)
您可能希望在为其分配随机值之前检查值,或者在会话从代码中的其他位置开始而不是在每个页面加载时分配随机值。