[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Проверка на прочность
Mephistofel
Здравствуйте увжаемые знатоки, прошу посмотреть и подсказать слабые стороны скрипта авторизации в админке:

index.php:

<form action="admin.php" method="post">
<table>
<tr>
<td>
Логин:</td>
<td><input
type="text" name="login" /></td>

<td>
Пароль:</td>
<td><input
type="password" name="password" /></td>

<td></td>
<td><input
type="submit" value="Войти" /></td>
</tr>
</table>
</form>


admin.php:

<?php if (isset($_POST['login']) && isset($_POST['password']))
{
$login = mysql_real_escape_string($_POST['login']);
$password = md5($_POST['password']);
$query = "SELECT `id`
FROM `users`
WHERE `user`='
{$login}' AND `password`='{$password}'
LIMIT 1"
;
$sql = mysql_query($query) or die(mysql_error());
if (mysql_num_rows($sql) == 1) {
$row = mysql_fetch_assoc($sql);
$_SESSION['user_id'] = $row['id'];
}
else {
die('Логин или пароль введены не правильно. Попробуйте еще раз <a href=\'http://jokes-here.com/admin/\'>авторизоваться</a>');
}
}

if (isset($_SESSION['user_id'])) { echo 'Авторизован';}
else {
die('Не авторизован');
}
?>


Спасибо.



Спустя 4 минуты, 43 секунды (21.06.2012 - 19:18) medvedeva написал(а):
Не знаток, но защиты от брута не вижу smile.gif

Спустя 6 минут, 13 секунд (21.06.2012 - 19:25) Игорь_Vasinsky написал(а):
нормально.

 if (mysql_num_rows($sql) == 1) {


достаточно

 if (mysql_num_rows($sql)) {


я давно уже на простую бейсик авторизацию перешёл с htaccess... мне понты не к чему и заморачиваться не надо. всё делает сервер.

Спустя 49 минут, 58 секунд (21.06.2012 - 20:15) fdr написал(а):
по идее
Цитата
$password = md5($_POST['password']);

нужно обработать trim() - ом, и добавить так сказать "соль"!
$password = md5(trim($_POST['password']) . 'salt-nash-sekretniy_kod&ili%chtoto^vrode');

А то один невидимый пробельчик, весь кайф испортит))))
и еще при не удачной авторизации, добавлять $login в базу с временем. проверять это значение, больше 10 попыток авторизации, блокировать скажем на 10 мин

Спустя 1 минута, 21 секунда (21.06.2012 - 20:16) Игорь_Vasinsky написал(а):
Цитата
$password = md5($_POST['password']);

нужно обработать trim() - ом, и добавить так сказать "соль"!


sha1() и всё.

Спустя 1 час, 41 минута, 11 секунд (21.06.2012 - 21:57) Mephistofel написал(а):
<?php if (isset($_POST['login']) && isset($_POST['password']))
{
$login = mysql_real_escape_string($_POST['login']);
$query = "SELECT `salt`
FROM `users`
WHERE `user`='
{$login}'
LIMIT 1"
;
$sql = mysql_query($query) or die(mysql_error());

if (mysql_num_rows($sql)) {
$row = mysql_fetch_assoc($sql);
$salt = $row['salt'];
$password = md5(md5($_POST['password']) . $salt);}

$query = "SELECT `id`
FROM `users`
WHERE `user`='
{$login}' AND `password`='{$password}'
LIMIT 1"
;
$sql = mysql_query($query) or die(mysql_error());
if (mysql_num_rows($sql)) {
$row = mysql_fetch_assoc($sql);
$_SESSION['user_id'] = $row['id'];
}
else {
echo 'Не авторизован';
}
}

if (isset($_SESSION['user_id'])) { //Показываем наше сокровище...
}
else {
echo 'Не авторизован';
}
?>


Сделал как посоветовал fdr с солью, спасибо.
Цитата
при не удачной авторизации, добавлять $login в базу с временем. проверять это значение, больше 10 попыток авторизации, блокировать скажем на 10 мин

поподробнее об этом можно? Желтельно с примером...

Спустя 10 часов, 33 минуты, 44 секунды (22.06.2012 - 08:31) fdr написал(а):
по идее...
из PHP manual говорится для паролей лучше использовать crypt() чем md5()
"соль" лучше хранить вне корневом каталоге сайта. Хранить ее в базе, не совсем то, лишние запросы и для каждого user-ра своя 'соль' лишние данные.
При запросе лучше запрашивать логин и пароль, указывая WHERE только login=$login
а пароль проверять уже в скрипте.

Цитата
при не удачной авторизации, добавлять $login ... блокировать скажем на 10 мин

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



Спустя 1 час, 21 минута, 58 секунд (22.06.2012 - 09:53) Mephistofel написал(а):
всем ответившим спасибо.

Спустя 12 дней, 9 часов, 52 минуты, 53 секунды (4.07.2012 - 19:46) mixo написал(а):
я рекомендую и сам пользуюсь токенс
index.php
session_start();
$token = $_SESSION['token'] = md5(uniqueid(rand()));
<
input type="hidden" name="token" value="<?php echo $token; ?>"/>


admin.php
if(isset($_POST['token']) && $_POST['token'] != $_SESSION['token']) {
echo 'Sorry but we cannot process your request at this time.';
exit();
}

Спустя 1 час, 44 минуты, 43 секунды (4.07.2012 - 21:30) Gabriel написал(а):
Цитата
При запросе лучше запрашивать логин и пароль, указывая WHERE только login=$login

вершина паранойи.

Спустя 7 минут, 42 секунды (4.07.2012 - 21:38) inpost написал(а):
$login, $password - лишние переменные, ошибки новичков. У тебя есть массив $_POST, с ним работай.
Для md5 используй соль, но это уже сказали.
Свойства атрибутов тегов необходимо указывать в двойных кавычках. А ты вместо того, чтобы использовать двойные - пишешь одинарные и их ещё и экранизируешь smile.gif
Для mysql_query надо свою функцию писать обработки исключений.
die в случае неудачи - огромная ошибка новичков. Надо выводить страницу сайта и писать где-то в середине текст о том, что произошла ошибка, а не просто отрубать всё.
Почитай про isset на сайте php.net , кое-что новое узнаешь!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.