Чтобы перенаправить пользователя обратно на index.php после обработчика - PullRequest
0 голосов
/ 07 августа 2009

Я положил «имя пользователя» и «пароль» в мою форму. Действие запускает handler.php. Пользователь видит только белую страницу (handler.page), если он не перезагружает свой браузер по адресу handler.php. Если он это делает, обработчик помещает его обратно в index.php.

Я хотел бы автоматически вернуть пользователя на домашнюю страницу после того, как он окажется на handler.php, где он получит логин -cookie

В моем handler.php

есть следующее
$email = $_POST['email'];
$username = $_POST['username'];
$passhash_md5 = $_POST['passhash_md5']; 

 // COOKIE setting

 /* $cookie may look like this
   variables
        $username = "username"$
        $passhash_md5 = "password"$
        $email ="email"$
        $_SERVER['REMOTE_ADDR']=11.44.23.94$
   before md5:$
        "usernamepasshash_md5email11.44.23.94"$
   after md5:$
        "a08d367f31feb0eb6fb51123b4cd3cb7"$
 */

$login_cookie = md5(                                                                                                                                                                           
    $username .
    $password .
    $email .
    $_SERVER['REMOTE_ADDR']
);

setcookie ("login", $login_cookie);    

if (isset($_COOKIE['login']) )
{

    $sql2 = "SELECT * from users";
    $raw_user_list = pg_query($dbconn, $sql2);
    $user_list = pg_fetch_all($raw_user_list);

    // to process each user in the user-list that has a password 
    foreach ($user_list as $user => $passhash_md5)
    {                                                                                                                                                                                               
        //match the user list with the cookie$
        if ( $login_cookie == $_COOKIE['login'] )
        {
            header("Location: index.php"); 
            die("logged in");
        }
    }
    header("Location: index.php");   
    die("wrong username/password");
}
?>      

У меня есть форма, которая использует метод POST, а действие - handler.php.

Моя форма

<form method="post" action="handler.php">
    <p>Username:
        <input name="username" type="text" size="40" />
    </p>

    <p>Email:
        <input name="email" type="text" size="230" />
    </p>

    <p>Password:
        <input name="password" type="password" size="230" />
    </p> 

    <input type="submit" value="OK" />
</form>

AJAX не вызывает страницу обработчика.

Я безуспешно запускаю страницу обработчика с HEAD:

<head>
<meta http-equiv="refresh" content="5; URL=inedx.php">
</head>

Однако я не могу включить HEAD, потому что PHP не позволяет выводить данные при использовании команд заголовка.

Как автоматически добавить пользователя в index.php, если вход выполнен успешно?

Ответы [ 4 ]

3 голосов
/ 07 августа 2009

Это должна быть ваша базовая настройка

Сначала пользователь заходит на страницу входа и вводит свое имя пользователя / пароль. Мы назовем это login.php. Затем он отправляет материал в handler.php

HTML

<form method="POST" action="handler.php">
<input type="text" name="login[user]">
<input type="password" name="login[password]">
</form>

Затем скрипт-обработчик получает данные POST, обрабатывает, если и если хэши паролей совпадают, устанавливает cookie и перенаправляет обратно на страницу индекса.

Скрипт входа в систему

// Check for a Login Form
if (isset($_POST['login']) )
{
    // Get the Data
    $sql2 = "SELECT * from users";
    $raw_user_list = pg_query($dbconn, $sql2);
    $user_list = pg_fetch_all($raw_user_list);

    // Go through each User 
    foreach ($user_list as $user => $passhash_md5)
    {   
        // Check if the passwords match
        if ( $passhash_md5 == md5($_POST['login']['password'] ))
        {
            // YOU NEED TO CREATE A COOKIE HERE     

            header("Location: index.php"); 
            die("logged in");
        }
    }
    header("Location: index.php");   
    die("wrong username/password");
}

