Безопасна ли эта система входа? - PullRequest
0 голосов
/ 25 февраля 2012

Безопасна ли эта система входа в систему?

    if ($_POST[$submit]){

$user = $_POST[$user];
$pass = $_POST[$pass];

if ($user && $pass){ //if user and pass is enterered

        require("vars.php"); //require MySQL conection settings
        mysql_connect($auth_mysql_server, $auth_mysql_user, $auth_mysql_pass); //connect to MySQL
        mysql_select_db($auth_mysql_db); // select MySQL database

        $pass = md5($pass); // hash password

        $query = mysql_query("SELECT * FROM $auth_mysql_table WHERE user='$user'"); // run query
        $numrows = mysql_num_rows($query);

        if ($numrows == 1){ //check if user exists
            $row = mysql_fetch_assoc ($query);
            $dbid = $row[$auth_mysql_id_row];
                $dbuser = $row[$auth_mysql_user_row];
                $dbpass = $row[$auth_mysql_pass_row];

                if ($pass == $dbpass){ // if password is equal to the one in the database start session
                    session_start();
                    //set session information
                    $_SESSION['user'] = $dbuser;

                    header("Location:$auth_loggedin"); // goto logged in page

                }
                else return (3);
        }
        else return (2);

        mysql_close(); // close MySql connection
    }
    else return (1);}

Если нет, то как я могу ее обезопасить?

Я хэшировал пароль, но я знаю, что md5 можно расшифровать, хотя sha1 тоже может быть.Также нужен mysql_close()?

Ответы [ 4 ]

5 голосов
/ 25 февраля 2012

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

$pass = $_POST['pass'];
$salt = "7y9fhu8a"
$secure_pass = md5( $pass . $salt );

Во-вторых, вы не дезинфицируете ввод своего имени пользователя. Вы можете добавить mysql_real_escape_string к вашему имени пользователя, чтобы предотвратить атаки SQL-инъекций.

$query = "SELECT * ".
         "FROM $auth_mysql_table ".
         "WHERE user='" . mysql_real_escape_string($user) . "'";
$result = mysql_query($query);

Существуют и другие способы очистки входных данных пользователя, но они бывают быстрыми и грязными. Что касается mysql_close, я бы не стал беспокоиться. Если вам нужно выполнить какие-либо другие запросы, вам нужно снова открыть соединение.

3 голосов
/ 25 февраля 2012

нет, это не безопасно.вы открываете себя для SQL-инъекций.представьте себе, что произойдет, если кто-то введет это в ваше поле ввода пользователя (которое входит в $ _POST [$ user])

a'; drop table user; select '1'='1

, это приведет к выражению sql:

SELECT * FROM $auth_mysql_table WHERE user='a'; drop table user; select '1'='1'

, который вы выполняете для своей базы данных.это плохо!

вам нужно очистить ваши данные.читать это: http://php.net/manual/en/security.database.sql-injection.php

редактировать: релевантно

0 голосов
/ 24 апреля 2013

Нет, это не безопасно.

Вам необходимо очистить введенные пользователем данные или (что еще лучше) использовать переменные связывания. Для PHP вы можете использовать PDO: PHP PDO подготовил операторы

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

Вы должны либо:

  1. Не хранить пароли - используйте федеративный логин (OpenID, OAuth и т. Д.)
  2. Если вы собираетесь обрабатывать пароли самостоятельно, используйте намного более сильную хеш-функцию, такую ​​как scrypt , bcrypt или PBKDF2 .
0 голосов
/ 25 февраля 2012

mysql_close не требуется, но это хорошая практика.PHP автоматически закроет соединение в конце скрипта.

MD5 - не лучший метод шифрования, вы можете использовать другую библиотеку шифрования PHP, такую ​​как AES

.Шифрование PHP: http://php.net/manual/en/ref.mcrypt.php

имейте в виду, что вам также необходимо ВСЕГДА очищать код !!

Внедрение MySQL может быть плохимзверь !!

...