gpt4 book ai didi

不同环境下的 PHP session 问题

转载 作者:行者123 更新时间:2023-11-29 13:57:41 24 4
gpt4 key购买 nike

我正在通过 session 传递用户变量。它在本地主机上工作正常,但一旦在网络服务器上它就会做一些奇怪的事情。

登录后, session 变量会正常工作......直到您单击大约三个页面,它突然变得“噗”!

注意“欢迎,乔丹。”,而不是“欢迎,.”,也在左上角。

session 功能: http://imageshack.us/photo/my-images/32/loggedins.png/

session 噗! http://imageshack.us/photo/my-images/515/loggedinno.png/

登录/创建 session 变量代码:

<?php
include_once 'gtheader.php';
if (!isset($_SESSION['user']))
{
if (isset($_POST['user']))
{
$user = sanitizeString($_POST['user']);
$pass = sanitizeString($_POST['pass']);
if (preg_match($txtMatch,$user))
{
if ($user == "" || $pass == "")
{
$error = "Please enter all required fields";
}
else
{
$query = "SELECT * FROM gtmembers WHERE user='$user'";
$result = queryMysql($query);
$rank = mysql_result($result, 0, 'rank');
if (!mysql_num_rows($result))
{
$error = "Username does not exist.";
}
else
{
$getPass = mysql_result($result, 0, 'pass');
$salt = substr($getPass, 0, 64);
$hash = $salt . $pass;
for ($i = 0; $i < 100000; $i++)
{
$hash = hash('sha256', $hash);
}
$hash = $salt . $hash;
if ($hash == $getPass)
{
if ($rank != "Banned")
{
$userLow = strtolower($user);
$_SESSION['user'] = $userLow;
$_SESSION['rank'] = $rank;
echo <<<_END
<script type="text/javascript">
window.location.href='index.php';
</script>
_END;
echo "Successfully logged in. Click <a href='index.php'>here</a> to continue.";
}

标题代码:

        <?php //gtheader.php
session_start();
include_once 'gtfunctions.php';
$loggedIn = FALSE;

if (isset($_SESSION['user']))
{
$user = $_SESSION['user'];
if ($user) echo "Current User: $user<br />";
else echo "Current User: None<br />";
$rank = $_SESSION['rank'];
$loggedIn = TRUE;
echo "is set SESSION['user']? Yes";
}
else echo "is set SESSION['user']? No";

echo "<div id='header'><a class='header' href='index.php'> <h1 id='headerTitle'>$appname</h1></a>";
if ($loggedIn == TRUE)
{
$query = "SELECT * FROM gtmessages WHERE recip='$user' AND status='0'";
$result = queryMysql($query);
if (mysql_num_rows($result) == 0) $num = "";
else $num = "[".mysql_num_rows($result)."]";
if ($rank == 'Owner' || $rank == 'Admin')
{
echo "Welcome, <a class='header' href='gtmembers.php?view=$user'>$user</a><a class='header' href='gtmessage.php'>$num</a>. [<a class='header' href='gtlogout.php'>Logout</a>] | <a class='header' href='gtadmin.php'>Admin</a><br />";
}
else
{
echo "Welcome, <a class='header' href='gtmembers.php?view=$user'>$user</a><a class='header' href='gtmessage.php'>$num</a>. [<a class='header' href='gtlogout.php'>Logout</a>]<br />";
}
}
?>

最佳答案

isset() 即使数组为空,也会返回 true。

您应该使用!empty()来代替。

更新还要确保服务器配置为以相同的方式存储变量。

更新2

    <?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
include_once 'gtheader.php';
if (empty($_SESSION['user'])){
if (!empty($_POST['user'])){
$user = sanitizeString($_POST['user']);
$pass = sanitizeString($_POST['pass']);
if (preg_match($txtMatch,$user)){
if (empty($user) || empty($pass)){
$error = "Please enter all required fields";
}else{
$query = "SELECT * FROM gtmembers WHERE user='".mysql_real_escape_string($user)."'";
$result = queryMysql($query);
$rank = mysql_result($result, 0, 'rank');
}
}
if (!mysql_num_rows($result)){
$error = "Username does not exist.";
}else{
$getPass = mysql_result($result, 0, 'pass');
$salt = substr($getPass, 0, 64);
$hash = $salt . $pass;
for ($i = 0; $i < 100000; $i++){
$hash = hash('sha256', $hash);
}
$hash = $salt . $hash;
if ($hash == $getPass){
if ($rank !== "Banned"){
$userLow = strtolower($user);
$_SESSION['user'] = $userLow;
$_SESSION['rank'] = $rank;
echo "<script type=\"text/javascript\">window.location.href='index.php';</script>";
echo "Successfully logged in. Click <a href='index.php'>here</a> to continue.";
}
}
}
}
}
?>

gtheader.php

    <?php //gtheader.php
session_start();
error_reporting(E_ALL);
ini_set("display_errors", 1);

include_once 'gtfunctions.php';
$loggedIn = FALSE;

if(session_id() == "")
{ session_start(); }

if(empty($_REQUEST['PHPSESSID'])){
$session_id = session_id();
} else {
$session_id = $_REQUEST['PHPSESSID'];
}

if (!empty($_SESSION['user'])){

//This is not safe at all. Someone could change the user to %
$user = $_SESSION['user'];

echo "Current User: $user<br />";
//This is not safe either. Someone could change their rank to Admin.
$rank = $_SESSION['rank'];

$loggedIn = TRUE;
echo "is set SESSION['user']? Yes";
} else {
$user = '';
$rank = '';
echo "is set SESSION['user']? No";
}

echo "<div id='header'><a class='header' href='index.php'> <h1 id='headerTitle'>$appname</h1></a>";
if ($loggedIn == TRUE){
//without filtering, someone could set the user to % which would return everyone from the DB.
$query = "SELECT * FROM gtmessages WHERE recip='".mysql_real_escape_string($user)."' AND status='0'";
//This is not a standard function so we're assuming it's set in gtfunctions.php
$result = queryMysql($query);
//Here you're only checking if this is set, not how many
if (empty(mysql_num_rows($result))){
$num = "";} else {
//If they trick your SQL statement into returning more than one...
$num = "[".mysql_num_rows($result)."]";
}
if ($rank == 'Owner' || $rank == 'Admin')
{
echo "Welcome, <a class='header' href='gtmembers.php?view=$user'>$user</a><a class='header' href='gtmessage.php'>$num</a>. [<a class='header' href='gtlogout.php'>Logout</a>] | <a class='header' href='gtadmin.php'>Admin</a><br />";
} else {
echo "Welcome, <a class='header' href='gtmembers.php?view=$user'>$user</a><a class='header' href='gtmessage.php'>$num</a>. [<a class='header' href='gtlogout.php'>Logout</a>]<br />";
}
}
?>

您需要使用 Firefox 中的 Firebug 之类的工具来检查 header 并查看它是否向您传递 session 的 cookie,或者 session 是否仅存储在服务器端。此外,如果 session 是通过 GET 变量传递的。

人们对用户提供的信息(如 session )有很多盲目的信任。有人可能会劫持 session 或欺骗更高的用户名或排名。代码中没有检查用户等级是否设置正确。

我清理了 gtheader 下的一些 SQL 内容。同样,人们对直接传递给 SQL 的内容存在盲目信任。如果执行查询的 SQL 用户具有对表的写访问权限,那么您可能会遭受注入(inject)攻击。

关于不同环境下的 PHP session 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15582195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com