я могу улучшить мою систему входа в PHP с помощью куки? - PullRequest
0 голосов
/ 21 ноября 2011

Я сейчас тестирую простую систему входа в систему, которую я сделал.Сценарий проверяет имя пользователя и пароль, введенные мной в базе данных, и, если они совпадают, устанавливает имя пользователя в переменную сеанса.Когда я перехожу на страницу «Только для членов», она проверяет, существует ли переменная сеанса, если она не существует, пользователь не может просматривать содержимое.Кажется, работает как задумано.Основываясь на вышеупомянутой информации, вот мои вопросы:

  1. Какие уязвимости / недостатки есть в моем методе?

  2. Могут ли куки сделать его болеебезопасности?Если это так, как бы это произошло с моим кодом?

Вот что я работаю до сих пор:

проверка имени пользователя и пароля:

<?
session_start();

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

if ($username && $password){
$query = mysql_query("SELECT * FROM user WHERE username='$username' ");
$numrows = mysql_num_rows($query);

    //if user exists
    if ($numrows !=0){
        while ($row = mysql_fetch_array($query)){
                $dbusername = $row['username'];
                $dbpassword = $row['password'];
            }

        if ($username == $dbusername && md5($password) == $dbpassword){
            echo 'You\'re in! <a href="member.php">Click</a> here to enter the member page.';   
            $_SESSION['username'] = $dbusername;

        }
        else
            echo "incorrect password!";
    }
    else
        die("sorry, that user doesn't exist!");
}



?>

Страница только для членов:

<?
session_start();


if ($_SESSION['username']){
echo "Welcome, ".$_SESSION['username']."!<br>
<a href='changepassword.php'>Change password</a>
";
}
else{
echo "please log in";   
}
?>

Ответы [ 2 ]

5 голосов
/ 21 ноября 2011

В настоящее время самой большой проблемой безопасности является внедрение SQL-кода, которое является существенным недостатком в текущем сценарии. Любой может войти в систему без каких-либо учетных данных с помощью сценария, который вы опубликовали. Измените эту строку:

$username = $_POST['username'];

выглядеть так:

$username = mysql_real_escape_string($_POST['username']);

Что касается файлов cookie, сеансы используют файлы cookie, поэтому вы уже используете их. Во-вторых, все, что вы помещаете в cookie, передается по проводам, поэтому они не защищены.

Другие меры безопасности, которые были бы хорошими, - это использовать bcrypt или хотя бы вариант sha2 вместо md5 для хеширования паролей.

Также желательно хешировать пароли с использованием javascript перед их отправкой по сети, это очень важно, если вы не используете SSL.

Это поможет вам начать. После того, как вы позаботитесь об этих проблемах, вы можете перейти к атакам CSRF и захвату сессий.

1 голос
/ 21 ноября 2011

Я рекомендую вам использовать класс PDO PHP для ваших запросов по многим причинам:

  • Если вы измените свою СУБД, вам не придется редактировать все свои mysql_query(), mysql_numrows() и т. Д.
  • По соображениям безопасности, поскольку PDO имеет некоторые предварительно интегрированные функции для предотвращения проблем безопасности.
  • ...

Итак, сPDO, ваш код будет выглядеть так:

<?php
session_start();

$db = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);

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

if ($username && $password){
$query = $db->prepare("SELECT * FROM user WHERE username = :usr");
$query->execute(array('usr' => $username));
$numrows = $query->rowCount();

    //if user exists
    if ($numrows !=0){
        while ($row = $query->fetch()){
                $dbusername = $row['username'];
                $dbpassword = $row['password'];
            }

        if ($username == $dbusername && md5($password) == $dbpassword){
            echo 'You\'re in! <a href="member.php">Click</a> here to enter the member page.';   
            $_SESSION['username'] = $dbusername;

        }
        else
            echo "incorrect password!";
    }
    else
        die("sorry, that user doesn't exist!");
}
?>

Метод prepare() предотвращает SQL-инъекции.execute() требуется после prepare(), но вы можете использовать метод query() без execute().

Метод fetch() эквивалентен mysql_fetch_array().

Вот документация PDO: http://www.php.net/manual/en/book.pdo.php

Надеюсь, я помог.

Примечание: я предпочитаю <?php вместо <?.

...