Изменение значения PHP-сессии от страницы к странице - PullRequest
0 голосов
/ 08 февраля 2011

Я сделал собственный скрипт входа, и он работает просто отлично.Однако после перенаправления на домашнюю страницу значение $ _SESSION ['username'] изменяется на 'root', независимо от того, какое значение оно имело до этого.«root» - это имя пользователя для входа в мою базу данных.

Я должен ввести все это вручную, чтобы он мог иметь явную ошибку или два -

main_login.php (phpinclude_once на sidebar.php, который включен на каждой странице)

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

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:

<?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'.

Я спрашиваю, есть ли у кого-нибудь идеи, почему это может происходить (так что я могу понять,проблема и предотвратить ее в будущем), и решение проблемы.

Спасибо всем.

Ответы [ 4 ]

2 голосов
/ 08 февраля 2011

эта часть кажется странной:

$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');

попробуйте это:

$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();
1 голос
/ 25 февраля 2016

Ну,

Ваш смысл комментария, вероятно, правильный, вы устанавливаете его как root, даже не осознавая этого. Я только что понял, что после 2 часов поиска и устранения неисправностей я этим и занимался!

Независимо от того, что я пытался, $ _SESSION ['username'] менялось с реального имени пользователя на 'root'.

Я наконец понял, что $ _SESSION ['username'] на самом деле нигде не менялся, но $ username был. Вот почему:

<?php
    if(!empty($_SESSION['username'])){
            $username = $_SESSION['username'];
            require_once '../includes/connect_to_db.php';
            echo $_SESSION['username']. ' is correct but '. $username. 'is not.';
    }
?>

Наконец, мы видим в необходимом файле connect_to_db.php:

<?php
    $host="localhost"; // Host name
    $username="root"; // mysql username
    $password=""; // mysql password
    $db_name="BH_web_DB"; // Database name

    // Connect to server and select database.
    mysql_connect("$host", "$username", "$password")or die("cannot connect: ". mysql_error());
    mysql_select_db("$db_name")or die("cannot select DB");
?>

Простое исправление:

$db_username="root"; // mysql username

Так что я на самом деле установил его слишком root =) надеюсь, это поможет другому.

1 голос
/ 08 февраля 2011

Почему вы устанавливаете переменную $ _SESSION ['username'] снова в login_success.php Вы устанавливаете переменные в check_login.php, правильно?

Вот что я бы сделал

В файле login_success.php распечатайте переменные сеанса, чтобы узнать, что происходит. Я почти гарантирую, что что-то происходит с вашим SQL-запросом. Установите условие, чтобы убедиться, что вы действительно получаете результаты.

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');

Также на своей странице контрольного журнала измените оператор if, чтобы искать фактическую переменную в $ _SESSION ['username'] не только если она установлена, я стараюсь держаться подальше от isset ().

Ради бога, не храните простые текстовые пароли, для реализации безопасной схемы хеширования паролей ничего не стоит. Его очень легко использовать функцию crypt () в php, также проверьте это для безопасного метода с открытым исходным кодом. http://www.openwall.com/phpass/

1 голос
/ 08 февраля 2011

Ответ очень прост:

В вашем приложении есть код, который меняет значение $ _SESSION ['username'] на 'root'.

Вы должны изучить свой код инайти это место.Ничего страшного

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...