2012-02-14 4 views
2

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

PHP скрипт

<?php 
include_once ("ConnectToMySql.php"); 

session_start(); 

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

$query = "SELECT password FROM users WHERE username = '$username';"; 
$result = mysql_query($query); 

if(mysql_num_rows($result) < 1) 
{ 
    echo "This Username Is Not Registered!"; 
exit; 
} 
if(mysql_num_rows($result) == 1) 
{ 
if ($password == $result) 
{ 
    echo "Logged In!"; 
} 

else echo "Wrong Password!"; 
} 
?> 

Благодаря

+1

Googling для «безопасной формы входа в систему php» возвращает много хороших сообщений, таких как http://tinsology.net/2009/06/creating-a-secure-login-system-the-right-way/ – Joe

+0

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

ответ

4

Первый наконечник может быть, чтобы показать общую ошибку для обоих недействительных случаев входа в систему: invalid username or password. Таким образом, потенциальный злоумышленник не узнает, является ли имя пользователя действительным или нет.

Вы также можете сделать один запрос, соответствующий как имени пользователя, так и паролю. Вам, вероятно, потребуется дополнительная информация о пользователе (для хранения в сеансе?), Поэтому было бы неплохо выбрать эти поля вместо пароля (например, id, name).

Что касается хешированного пароля, хранящегося в базе данных, вы можете добавить SALT для повышения безопасности. http://en.wikipedia.org/wiki/Salt_%28cryptography%29

+1

Да, вы должны добавить уникальное значение соли для каждого пользователя. Вы также можете рассмотреть хэширование на стороне * клиента *, чтобы гарантировать, что пароль не отправляется по сети (если вы уже не используете SSL/TLS). – adelphus

+0

Ваши комментарии были массовой помощью. Большое спасибо! – alexjfno1

+0

Я рад, что они были полезны :) –

1

Что я хотел бы сделать, это изменить запрос к следующему:

"SELECT COUNT(*) FROM users WHERE username = '$username' AND password='$password';" 

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

Смежные вопросы