好的,所以似乎有人已经有了这个问题,但我看不出答案如何适用于我。我的编码中没有发现任何标签错位。我到达index.php后设置了我的令牌,但它改变了它到validate.php。我让它在早上工作,但后来回到它,以确保我正确,所以我可以加载它,因为这个我落后于我的工作的时间表,现在它不起作用。我在同一个index.php中编码,使用 if(!isset(session)) 设置sec_token,但由于某种原因它停止工作。然后我将它拆分成这些文件以清除它,它仍然无效。
我做错了什么,或者如何找到防止这种情况发生的错误? - 令牌改变 - 我已经尝试了所有其他答案,但都没有奏效。如果我得到一些帮助,我会很高兴,谢谢你。
PHP session variable changes between pages
//的index.php
<?php
session_start();
//在这个文件中我有random_text();没有其他功能
require_once 'token.php';
//设置令牌变量
$token = random_text();
//会话现在将有令牌
$_SESSION['sec_token'] = $token;
//现在令牌将显示
echo $_SESSION['sec_token'];
?>
HTML CODE STARTS - &gt;
<!DOCTYPE HTML>
<HTML>
<HEAD>
<title>Token</title>
</HEAD>
<BODY>
<HEADER style="text-align:center;">
<h1>Token</h1>
</HEADER>
<main>
<div style="text-align:center;">
validate.php是我们验证令牌的地方。 - &GT;
<form action="validate.php" method="POST">
<h2>enter what ever</h2>
<input type="text" name="info"><br><br>
<button type="submit" name="test" style="display:inline-block;">Test
Token</button>
<div style="width:2.5%; display:inline-block;"></div>
以下是放置令牌的隐藏输入 - &gt;
<input type="hidden" name="token" value ="<?php echo $token; ?>">
</form>
</div>
</main>
<FOOTER>
</FOOTER>
</BODY>
</HTML>
// validate.php
<?php
session_start();
//这将再次回显令牌以确保保持不变。
echo $_SESSION['sec_token'];
//这里我们设置安全变量 $ valid = FALSE;
//这里确保设置会话令牌和发布令牌
if(isset($_SESSION['sec_token']) && isset($_POST['token']))
{
if($_SESSION['sec_token'] == $_POST['token'])
{
$valid = TRUE;
}
//如果为false则会破坏sesion,如果愿意,可以跳过此步骤。
if($valid == FALSE)
{
//取消设置所有会话变量。
session_unset();
如果希望终止会话,还要删除会话cookie。 注意:这会破坏会话,而不仅仅是会话数据!
if (ini_get("session.use_cookies"))
{
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]);
}
最后,销毁会话。
session_destroy();
$_SESSION = array();
exit("<h1>This Web-Site keeps track of IP Address, and attempts
against it!<br> An Alert has been Sent, and it will be investigated!
</h1>");
}
//如果为True,那么它应该进行交易!
elseif($valid == TRUE)
{
echo $_POST['info'].'<br>';
echo 'It Worked!'
}
}
}
答案 0 :(得分:0)
感谢你们两位帮助我,但是我注意到我的计数大部分时间是从1开始,偶尔它会在到达页面时以0值开始。当它以0开始计数时,它可以正常工作,但当它以1开始时,则会弹出错误。但是从那里继续计数继续1,2,3,4 ...但是我也注意到在多次运行期间,会话的令牌在1次计数之后根本没有改变。所以,这解释了为什么How to properly add CSRF token使用else语句。它是这种bug的捕手。所以一旦你到达,如果不是页面上的0计数,那么其他人会抓住它。如果是第一次计数为0。然后它应该工作得很好,else语句被忽略。所以,我刚刚使用了捕手。 “其他”
我更愿意真正知道为什么会去1计数,而不是从0开始...无论如何......无论如何谢谢你,抱歉你的时间。