imho.ws |
![]() |
![]() |
![]() |
# 1 |
Full Member
Регистрация: 19.12.2003
Адрес: Москва
Пол: Male
Сообщения: 514
![]() ![]() ![]() |
Безопасность в Php
Начал изучать PHP, но чую, без посторонней помощи не обойдётся
![]() Есть три варианта работы с административными скриптами: 1. Все они находятся в папке, к которой доступ ограничивается через .htaccess/.htpasswd. Сами скрипты прав доступа не проверяют. 2. .htaccess/.htpasswd отсутствуют, но скрипты требуют сначала ввести логин/пароль, после чего можно будет работать. 3. .htaccess/.htpasswd отсутствуют. Ввод пароля требуется, но одновременно с сеансом. Поясню. Предположим, есть форма для добавления новости на сайт. В варианте 2 потребуется сначала в отдельной формочке ввести логин/пароль, нажать "Вход", а потом спокойно добавлять новости безо всяких проверок. В варианте 3 сразу открывается форма добавления новости, но помимо неё есть ещё дополнительное поле для пароля, и новость будет добавлена только если введённый пароль верен. Варианты 2 и 3 ещё имеют подварианты: а) пароль проверяется напрямую (if $pwd == "password") б) проверка пароля идёт через хэш-код. Вопрос: какие уязвимости есть во всех этих вариантах и как с ними бороться? |
![]() |
![]() |
# 2 | ||
МОД-Оператор ЭВМ
Регистрация: 18.04.2002
Адрес: Питер
Сообщения: 4 343
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
Цитата:
PS: Юзай 1 способ. Дешево и сердито. Во 2 и 3 если на что и следует обратить внимание, так это на register_globals. |
||
![]() |
![]() |
# 3 |
Full Member
Регистрация: 19.12.2003
Адрес: Москва
Пол: Male
Сообщения: 514
![]() ![]() ![]() |
RaZEr
Ok, остановлюсь на первом (он мне сразу понравился как самый простой ![]() Можно поподробнее насчёт кривых рук? Не исключаю, что относительно PHP мои руки обладают сим печально известным свойством... Какие тут бывают грабли? Можно пару ссылочек подбросить, где подобные ситуации описаны? По Яндексам да Гуглям, конечно, немного пошуровал, но мало чего полезного смог найти. |
![]() |
![]() |
# 5 |
Full Member
Регистрация: 29.05.2002
Сообщения: 544
![]() ![]() ![]() ![]() ![]() |
на самом деле все зависит от реализации(2 и 3 вариант). если ты сделаешь нормальное хранение, проверку и сохранение во время сессии логина, пароля и события "logging in", то нет проблем.
можно например так: храним логин и пассворд в бд(только не в открытом виде). проверяем логин и пассворд на самой первой странице. если все совпало, заводим идентификатор юзера(например уникальное число типа int подлинее, например: 44855928592835982582). далее везде, где "ходит" залогинившийся юзер, во всех формах имеется скрытый input с этим числом. при каждом действии проверяется вошел ли он(путем проверки числа из формы и числа из базы), если совпадает, то все ок, если нет, то exit. при "выходе", число из базы стирается(при следующем заходе оно будет уже другое). естественно, что скрытый input подставляется динамически(ведь он каждый раз будет разным). а если человек попытается подделать число путем правки html, то у него ничего не выйдет, т.к. он не знает правильного числа в базе. второй вариант: на основе сессий. храним все в базе(как в первом варианте), только при логине устанавливаем некоторую сессионую переменную в true, например. и дальше на всех страницах проверяем эту переменную, а также откуда пришел человек(или откуда был редирект/запрос). такой подход менее надежен, но более прост в реализации. Последний раз редактировалось Sheryld; 07.06.2004 в 21:43. |
![]() |
![]() |
# 6 |
Junior Member
Регистрация: 10.05.2004
Сообщения: 111
![]() |
1-й способ хорош только когда пароль правильный (набор букв и цифр не менее 8 символов) .... если пользовать какое нть обычное слово, то ломается перебором по словарю .... так-же он еще ломается снифером (если в одной подсети) ....
Мое имхо: Лучше пользовать как например сделано в vBulletin3 ... при регистрации пароль отправляется не прямум текстом, а захэшированный MD5 с помощью JavaScript .... далее выдается пользователю в куки ID сессии и юзер работает ... после определенного времени неактивности ID сессии на сервере обнуляется ... |
![]() |
![]() |
# 7 |
Full Member
Регистрация: 19.12.2003
Адрес: Москва
Пол: Male
Сообщения: 514
![]() ![]() ![]() |
Sheryld
Примерно понял, спасибо. На будущее запомню. ГеныЧ Ну пароль-то я сгенерю... А вот передачей его на сервер я не управляю, вся обработка .htaccess/.htpasswd не мной делается, а по всей видимости, Апачем, то бишь настраивается хостером... |
![]() |
![]() |
# 8 |
Junior Member
Регистрация: 10.05.2004
Сообщения: 111
![]() |
С помощью .htaccess/.htpasswd логин:пароль на сервер при каждом запросе передается практически напрямую ... кодируется base64, но разве это шифрование? ...
![]() Надежней всего шифрованый канал связи иметь (https если позволяет) ... ![]() |
![]() |
![]() |
# 10 |
МОД-Оператор ЭВМ
Регистрация: 18.04.2002
Адрес: Питер
Сообщения: 4 343
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Раз уж мы решили углубиться в полемику абсолютных защит, то вот такая интересная задачка: Есть у нас пароли в базе, которые необходимо высылать на почтовый адрес пользователя в случае необходимости (забыл). Генерировать случайные пароли нельзя, так как злоумышленнику может стать известен e-mail пользователя и он может многократно инициировать такую смену пароля. Как результат нужно высылать текущий пароль, но при этом существует вероятность утечки данных из базы (сервер сломали), которая может подорвать безопасность всей системы. Какие мысли?
|
![]() |
![]() |
# 11 |
Full Member
Регистрация: 19.12.2003
Адрес: Москва
Пол: Male
Сообщения: 514
![]() ![]() ![]() |
RaZEr
Мне кажется, выходом мог бы стать вариант с активацией: При запросе клиенту шлётся письмо с уникальным сгенерённым числом. Клиент идёт по определённому адресу, вводит это число (или сразу в письме готовая ссылка), и только после этого генерится новый пароль и отсылается клиенту. |
![]() |
![]() |
# 14 |
Full Member
Регистрация: 19.12.2003
Адрес: Москва
Пол: Male
Сообщения: 514
![]() ![]() ![]() |
VIRT
Если он пользуется чужим мылом, то он в любом случае получит пароль - сгенерён он, или восстановлен. Имелось в виду, что злоумышленник знает почтовый адрес клиента и может кучу раз делать перегенерацию пароля, что весьма неприятно для клиента... |
![]() |
![]() |
# 17 | |
Guest
Сообщения: n/a
|
Цитата:
![]() Кстать, сейчас модняво делать ники и логины. Например на форуме ник VIRT, а для авторизаци используется логин йцукен+пароль. Злоумышленнику надо знать логин который, в отличии от ника, нигде не публикуется. |
|
![]() |
# 18 | |
МОД-Оператор ЭВМ
Регистрация: 18.04.2002
Адрес: Питер
Сообщения: 4 343
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Цитата:
|
|
![]() |
![]() |
# 19 |
Guest
Сообщения: n/a
|
Я делал очень сложную защиту. Мускулы нету ваще. Всеч ерез конф файл идет + md5
Тоесть пользователь вводит логин и пароль и попадает в свой аккаунт. И данные переходят через ?totot=totototototototototototototototo И все а в ссчлках стоит просто QUERY_STRING Получается взломать невозможно, если тока не хакнуть конфиг файл. Естественно в аккаунте стоит проверка isset, if Тоесть простое сравнение. Конечно попотеть пришлось, но работает нормально. Главное права правильные ставить |
![]() |
# 20 | |
::VIP::
Регистрация: 12.11.2002
Адрес: Nicosia, Cyprus
Сообщения: 1 285
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
PASHAN
А от банального брутфорса эта очень сложная защита как защищалась? Цитата:
__________________
"If people only knew how hard I work to gain my mastery, it wouldn't seem so wonderful at all." Michelangelo Buonarroti |
|
![]() |