Затем на каждой странице, которую вы хотите проверить на вход в систему, вы перенаправляете кого-либо, если у него нет файла cookie для входа. Вы можете расширить это, чтобы проверить правильность cookie для входа в систему.

Каждая страница

// Check for a Cookie
if(!$_COOKIE['login'])
{
    header('Location: login.php');
    die("User Required");
}

Я не совсем уверен, что вы пытались сделать там, но это базовая настройка для создания базовой формы входа.


Если вы пытаетесь проверить, совпадает ли комбинация, переданная в форму, с файлом cookie, попробуйте следующее:

// Set the Variables
$email = $_POST['email'];
$username = $_POST['username'];
$passhash_md5 = $_POST['passhash_md5']; 

 // COOKIE setting

 /* $cookie may look like this
   variables
        $username = "username"$
        $passhash_md5 = "password"$
        $email ="email"$
        $_SERVER['REMOTE_ADDR']=11.44.23.94$
   before md5:$
        "usernamepasshash_md5email11.44.23.94"$
   after md5:$
        "a08d367f31feb0eb6fb51123b4cd3cb7"$
 */

// Set what the cookie should look like
$login_cookie = md5(                                                                                                                                                                           
    $username .
    $password .
    $email .
    $_SERVER['REMOTE_ADDR']
);

// Check For the Cookie
if (isset($_COOKIE['login']) )
{
    // Check if the Login Form is the same as the cookie
    if ( $login_cookie == $_COOKIE['login'] )
    {
        header("Location: index.php"); 
        die("logged in");
    }
    header("Location: index.php");   
    die("wrong username/password");
}

Я удалил часть базы данных, потому что вы не используете часть базы данных ни в одном коде, так что это не имеет значения. Похоже, вы не пытаетесь войти в систему, а скорее проверяете, что куки, которые они установили на своем компьютере, содержат ту же строку, что и в форме.


Хорошо, окончательное издание, надеюсь

// Set the Variables
$email = $_POST['email'];
$username = $_POST['username'];
$password = $_POST['password']; 

 // COOKIE setting

 /* $cookie may look like this
   variables
        $username = "username"$
        $passhash_md5 = "password"$
        $email ="email"$
        $_SERVER['REMOTE_ADDR']=11.44.23.94$
   before md5:$
        "usernamepasshash_md5email11.44.23.94"$
   after md5:$
        "a08d367f31feb0eb6fb51123b4cd3cb7"$
 */

// Set what the cookie should look like
$login_cookie = md5(                                                                                                                                                                           
    $username .
    $password .
    $email .
    $_SERVER['REMOTE_ADDR']
);

// Check For the Cookie
if (isset($_COOKIE['login']) )
{
    // Check if the Login Form is the same as the cookie
    if ( $login_cookie == $_COOKIE['login'] )
    {
        header("Location: index.php"); 
        die("logged in");
    }
    header("Location: index.php");   
    die("wrong username/password");
}
// If no cookie, try logging them in
else
{
    $sql2 = sprintf("SELECT * from users WHERE passhash_md5='%s',
    pg_escape_string($login_cookie));
    $raw_user_list = pg_query($dbconn, $sql2);
    if ($user = pg_fetch_row($raw_user_list)) {.
        setcookie('login', $login_cookie);
        header("Location: index.php"); 
        die("logged in");
    } else {
    header("Location: index.php");   
    die("wrong username/password");
    }
}

Предложение Sprintf и Where, предоставленное Rezzif

2 голосов
/ 07 августа 2009

В качестве примечания вы действительно просматриваете всю таблицу пользователей, чтобы узнать, есть ли у пользователя действительный логин?

Вы действительно должны использовать предложение where!


    $sql2 = sprintf("SELECT * from users WHERE UserName = '%s' AND UserPass = '%s'",
    pg_escape_string($_COOKIE['login']),
    pg_escape_string($passhash_md5));
    $raw_user_list = pg_query($dbconn, $sql2);
    if ($user = pg_fetch_row($raw_user_list)) {
       //Login valid
    } else {
      //Login invalid
    }

