Как создать очень простое имя пользователя - пароль для входа в PHP? - PullRequest
3 голосов
/ 23 декабря 2010

index.php

<?php
if( $_SESSION['auth'] != 1 ) {
    require( 'login.php' );
}
else {
    echo "hello";
}
?>

login.php

<?php
$name = $_POST['name'];
$pass = $_POST['pass'];

if( isset($name) || isset($pass) )
{
    if( empty($name) ) {
        die ("ERROR: Please enter username!");
    }
    if( empty($pass) ) {
        die ("ERROR: Please enter password!");
    }


    if( $name == "<some name>" && $pass == "<some password>" )
    {
        // Authentication successful - Set session
        session_start();
        $_SESSION['auth'] = 1;
        setcookie("username", $_POST['name'], time()+(84600*30));
        echo "Access granted!";
    }
    else {
        echo "ERROR: Incorrect username or password!";
    }
}


// If no submission, display login form
else {
?>
    <html>
    <head></head>
    <body>
    <center>
    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    Username: <input type="text" name="name" value="<?php echo $_COOKIE['username']; ?>">
    <p />
    Password: <input type="password" name="pass">
    <p />
    <input type="submit" name="submit" value="Log In">
    </center>
    </body>
    </html>
<?php
}
?>

Итак, поскольку я все еще изучаю PHP, я пытаюсь выяснить несколько вещей:

  • Как мне получить его, чтобы я мог перезагрузить index.php, и он отображает «привет»?
  • Как я могу получить login.php для автоматической загрузки index.php при успешной аутентификации, чтобы я мог получить его в «привет»?
  • Позже, возникнет ли проблема с использованием файла cookie для хранения предоставленных пользователем данных для входа в систему (чтобы им не нужно было повторно заполнять форму для восстановления сеанса)?

Помощь оценена.

Ответы [ 6 ]

5 голосов
/ 23 декабря 2010

1, вам не хватает session_start () в index.php.Добавьте его, и вы увидите «Hello world»

2, замените строку на «Доступ разрешен!»с перенаправлением:

header('Location: index.php');
exit;

3. Вы можете определенно хранить учетные данные в куки, но вы всегда должны хешировать и солить пароль. Здесь хорошая статья о хешировании паролей.

4 голосов
/ 23 декабря 2010

Лучший способ делать вещи: Проверьте переменную сеанса в index.php и перенаправьте, если она не установлена. Как то так

session_start();
if (!isset($_SESSION['auth']) || $_SESSION['auth'] != 1) {
   header('Location: login.php');
   exit();
}
echo 'Hello'; 

В login.php после успешной аутентификации перенаправьте на index.php и выполните там эхо.

session_start();
if( $name == "<some name>" && $pass == "<some password>" )
{
// Authentication successful - Set session
   $_SESSION['auth'] = 1;
   setcookie("username", $_POST['name'], time()+(84600*30));
   header('Location: index.php');
   exit();
}
else {
  echo "ERROR: Incorrect username or password!";
}

session_start () должен появиться до того, как какой-либо контент отобразится в браузере.

2 голосов
/ 19 июля 2014

Вы должны:

  1. всегда пытаться позвонить session_start() как можно раньше - "Чтобы использовать cookie-на основе сеансов, session_start() должен быть вызван перед выводом чего-либо в браузер. "

  2. проверьте, установлен ли $_POST['name'] перед выполнением $name = $_POST['name'];.Вы можете сделать:

    $name = isset($_POST['name']) ? $_POST['name'] : '';
    
  3. сохранить username непосредственно в $_SESSION, чтобы cookie содержал только PHPSESSID и никаких данных, которые могли бы быть заменены / использованы конечными пользователями:

    $_SESSION['user'] = 'John';
    
  4. попробуйте перенаправить пользователя на index.php, чтобы увидеть немедленный результат изменения сеанса:

    header('Location: index.php');
    exit;
    

Вот как это может выглядеть:

