2016-04-23 6 views
0

Хорошо, по сути, мой вопрос спрашивает, являются ли их основными угрозами безопасности, используя приведенный ниже сценарий входа, и если да, то что я могу использовать, чтобы предотвратить вхождение в мои службы SQL-запросов или пользователей без предоставления правильных сведений? Я понимаю, что я использую устаревшую версию PHP, но весь мой сайт построен на этой предыдущей версии, и я понимаю, что это создает риски, используя устаревшую сборку.Безопасен ли этот сценарий входа?

Войти Форма

<form method="post" action="login.php?login=login"> 

<input type='text' placeholder="username" class='form-control' name='username' required autofocus/> 
<input type='password' placeholder="password" class='form-control' name='password' required/> 
<input class='btn btn-default btn-block' type='submit' value='Login' class='submit' /> 

</form> 

Форма Сообщение

<? if($login==login) 
     { 
     $username = clean($_POST[username]); 
     $password = md5($_POST[password]); 
     $date = date("Y-m-d"); 
     $time = date("H:i:s"); 
     $sql = mysql_query("select * from users where username = '$username' AND password = '$password'"); 
     $check = mysql_num_rows($sql); 
     if($check!=1) 
     { 
     echo 'Incorrect username or password.'; 
     echo('<meta http-equiv="refresh" content="3;url=/login" />'); 
     $success = "Failed"; 
     if($content[loginlog]==1) 
     $sqllog = mysql_query("insert into usr_logs(user, ip, time, date, success) values('$username', '$ip', '$time', '$date', '$success')"); 
     } 
     else 
     { 
     $user = mysql_fetch_array($sql); 
     $_SESSION[usr_name] = $user[username]; 
     $_SESSION[usr_level] = $user[level]; 
     $_SESSION[usr_ip] = $ip; 
     $success = "Success"; 
     echo('<meta http-equiv="refresh" content="1;url=/home" />'); 
     if($content[loginlog]==1) 
     $sqllog = mysql_query("insert into usr_logs(user, ip, time, date, success) values('$username', '$ip', '$time', '$date', '$success')"); 
     } 
     } 
     if($login==logout) 
     { 
     session_unset(); 
     session_destroy(); 
     echo 'logged out'; 
     echo('<meta http-equiv="refresh" content="3;url=/login" />'); 
     }?> 

Спасибо за помощь мне улучшить безопасность моего кода и предотвращая любые инъекции SQL.

+7

Я голосующий, чтобы закрыть этот вопрос не по теме, потому что вопросы о качестве рабочего кода обычно принадлежат [codereview] (http://codereview.stackexchange.com/help/on-topic) – Quentin

+6

Есть много ужасных вещей об этом коде, и функция 'clean' (которая фактически делает вещи, о которых вы в первую очередь спрашиваете!) полностью отсутствует. – Quentin

+0

Где/что такое 'clean()'? – jDo

ответ

2

Прежде всего, что такое чистая() функция?

Во-вторых, не используйте метод шифрования MD5, используйте по крайней мере sha256. Это связано с тем, что MD5 плохо для пароля хеширования из-за его слабых мест безопасности и из-за его слишком быстрого. Если вы хотите больше использования безопасности соль в сочетании с sha256Функция password_hash(). И here.

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

В-четвертых, вы должны заменить эти строки:

echo('<meta http-equiv="refresh" content="3;url=/login" />'); 
echo('<meta http-equiv="refresh" content="1;url=/home" />'); 

с этим одним:

header('Location: /login'); 
header('Location: /home'); 

Причина заключается в том, что использование мета обновления не рекомендуется в Wide Web Consortium World. Более подробную информацию можно найти here.

И последнее, но не менее важное: вы используете устаревшее расширение mysql. Для доступа к базе данных вы должны использовать расширение mysqli или PDO.

+0

Или PDO будет лучше – RiggsFolly

+0

@RiggsFolly Да, вы правы. Я предпочитаю использовать mysqli, tho. Я отредактирую свой ответ. –

0

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

'' mysql_query («вставить в usr_logs (пользователь, ip, время, дата, успех)» («$ username», «$ ip», '$ time', '$ date', '$ success') ");

Скажите $ username = 'drop table users ...' или что-то в этом роде. Нехорошо.

В теории версии php от 5ish вперед должны иметь дело с этим для вас, но лично я предпочел бы доверять грабителю банка, чтобы следить за моим кошельком.

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