Sadda.ru Ironetcart Андроид Ассемблер MASM32 Linux Все статьи Table of Contents


 

Статическая защита форм

  Макс Петров Март 2014

      Строго говоря, защите от доступа роботов подлежат не формы, а скрипты. Но вредоносному роботу, для того, чтобы совершить удачную атаку на php-скрипт, необходимо знать, во-первых, адрес этого php-скрипта, во-вторых, состав информации, которая должна быть скрипту передана. Все это робот-спамщик легко прочитает из кода html-формы, в том случае, если этот код никак не защищен (не зашифрован).

      Памятуя о том, что конечной задачей является все же защита скрипта, тем не менее, выделим в этой задаче "передний край обороны", который и назовем защитой форм. Под защитой форм будем понимать меры, направленные на затруднение получения роботом из html-формы информации для атаки на скрипт. Защита форм сводится к "спрятыванию" кода форм или их отдельных полей или, даже наоборот, в "подсовывании" роботу полей-ловушек, которые не видны человеку, но видны роботу.

      Подсовывать роботу поля-ловушки можно, например, при помощи такой конструкции:

<span style="display:none;"> <input type=text maxlength=25 size=25 name=superparol> </span>

где <input type=text maxlength=25 size=25 name=superparol> - этот и есть ловушка, адресованная роботам. Скорее всего, прочитав такой код, робот пошлет скрипту переменную с именем "superparol" с произвольным значением, тем самым выдаст себя. Ведь роботы не знают css-стилей. Скрипт, исходя из имен и значений переданных ему данных, должен распознать робота и прекратить выполнение.

* * *

      Примем за аксиому, что созданные хакерами роботы-спамщики не обладают способностью понимать javascript. Разработка интерпретатора (в том числе javascript), требует продолжительных усилий коллектива квалифицированных программистов, это совершенно другой (не хакерский) уровень организации программистского труда.

      Вот код формы:

... <body> ... <form name=myform method=POST action=myscript.php> Логин: <input type=text maxlength=25 size=25 name=login> <br> Пароль: <input type=password maxlength=25 size=25 name=parol> <br> <input type=Submit value=Войти> <input type=Reset value=Очистить> </form> ... </body> ...

      Вот так эта форма выглядит в браузере:

Логин:
Пароль:

      Спам-робот, перейдя на страницу с подобным незащищенным html-кодом, по тегам легко определит адрес скрипта и имена переменных, которые должен получать скрипт.

      Спрячем форму за javascript-ом. Теперь html-код будет выглядеть так:

... <head> ... <script type="text/javascript" language="JavaScript" src="/mydir/myfile.js"> ... </head> ... <body> ... <script language="JavaScript"> myfunc(); document.write(a1+a2+a3+a4+a5+a6); </script> ... </body> ...

      В файле myfile.js апишем следующее:

function myfunc() { a1 = "<form name=sign action=postsign.php method=post>"; a2 = "Логин: <input type=text maxlength=25 size=25 name=login><br>"; a3 = "Пароль: <input type=password maxlength=25 size=25 name=parol><br>"; a4 = "<input type=Submit value=Войти>"; a5 = "<input type=Reset value=Очистить>"; a6 = "</form>"; }

      В результате, пользователь сайта получит ту же самую форму, которую браузер выстроит из javascript-а, однако, спам-робот кода формы в html-коде просто не увидит.

      Понятно, что робот может быть обучен просмотру файлов, подгрузка которых назначена в заголовочной части html-страницы. Если робот прочитает файл myfile.js, просто, как текст (не выполняя javascript), всю информацию, которую мы пытались от робота спрятать, робот у нас выкрадет. Поэтому, пойдем немного дальше и запрячем в файле myfile.js тег <form>, содержащий адрес php-скрипта, в "настоящий" javascript:

function myfunc() { var crip = "=gpsn!obnf>nzgpsn!nfuipe>QPTU!bdujpo>nztdsjqu/qiq?"; a1="";for(i=0;i<crip.length;i++) {a1+=String.fromCharCode(crip.charCodeAt(i)-1);} a2 = "Логин: <input type=text maxlength=25 size=25 name=login><br>"; a3 = "Пароль: <input type=password maxlength=25 size=25 name=parol><br>"; a4 = "<input type=Submit value=Войти>"; a5 = "<input type=Reset value=Очистить>"; a6 = "</form>"; }

      Здесь делается следующее. Строка

=gpsn!obnf>nzgpsn!nfuipe>QPTU!bdujpo>nztdsjqu/qiq?
тождественна строке
<form name=sign action=postsign.php method=post>
за тем исключением, что в последней к каждому коду символа (к каждому байту) добавлена единица. Javascript выполняет обратное действие - отнимает от каждого байта зашифрованной строки единицу, тем самым восстанавливает исходный вид строки.

      Защита форм может быть статической (неизменный шифрокод) и динамической (шифрокод меняется - генерируется специальным скриптом, например, один раз в сутки). Статическая защита, в том варианте, который был изложен выше, надежно работает против случайно забредших на сайт (форум) роботов-спамщиков. Если же статическую защиту форм мы планируем встраивать в свободно распространяемый движок, то ее дальнейшее усиление тем более не будет иметь смысла. Когда хакер поставит себе целью заспамить форум на нашем движке, хакер не будет обучать своих ботов javascript-у, а поступит проще - начнет с внимательного анализа нашего кода, в итоге даст своим роботам тупые, но действенные инструкции о составе полей форм и об адресах php-скриптов на нашем сайте или форуме.



Ironetcart

      Техническая поддержка: http://ironburattin.ru
      Взять движок: Форум на файлах «Ironetcart» (скачать)

      Разработка форумного движка
      Форум «Железный Бураттин» (название и концепция)
      Статическая защита форм
      Идеальная капча
      Как я победил магические кавычки
      Внеклавиатурные символы HTML
      Хранимые XSS-атаки и защита от них (удаляем javascript из html в браузере)
      Защита визуального html-редактора (фильтрация HTML на стороне сервера)
      Скорость движка форума: файлы или база данных
      Прогресс-бар на PHP
      Зачем тупому форуму поиск?

     


© Max Petrov При использовании материалов ссылка на sadda.ru обязательна