Не знаком с pg, но я надеюсь, что это поможет.

1 голос
/ 07 августа 2009

Не могу сказать, так как вы пропустили все, что выше оператора if. Но, похоже, вам нужен случай, когда $ _COOKIE ['login'] не установлен

Редактировать

Похоже, ваша логика немного испорчена. Вы не устанавливаете переменную сеанса любого типа, чтобы указать, когда пользователь аутентифицирован. так что вам нечего проверять на других ваших страницах, чтобы сказать, что пользователь вошел в систему. Кроме того, ваш foreach перезаписывает значение $ passhash_md5 строкой результата:

foreach ($user_list as $user => $passhash_md5)

То, что вам нужно будет сделать, это, вероятно:

foreach ($user_list as $user)

А затем проверьте cookie по столбцу (например: $user['md5hash'] == $login_cookie), который содержит хэш md5 в базе данных. Как у вас это получается, вы просто проверяете, равен ли 1 = 1, поскольку вы набрали $_COOKIE['login'] - $login_cookie, а затем проверяете, равны ли эти переменные друг другу.

Ваше полное использование $_COOKIE представляется ненужным. Вы действительно должны использовать $_SESSION переменные вместо всего, что есть в вашем скрипте. Сначала вам нужно запросить базу данных по размещенной информации, используя операторы where. И если пользователь аутентифицирован, вы должны установить переменную сеанса, чтобы указать, что он аутентифицирован. Что-то вроде:

$_SESSION['loggedin'] = true;

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

0 голосов
/ 07 августа 2009

Это ответ, основанный на ответах Ча, Марка и Рецифа.

<?php

// independent variables
$dbHost = "localhost";
$dbPort = 5432;
$dbName = "masi";
$dbUser = "masi";
$dbPassword = "123456";

$conn = "host=$dbHost port=$dbPort dbname=$dbName user=$dbUser password=$dbPassword";

$dbconn = pg_connect($conn);

if(!$dbconn) {
    exit;
}

$sql = "SELECT username, passhash_md5, email
    FROM users
    WHERE username = '{$_POST['username']}'
    AND email = '{$_POST['email']}'
    AND passhash_md5 = '{$_POST['password']}';";

$result = pg_query($dbconn, $sql);
if(!$result) {
    exit;
}

$username = $_POST['username'];
$password = $_POST['password'];
$passhash_md5 = md5($_POST['password']);


 // COOKIE setting

 /* $cookie may look like this:
   variables
        $username = "username"
        $passhash_md5 = "password"
   before md5:
        "usernamepasshash_md5"
   after md5:
        "a08d367f31feb0eb6fb51123b4cd3cb7"
 */

$login_cookie = md5(
    $username .
    $password
);

$sql3 = "SELECT passhash_md5

            FROM users 
            WHERE username=$_POST['username'];";

$password_data_original = pg_query($dbconn, $sql3);

while ($row = pg_fetch_row($data)) {
    $password_original = $row[0];
}

$login_cookie_original = md5(
    $username .
    $password_original
);


// Check for the Cookie
if (isset($_COOKIE['login']) )
{

    // Check if the Login Form is the same as the cookie
    if ( $login_cookie_original == $login_cookie )
    {
        header("Location: index.php");
        die("logged in");
    }
    header("Location: index.php");
    die("wrong username/password");
}
    // If no cookie, try logging them in
else {
    // we do not want SQL injection so we use pg_escape_string
    $sql2 = sprintf("SELECT * from users
                    WHERE passhash_md5='%s',
                    pg_escape_string($login_cookie));
    $raw_user_list = pg_query($dbconn, $sql2);

    if ($user = pg_fetch_row($row_user_list)) {
        setcookie ("login", $login_cookie);
        header("Location: index.php");
        die("logged in");
    } else {
        header("Location: index.php");
        die("wrong username/password");
    }
}

pg_close($dbconn);
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...