У меня на всех сайтах есть один и тот же файл, который рисует капчу и таким образом, гарантирует, что сообщения оставляются именно человеком, а не компьютером. Но я допустил одну маленькую ошибку, благодаря которой все мои усилия пошли прахом, а обойти защиту стало очень просто. Как все произошло? Банальная забывчивость сделать значение по умолчанию. Я прекрасно знаю о таких проблемах и тут сам попался на банальную ошибку. Ну ничего, это будет мне лишним уроком на будущее.
На сайте есть форма для ввода сообщения и при ее генерирования вызывается PHP файл, который рисует капчу и сохраняет в сессии нарисованный код. Казалось бы, из сессии код вычислить невозможно, но спамерам оказалось это и не нужным. Достаточно всего лишь создать форму у себя на компьютере и перенаправить ее так, чтобы он отправляла результат скрипту на сайте. При этом убирается ссылка на капчу, а значит, сценарий не сохранит в сессии ничего и секретный код будет пустим.
Мой сценарий на сервере производит проверку:
if (Секретный код из сессии == То, что прислал юзер) { Все прекрасно }
Так как файл рисования капчи не вызывался, левая часть условия пустая. Хакеру или спамеру остается только передать пустое значение в параметре, который должен был бы содержать капчу, и любой мат попадал в базу. Проблема решается двумя способами. Первый – подправить проверку на пустое значение, ведь нарисованный код не может и не должен быть пустым:
if (Секретный код из сессии == То, что прислал юзер && Секретный код из сессии !="") { Все прекрасно }
Я предпочитаю глобально решать проблему, поэтому у меня есть файл безопасности, который подключается везде. Достаточно там прописать значение по умолчанию:
if (Секретный код из сессии =="") { Секретный код из сессии ="AAAA" }
Теперь, если хакер или спамер отправит мне форму без обращения к файлу рисования капчи и секретный код в сессии останется пустым, я его меняю на нереальный и проверка не пройдет.
Я не стесняюсь своих ошибок, я даже люблю их, потому что они очень хорошо учат и теперь надолго заставят меня быть внимательнее с такой детской проблемой, как значение по умолчанию. Надеюсь, что научат и тебя, потому что учиться лучше не на своих ошибках, а на чужих :).
Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым
Нормально безопасность самое главное, а то спамеры будут засорять бд.
А при втором способе решения проблемы юзер не может прислать код "AAAA" и обойти?
Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.