首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP会话值因页而异

PHP会话值因页而异
EN

Stack Overflow用户
提问于 2011-02-08 16:16:58
回答 5查看 6K关注 0票数 0

我做了一个自定义的登录脚本,它工作得很好。然而,在它重定向到主页之后,$_SESSION‘’username‘值被更改为'root',而不管它之前有什么值。其中'root‘是我的数据库登录的用户名。

我必须手工输入所有这些,所以它可能有一两个明显的错误-

main_login.php ( sidebar.php上的php include_once,包含在每个页面上)

代码语言:javascript
复制
    <?php
    if(!isset ($_SESSION["username"])){ 
?>

<!-- Simple login form action="checklogin.php" method="post"-->

<?php
}else{
?>

<!-- Table to display welcome user, and logout link -->

checklogin.php:

代码语言:javascript
复制
session_start();
$db_name = "database";
$tbl_name = "users";

mysql_connect("localhost","root","password") or die("Cannot connect to SQL server");
mysql_select_db("$db_name")or die("Cannot select database.");

$username = $_POST['username'];
$password = $_POST['password'];

$username = stripslashes($username);
$password = stripslashes($password);
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);
$password = md5($password);

$sql = "SELECT * FROM $tbl_name WHERE username = '$username' and password = '$password'";
$result = mysql_query($sql);

$count = mysql_num_rows($result);

if($count == 1){
$_SESSION["username"] = $username;
$_SESSION["password"] = $password;
header("location:login_success.php");
}
else{
echo "<script type='text/javascript'>\n";
echo "setTimeout('redirect();',2000);\n";
echo "function redirect(){\n";
echo "window.location = 'index.php';\n";
echo "}\n";
echo "</script>\n";
echo "Wrong Username or Password";

login_success.php:

代码语言:javascript
复制
<?php
session_start();
if(!isset($_SESSION['username'])){
header("location:index.php");
}else{
session_regenerate_id();
}
// Apply permissions - problem existed before all of this code

mysql_connect("localhost","root","password") or die("Cannot connect to database.");
mysql_select_db("database") or die("Cannot select database.");

$username = $_SESSION['username'];

$query = "SELECT * FROM users WHERE username = '$username'";
$result = mysql_num_rows($result);

mysql_close();

$_SESSION['username'] = mysql_result($result,0,'username');
$_SESSION['permissions'] = mysql_result($result,0,'permissions');
?>

<html>
<head>
<script type="text/javascripnt">
setTimeout("redirect();",4000);
function redirect(){
window.location = "index.php";
}
</script>
</head>
<body>
Login Successful.
<?php echo "Welcome ".$_SESSION["username"].".";
var_dump($_SESSION); // var_dump reveals that $_SESSION['username'] is still the login name.
?>
</body>
</html>

一旦它经历了整个过程,一切都是好的。但是,当它重定向到index.php时,$_SESSION‘’username‘现在是'root’。

我想看看是否有人知道为什么会发生这种情况(这样我就可以理解问题并防止它在未来发生),并有一个可以实现的修复方法。

谢谢大家。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-02-08 16:19:59

答案很简单:

您的应用程序中有一些代码将$_SESSION‘’username‘值更改为'root’。

你必须调查你的代码并找到那个地方。没什么大不了的

票数 2
EN

Stack Overflow用户

发布于 2011-02-08 16:23:10

这部分看起来很奇怪:

代码语言:javascript
复制
$query = "SELECT * FROM users WHERE username = '$username'";
$result = mysql_num_rows($result);

mysql_close();

$_SESSION['username'] = mysql_result($result,0,'username');
$_SESSION['permissions'] = mysql_result($result,0,'permissions');

试试这个:

代码语言:javascript
复制
$query = "SELECT * FROM users WHERE username = '$username'";
$result = mysql_query($result);


$_SESSION['username'] = mysql_result($result,0,'username');
$_SESSION['permissions'] = mysql_result($result,0,'permissions');
msql_close();
票数 2
EN

Stack Overflow用户

发布于 2011-02-08 17:02:55

为什么要在login_success.php上再次设置$_SESSION‘’username‘变量?您在check_login.php上设置了这些变量,对吗?

下面是我要做的

在login_success.php上,打印您的会话变量以查看发生了什么。我几乎可以保证您的sql查询发生了一些事情。设置一个条件,以确保您确实得到了结果。

代码语言:javascript
复制
print_r($_SESSION);

if(!$_SESSION['username']) die('no session user name');

$query = "SELECT * FROM users WHERE username = '$username'";
$result = mysql_query($result);

if(mysql_num_rows($result) == 1){
    $_SESSION['username'] = mysql_result($result,0,'username'); //why do you need this?
    $_SESSION['permissions'] = mysql_result($result,0,'permissions');
    mysql_close(); 
}
else die('no user found');

另外,在您的checklogin页面上,更改if语句以查找$_SESSION‘’username‘中的实际变量。不仅仅是设置了该变量,我还尽量避免使用isset()。

看在上帝的份上,不要存储纯文本密码,实现一个安全的密码散列方案不需要任何成本。利用php的crypt()函数非常容易,也可以查看一下这是一个开源的安全方法。http://www.openwall.com/phpass/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4930879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档