PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Страниц (1): [1]
Найдено сообщений: 6
Advinno
Отправлено: 15 Мая, 2011 - 15:21:40 • Тема: Написал авторизацию на PHP • Форум: Наработки по собственным проектам
Ответов: 16 Просмотров: 6933
Мелкий пишет: а зачем пароль обрезаете? Всё равно же хэшируете.
Да просто для порядка. Можно и не обрезать.
Мелкий пишет: Валидность логина - лучше использовать регулярку
Согласен. Но есть одно НО. Наслушался на форумах, что если не правильно составить это выражение, то можно поплатиться. А я, как упоминал выше, опыта в этом вопросе не имею. Перестраховался и сделал наглядно.
Мелкий пишет: Строки 6-16 достаточно 1 запроса
Точно. Переделал. Стало красиво.
Спасибо за комментарии.
Advinno
Отправлено: 14 Мая, 2011 - 18:03:11 • Тема: Написал авторизацию на PHP • Форум: Наработки по собственным проектам
Ответов: 16 Просмотров: 6933
OrmaJever пишет: код написан плохо, некоторые условия можно объеденить, запросы так же обьеденить, и некоторые повторяющиеся части кода в функцию записать.
Согласен, что до идеала далеко. Для начинающего не плохо.
Можете дать конкретные рекомендации? Был бы очень признателен.
Advinno
Отправлено: 14 Мая, 2011 - 17:41:08 • Тема: Написал авторизацию на PHP • Форум: Наработки по собственным проектам
Ответов: 16 Просмотров: 6933
molchun201 пишет: 1. У Вас много "SELECT * . . ." в запросах, для безопастности лучше писать конкретные поля
2. Меня учили писать session_start(); первой строчкой в коде, если используются сессии
3. mysql_close; по спецификации советуют писать так mysql_close($connect); - т.е. конкретно указывать. Хотя щас PHP умный стал и закрывать не обязательно
4. Недавно услышал на (IRBIS_team) что закрывать PHP код ?> не нужно, во избежании внедрения всяких гадостей в код
5. charset=windows-1251 - лучше сразу UTF-8, чтоб потом проблем не было
6. Мне советовали что все проверки, такие как mysql_error(), лучше использовать на моменте дебага, но когда уже реально начинаешь юзать код, то их убрать из кода, чтобы в случае чего не дать лишней информации злоумышленнику
Спасибо. Учел все пункты.
И сайт от Ирбиса хорош.
Еще комментарии есть?
Advinno
Отправлено: 14 Мая, 2011 - 11:24:15 • Тема: Написал авторизацию на PHP • Форум: Наработки по собственным проектам
Ответов: 16 Просмотров: 6933
Посмотрите опытным взглядом на наличие дырок. Коллективный разум свернет горы.
Файл start.php. С него начинается просмотр.
Файл bezopasnost'.php. Он включается во все защищаемые страницы.
PHP:
скопировать код в буфер обмена
<?
if ( ! isset ( $_SESSION [ 'Session_Name_of_User' ] ) ) {
header ( "Location: http://" . $_SERVER [ 'HTTP_HOST' ] . "/login.php" ) ; }
else
{
if ( $_SESSION [ 'Session_IP_of_User' ] != $_SERVER [ 'REMOTE_ADDR' ]
|| $_SESSION [ 'Time_of_User_session_start' ] + 300
< time ( ) ) {
header ( "Location: http://" . $_SERVER [ 'HTTP_HOST' ] . "/login.php" ) ; }
}
?>
Файл login.php. Собственно, авторизация.
PHP:
скопировать код в буфер обмена
<?
# Удаляем из таблицы "Неудачные попытки авторизации" записи, которые создались в предыдущий день.
$query = "SELECT * FROM `bad_popitki`" ;
{
if ( date ( 'd.m.Y' , $row [ 'Time_of_last_attempt' ] ) <> date ( 'd.m.Y' ) ) {
$query2 = "DELETE FROM `bad_popitki` WHERE `Id` = '" . $row [ 'Id' ] . "'" ;
}
}
if ( isset ( $_POST [ 'Auth_Name' ] ) && isset ( $_POST [ 'Auth_Pass' ] ) ) {
# Защита от брутфорса. Проверяем не исчерпан ли лимит на кол-во попыток ввода пароля.
$query3 = "SELECT * FROM `bad_popitki` WHERE `IP_of_User` = '" . $_SERVER [ 'REMOTE_ADDR' ] . "'" ;
{
if ( $row3 [ 'Kolvo_popitok' ] >= 5)
{
header ( "Location: http://" . $_SERVER [ 'HTTP_HOST' ] . "/login.php" ) ; }
}
# Обрезаем Логин и Пароль и берем хэш от пароля
$Name = substr ( $_POST [ 'Auth_Name' ] , 0
, 20
) ; $Pass = hash ( 'sha256' , substr ( $_POST [ 'Auth_Pass' ] , 0
, 20
) ) ;
# Т.к. от пароля остался только его хэш, то там нет неприятных символов. Проверяем только Логин.
# Если встретился хоть один символ кроме 0-9, a-z, A-Z, то увеличиваем на единицу кол-во неудачных попыток.
for ( $i = 0 ; $i < strlen ( $Name ) ; $i ++ ) {
{
Plus_one_bad_popitka( ) ;
header ( "Location: http://" . $_SERVER [ 'HTTP_HOST' ] . "/login.php" ) ; }
}
# Если дошли сюда, значит пара Логин-Пароль не содержин неприятных символов. Проверяем ее по таблице "Логин-Пароль"
$query8 = "SELECT * FROM `My_Users` WHERE `Name_of_User` = '" . $Name . "' AND `Pass_of_User` = '" . $Pass . "'" ;
{
# Авторизуем юзера
$_SESSION [ 'Session_Name_of_User' ] = $row8 [ 'Name_of_User' ] ;
$_SESSION [ 'Session_IP_of_User' ] = $_SERVER [ 'REMOTE_ADDR' ] ;
$_SESSION [ 'Time_of_User_session_start' ] = time ( ) ;
# Обнуляем неудачные попытки входа для этого IP
$query9 = "DELETE FROM `bad_popitki` WHERE `IP_of_User` = '" . $_SERVER [ 'REMOTE_ADDR' ] . "'" ;
header ( "Location: http://" . $_SERVER [ 'HTTP_HOST' ] ) ; }
else
{
Plus_one_bad_popitka( ) ;
header ( "Location: http://" . $_SERVER [ 'HTTP_HOST' ] . "/login.php" ) ; }
}
else
{
# Если не нажата кнопка входа в форме, то выводим саму форму
$query10 = "SELECT * FROM `bad_popitki` WHERE `User_IP` = '" . $_SERVER [ 'REMOTE_ADDR' ] . "'" ;
{
if ( $row10 [ 'Kolvo_popitok' ] >= 5)
{
$Stroka_dlya_formi = "<div class='alert_red'>Попробуй после полуночи</div>" ;
}
if ( $row10 [ 'Kolvo_popitok' ] == 4)
{
$Stroka_dlya_formi = "<div class='alert_red'>Осталась 1 попытка</div>" ;
}
if ( $row10 [ 'Kolvo_popitok' ] == 3)
{
$Stroka_dlya_formi = "<div class='alert_red'>Осталось 2 попытки</div>" ;
}
if ( $row10 [ 'Kolvo_popitok' ] == 2)
{
$Stroka_dlya_formi = "<div class='alert_green'>Осталось 3 попытки</div>" ;
}
if ( $row10 [ 'Kolvo_popitok' ] == 1)
{
$Stroka_dlya_formi = "<div class='alert_green'>Осталось 4 попытки</div>" ;
}
}
else
{
$Stroka_dlya_formi = "<div class='alert_green'>Осталось 5 попыток</div>" ;
}
require "forma-for-login.php" ;
}
function Plus_one_bad_popitka( )
{
$query4 = "SELECT * FROM `bad_popitki` WHERE `User_IP` = '" . $_SERVER [ 'REMOTE_ADDR' ] . "'" ;
{ # Если нашли IP, то обновляем время последней попытки
$query5 = "UPDATE `bad_popitki` SET `Time_of_last_attempt` = '" . time ( ) . "' WHERE `User_IP` = '" . $row4 [ 'User_IP' ] . "'" ; # и увеличиваем на 1 кл-во неудачных попыток
$query6 = "UPDATE `bad_popitki` SET `Kolvo_popitok` = '" . ( $row4 [ 'Kolvo_popitok' ] + 1 ) . "' WHERE `User_IP` = '" . $row4 [ 'User_IP' ] . "'" ;
}
else
{
# Если не нашли IP, то создаем новую запись
$query7 = "INSERT INTO `bad_popitki` (`User_IP`, `Time_of_last_attempt`, `Kolvo_popitok`) VALUES ('" . $_SERVER [ 'REMOTE_ADDR' ] . "','" . time ( ) . "','1')" ; }
}
?>
Файл forma-for-login.php. Форма авторизации.
PHP:
скопировать код в буфер обмена
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Авторизация</title>
</head>
<body>
<? echo $Stroka_dlya_formi ; ?>
<form method='POST'>
<input type='text' name='Auth_Name' class='input_text' size='25' maxlength='25'><br>
<input type='password' name='Auth_Pass' class='input_text' size='25' maxlength='25'><br>
<input type='submit' value='Вход' class='input_submit'>
</form>
</body>
</html>
Страниц (1): [1]
Powered by ExBB FM 1.0 RC1. InvisionExBB