Проблема переноса сессии на другие страницы - PullRequest
0 голосов
/ 29 декабря 2010

Я могу войти в систему пользователя, но при обработке следующей страницы (область членов) я не могу отобразить какую-либо информацию пользователя, не говоря уже о печати $_SESSION[email].Я не уверен, что случилось.Ниже приведен код входа и участники тестирования на странице.

Страница входа:

session_start(); 

//also in a real app you would get the id dynamically
$sql = "select `email`, `password` from `accounts` where `email` = '$_POST[email]'";
$query = mysql_query($sql) or die ("Error: ".mysql_error());

while ($row = mysql_fetch_array($query)){

    $email = $row['email'];
    $secret = $row['password'];

    //we will echo these into the proper fields

}
mysql_free_result($query);

// Process the POST variables
$email = $_POST["email"];

//Variables
$_SESSION["email"] = $_POST["email"];

$secret = $info['password'];

//Checks if there is a login cookie

if(isset($_COOKIE['ID_my_site']))

//if there is, it logs you in and directes you to the members page

{ 
    $email = $_COOKIE['ID_my_site']; 

    $pass = $_COOKIE['Key_my_site'];

    $check = mysql_query("SELECT email, password FROM accounts WHERE email =   '$email'")or die(mysql_error());

    while($info = mysql_fetch_array( $check )) 

    {

        if (@ $info['password'] != $pass) 
        {
        }

        else

        {

            header("Location: home.php");

        }
    }

}

//if the login form is submitted 

if (isset($_POST['submit'])) { // if form has been submitted

    // makes sure they filled it in

    if(!$_POST['email'] | !$_POST['password']) {

        die('You did not fill in a required field.');

    }

    // checks it against the database

    if (!get_magic_quotes_gpc()) {

        $_POST['email'] = addslashes($_POST['email']);

    }

    $check = mysql_query("SELECT email,password FROM accounts WHERE email = '".$_POST['email']."'")or die(mysql_error());

    //Gives error if user dosen't exist

    $check2 = mysql_num_rows($check);

    if ($check2 == 0) {

        die('That user does not exist in our database. <a href=add.php>Click Here to Register</a>');
    }

    while($info = mysql_fetch_array( $check ))  

        //gives error if the password is wrong

        if (@ $_POST['password'] != $info['password']) {

            die('Incorrect password, please try again');
        }

        else 

        { 

            // if login is ok then we add a cookie 

            $_POST['email'] = stripslashes($_POST['email']); 

            $hour = time() + 3600; 

            setcookie(ID_my_site, $_POST['email'], $hour); 

            setcookie(Key_my_site, $_POST['password'], $hour);   

            //then redirect them to the members area 

            header("Location: home.php"); 

        } 

    } 

} 

else 

{    

    // if they are not logged in 

?> 

<?php 

}  

?> 

home.php

session_start(); 

if(!isset($_SESSION['email'])) {
    header('Location: login_test3.php'); die('<a  href="login_test3.php">Login first!</a>');
}

//Variables
$_SESSION["email"] = $email;

print $_SESSION['name'];

ОБНОВЛЕНИЕ

      Just realized the existing code gets in to the home.php file but will not echo anything.  But as soon as you hit refresh the session is gone.  

1 Ответ

1 голос
/ 29 декабря 2010

Не могли бы вы переформатировать этот код? Это действительно трудно понять с отступами и пробелами. Как только он вернется, я сделаю все возможное, чтобы помочь вам.

Один совет: входная очистка!

Эти функции избавили меня от многих проблем:

function forceInteger($variable) {
    return preg_replace("/[^0-9]/", "", $variable);
}
function forceAlpha($variable) {
    return preg_replace("/[^A-Za-z]/", "", $variable);
}
function forceAlphaNum($variable) {
    return preg_replace("/[^A-Za-z0-9 \-\.]/", "", $variable);
}
function forceAlphaNumNoSpace($variable) {
    return preg_replace("/[^A-Za-z0-9\-\.]/", "", $variable);
}

Я обнаружил, что для большинства коротких строк достаточно тире и точек. Если вы берете текстовую область, запустите ее:

function forceNaturalLanguage($variable) {
    return preg_replace("/[^A-Za-z0-9 \-\.\?\!]/", "", $variable);
}

Вот мое предложение: login.php (скрипт, который обрабатывает аутентификацию)

session_start();
if ($_POST["submit"]) {
    // query database for email and password, where email is posted email
    $sql = "SELECT * FROM `accounts` WHERE `email` = '{$_POST[email]'}";
    $query = mysql_query($sql) or die ("Error: ".mysql_error());

    if (mysql_num_rows($query) == 1) {
        // there's one result - we got it!
        $result = mysql_fetch_assoc($query);
        if ($_POST["password"] == $result["password"]) {
            // Successful auth.
            // Set session vars and redirect with header()
            $_SESSION["Authenticated"] = true;
            $_SESSION["FirstName"] = $result["FirstName"];
            $_SESSION["Email"] = $result["Email"];
            header("Location: /home.php?event=login");
            // Don't forget to exit(), otherwise some other code may run, causing unintended behaviours
        }
        else {
            // Password didn't match.
            exit("Incorrect password");
        }
    }
}
else {
    // No email match
    exit("Email not found.");
}

Пара очков:
1. в строках с двойными кавычками, чтобы поместить значение массива в запрос, вы должны заключить его в {фигурные скобки} следующим образом: "Привет, {$ _SESSION [" FirstName "]}";

2. Не EVER не устанавливайте переменные сеанса непосредственно из пользовательского ввода. Если вы берете его из базы данных, сохраните его оттуда. Это самый безопасный способ.

3. Установка ваших собственных файлов cookie для входа в систему бессмысленна при использовании PHP-сессий Если вы хотите изменить имя, попробуйте что-то вроде этого:

ini_set("session.name","coolSession");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...