【问题标题】:PHP session token changes once I make a postedPHP会话令牌在我发布后更改
【发布时间】:2018-03-27 22:37:38
【问题描述】:

好的,看来有人已经遇到了这个问题,但我不知道答案将如何适用于我。我没有发现任何标签在我的编码中放错了位置。一旦我到达 index.php,我的令牌就设置好了,但它改变了它转到 validate.php。我早上让它工作,但后来又回来确保我做对了,所以我可以加载它,因此我的工作落后于计划,现在它不起作用。我使用 if(!isset(session)) set sec_token 在同一个 index.php 中进行了所有编码,但由于某种原因它停止了工作。然后我把它拆分成这些文件清理一下,还是不行。

我做错了什么,或者我怎样才能找到错误以防止这种情况发生? - 令牌更改是 - 我尝试了所有其他答案,但没有一个奏效。如果我能得到一些帮助,我会很高兴,提前谢谢你。

PHP session variable changes between pages

//index.php

<?php
session_start();

//在这个文件中我有 random_text();没有别的功能

require_once 'token.php';

//设置token变量

$token = random_text();

//会话现在将拥有令牌

$_SESSION['sec_token'] = $token;

//现在会显示token

echo $_SESSION['sec_token'];
?>

HTML 代码开始 -->

<!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 是我们验证令牌的地方。 -->

<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>

这是放置令牌的隐藏输入-->

<input type="hidden" name="token" value ="<?php echo $token; ?>">
</form>

</div>
</main>

<FOOTER>
</FOOTER>

</BODY>
</HTML>

//验证.php

<?php
session_start();

//这将再次回显令牌以确保保持不变。

echo $_SESSION['sec_token'];

//这里我们设置安全变量 $有效 = 假;

//这里确保设置了会话令牌和发布令牌

if(isset($_SESSION['sec_token']) && isset($_POST['token']))
{
if($_SESSION['sec_token'] == $_POST['token'])
{
$valid = TRUE;
}

//如果为 false 会破坏会话,如果你愿意,可以跳过。

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>");
}

//如果为真,那么它应该做交易!

elseif($valid == TRUE)
{
echo $_POST['info'].'<br>';
echo 'It Worked!'
}
}
}

【问题讨论】:

  • 将两个文件(整个)都发布到 pastebin 以便于调试。
  • 这是与所有三个 .php 文档的 pastebin 的链接 如果看到我看不到的东西,请告诉我。 link@Karlo Kokkak 我相信我提到过我是这样的,但它停止了工作。也尝试计数请求.. 我只得到一个.. 例如 1,2,3 如果我的令牌是由if(!isset($_SESSION['sec_token'])) set sec_token 生成的,我什至会放置其他位置,并且不知何故它会跳过它并仍然给我一个令牌值。我确保它全部被摧毁,但它仍然没有完成这项工作。 @Lotfio Lakehal
  • 将 index.php 替换为:pastebin.com/h3aFZPvv

标签: php session


【解决方案1】:

感谢你们两位对我的帮助,但我注意到我的计数大部分时间都是从 1 开始的,有时它会在到达页面时从 0 值开始。当它以 0 开头时,它工作得很好,但是当它以 1 开头时,就会弹出错误。但是从那里开始计数继续 1,2,3,4 ......但我也注意到在多次运行期间,会话的令牌在 1 计数之后根本没有改变。所以,这就解释了为什么How to properly add CSRF token 为此使用 else 语句。它是这种错误的捕手。因此,一旦您到达,如果页面上的计数不是 0,那么 else 就会捕获它。如果它是 0 你的第一个计数。然后它应该可以正常工作,并且 else 语句被忽略。所以,我只是去使用捕手。 “其他”

我更愿意真正知道为什么要从 1 开始计数,而不是从 0 开始......无论如何......无论如何,谢谢你,对不起你的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多