2013-06-03 5 views
0

Я долго искал безопасный вход в систему с помощью PHP. Я нашел интересный контент, хотя я все еще не совсем уверен в самом безопасном и упрощенном подходе.Безопасный вход с помощью PHP

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

Моя пользовательская таблица в базе данных содержит столбец с именем «loginToken». Когда пользователь входит в систему, создается значение (на основе этого идентификатора пользователя, случайное число и, наконец, sha1 hashed), который вставляется в loginToken таблицы пользователей базы данных.

В дополнение к этому, $ _CCOKIE создается с тем же значением. Таким образом, эти значения совершенно различны для каждого пользователя, и чередует каждый раз, когда пользователь входит в

Теперь, чтобы проверить пользователь вошел в систему, я использую этот следующий код:.

$user_id = -1; //By default, the user is logged out 

if (isset($_SESSION["user"]) && isset($_COOKIE["ut"])) { //Check session and user token exists 
    //Get variables 
    $uid = $_SESSION["user"]; //Get user ID 
    $ut = $_COOKIE["ut"]; //Get user token 

    //Compare the user id with the user token in the database 
    $sql = mysql_query(" 
     SELECT COUNT(*) 
     FROM `users` 
     WHERE `id` = '$uid' AND `login_token` = '$ut' 
    "); 

    //Get result 
    $sql = mysql_result($sql, 0); 

    //Found! 
    if ($sql == 1) { 
     $user_id = $uid; //User logged in! 
    } 
} 

Это понятно? Если да, то это достаточно безопасный метод?

Спасибо!

+1

Это не безопасно. Вы не дезинфицируете свои входы, и вы доверяете всему от клиента. По крайней мере, используйте подготовленные заявления. –

+1

вам нужно посмотреть на mysqli и параметризованные запросы http://www.php.net/manual/en/mysqli.quickstart.prepared-statements.php – j0hnstew

+1

@ RudiVisser: К сожалению, я до сих пор довольно новичок в этой области кодирования , Что такое «подготовленные заявления»? – Tom

ответ

0

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

Используйте переменную сеанса.

if ($_SESSION['logged_in'] === true) { ... 

Это часто используемый метод.

Как правило, вы хотите, чтобы пользователь вводил имя пользователя и пароль по защищенной форме HTTPS. Когда вы получите запрос, сравните имя пользователя и хешированную версию пароля, который вы храните в базе данных, в хеш-версию, предоставленную формой. Если хеши совпадают, установите $ _SESSION ['logged_in'] = true.

Позже в коде, проверьте эту переменную сеанса для обеспечения пользователь вошел в

+1

Спасибо, но я думаю, что вы неправильно поняли. Я понимаю, как входить в систему, но сценарий используется в начале каждой страницы, чтобы проверить, где бы пользователь не входил в систему. EDIT: И поскольку сеансы продолжаются только в течение ограниченного периода времени, я не могу полагаться на сеансы. – Tom

+1

Сеансы могут быть выполнены навсегда. Они реализуются через файл cookie. Вы можете изменить обработку PHP-сессий, что является общим для использования SQL-based back-end для данных сеанса, который является более безопасным и более масштабируемым. – beiller

+1

О, я не знал об этом. Спасибо! Можно ли каким-либо образом манипулировать сеансом пользователя для входа в систему как другого пользователя? – Tom

-1

Используйте следующие для проверки HTML специальных символов и предотвращение SQL инъекций:.

$uname=trim(htmlspecialchars($_POST['username'])) 

и проверить его в

if($uname!=""){ 
//continue with your database connection and checking. 
//do use of prepare statement than using mysql_query() refer the link for  
//sample code. 
} 
else{ 
echo "UserName should not be null"; 
} 

Вот ссылка для входа в систему с PHP надежно: http://www.codeslips.com/post/Login-script-in-PHP-data-checking-from-mysql-database