<?php
session_start();
if (empty($_SESSION['user'])) {

    $name = isset($_POST['name']) ? $_POST['name'] : '';
    $pass = isset($_POST['pass']) ? $_POST['pass'] : '';

    if ($name != '' || $pass != '')
    {
        if ($name === '')
            die("ERROR: Please enter the username!");

        if ($pass === '')
            die("ERROR: Please enter the password!");

        if ($name == "test" && $pass == "test") {

            // authentication successful, save username in session:
            $_SESSION['user'] = 'John';

            // redirect to index.php to welcome the logged in user:
            header('Location: index.php');
            exit;
        }
        else {
            die("ERROR: Incorrect username or password!");
        }
    }

    // no submitted data, display form:
    ?>
        <html>
        <head></head>
        <body>
            <center>
            <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
            Username: <input type="text" name="name" value=""><br>
            Password: <input type="password" name="pass"><br>
            <input type="submit" value="Log In">
            </form>
            </center>
        </body>
        </html>
    <?php
}
else {
    // info about current user is stored in session, welcome this user:
    echo "hello " . $_SESSION['user'];
}
?>
1 голос
/ 23 декабря 2010

Используйте это, чтобы перенаправить на index.php (надеюсь, он отвечает на ваши # 1 и # 2)

if( $name == "<some name>" && $pass == "<some password>" )
{
    // Authentication successful - Set session
    session_start();
    $_SESSION['auth'] = 1;
    setcookie("username", $_POST['name'], time()+(84600*30));
    //echo "Access granted!";
    header("Location: index.php");
    die('');
}

Вы используете куки для непосредственного сохранения имени пользователя.Это не отличный вариант.Что, если пользователь изменяет файлы cookie, чтобы прочитать другое имя пользователя?Вместо этого используйте $_SESSION['..'] Как это:

$_SESSION['user']=$_POST['name'];

, а затем,

if (isset($_SESSION['user']))
    echo "Hello, " . $_SESSION['user'];
1 голос
/ 23 декабря 2010

Как мне получить его, чтобы я мог перезагрузить index.php, и он отображает «привет»?

Удалите else, поэтому всегда будет отображаться "привет":

if($_SESSION['auth'] != 1) {
    require('login.php');
}
// Either way always print.
echo "hello";

Как я могу получить login.php для автоматической загрузки index.php при успешной аутентификации, чтобы я мог получить его в "привет"?

Заменить echo "Access granted!"; на header('Location:index.php');

Позже, возникнет ли проблема с использованием файла cookie для хранения предоставленных пользователем данных для входа в систему (чтобы им не приходилось повторно заполнять форму для восстановления сеанса)?

Пока вы используете это как способ автозаполнения только имени пользователя. и требовать от пользователей каждый раз вводить свой пароль. в противном случае пользователь может установить для своего имени пользователя cookie значение «admin» или другого пользователя.

0 голосов
/ 21 октября 2016

никто не упоминает, что вы должны проверить, что сессия действительно действительна ... если вы просто проверите, что она установлена, вы можете, скорее всего, подделать ее и пройти. Кроме того, чтобы хэшировать учетные данные в куки, я бы сначала зашифровал его на стороне сервера, а затем хэшировал. на всякий случай где-нибудь в будущем кто-то нарушит тип хеша. sha3-256 - ваш лучший выбор, поскольку он, как известно, не сломан и должен в будущем выдерживать многократное увеличение вычислительной мощности.

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

Кажется, что это несколько упрощенно выглядит как «простой логин и пароль для пользователей», но на самом деле настолько простой, насколько это возможно, следует учитывать безопасность ваших пользователей, даже если это не публичный сайт ...

Итак, помните:

  • проверка сессий и файлов cookie на наличие действительного содержимого
  • проверьте поля ввода user и pw на наличие вменяемых данных перед отправкой в ​​ваш процесс аутентификации.
  • шифрует информацию пользователя и pw на стороне вашего сервера и на стороне клиента, если вы отправляете ее туда (куки?).
  • использовать AES256 по крайней мере (mysql поддерживает эту нативную версию, начиная с 5.6, ее очень легко использовать ...) для шифрования данных.
  • используйте sha3-256 для хеширования.
  • посмотрите на руководства по криптографии и хэшированию, так как это легко испортить.
  • попросите знакомого друга проверить ваши настройки, чтобы максимально эффективно использовать его для ящика пива ^^, повеселиться с ним и узнать много нового о вашем коде: D

    • наконец, я забуду (или вообще не знаю) много вещей, поэтому будут отсутствовать пули! : D
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...