Выбрать главу

• остальное заменить знаками подчеркивания

• и заменить подряд идущие подчеркивания на одно

Это можно сделать примерно так:

Во избежание злоупотребления возможностью загрузки файлов надо ввести квоты и назначить максимальный размер файла. Отказывайтесь обрабатывать запрос, если клиент умалчивает о размере данных (не передает поле CONTENT_LENGTH).

Не давайте закачивать или управлять файлами за пределами строго определенных директорий. Остерегайтесь приема полных путей и символов конвейера ( | ) и перенаправления ввода/вывода (<, <<, >, >>). Там, где можно обойтись без обращения к оболочке, потенциально безопаснее так и сделать.

20.

Ускорители для Perl, такие как SpeedyCGI http://daemoninc.com/SpeedyCGI/, mod_perl http://perl.apache.org/, FastCGI http://www.fastcgi.com/ – это ваши друзья, но таящие в себе угрозу: глобальные переменные сохраняют значение между обращениями. Если в обычном режиме вы рассчитываете, что они изначально не инициализированы (то есть при обращении неявно приводятся к нулю либо к пустой строке), то под ускорителями они могут незаметно для вас стать уязвимым местом, храня что-либо с предыдущего вызова скрипта. Об этом настойчиво предупреждают в документации к каждому из таких ускорителей, но сказать еще раз лишним не будет.

Правило: трижды убедитесь в том, что глобальные переменные обнуляются перед использованием.

21.

Не позволяйте роботам ходить по ссылкам, для них не предназначенным. Информацию, которую вы не хотите отдавать на индексирование роботам-паукам, можно обозначить тегом noindex:

Всю страницу можно пометить как неиндексируемую, добавив в заголовок HTTP-ответа:

Аналог этого поля в HTML:

Еще один вариант не индексировать страницу средствами HTML:

Запретить роботам переходить по ссылкам на странице:

Используйте robots.txt http://robotstxt.org.ru/. Пустой robots.txt лучше, чем его отсутствие, так как роботы в любом случае его запрашивают. Ни к чему захламлять логи веб-сервера ложными ошибками 404. Это касается и файла favicon.ico http://favicon.ru/faq/. Если у вас его до сих пор нет, может пришла пора его создать? Пустой robots.txt равносилен заявлению «индексировать можно все».

22.

Настройте Apache так, чтобы он рассказывал о себе как можно меньше. Эти параметры в конфиге регулируют вывод версии сервера и установленных модулей на некоторые служебные страницы и в HTTP-заголовки:

23.

Есть модуль для Apache mod_security http://www.modsecurity.org/. По принципу работы он является одновременно прокси-сервером и фаерволлом для протокола HTTP.

Это модуль, который позволяет создавать правила проверки запросов до того, как они обработаются скриптами, и фильтрации ответов после отработки скриптов.

Например, можно раз и навсегда защититься от SQL-Injection в параметре с именем id, если вы будете придерживаться правила использовать его только для передачи числа, то есть создадите правило, что id в запросе должно быть числом и ничем иным. Можно также указать диапазон допустимых символов в запросе. Используя регулярные выражения можно добиться достаточно гибкой фильтрации. Модуль умеет произвольно реагировать на несоблюдение правил, его можно, к примеру, настроить так, чтобы злоумышленник после нескольких неудачных попыток сломать сайт банился бы по IP или ему показывалась заданная страница. Приятная особенность: mod_security умеет фильтровать и вести логи POST-запросов.

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

Модуль может обрабатывать практически любой аспект взаимодействия с веб-сервером, он настолько мощен, что его просто нельзя описать кратко, он достоин скорее отдельной статьи, или даже книги.

24.

Принимайте меры против подбора пароля.

Задержка входа – простейший, но при этом уже достаточно неслабый способ. Сведет на нет ручной перебор и автоматический однопоточный перебор с одного компьютера.

Против многопоточного перебора поможет ограничение количества неудачных попыток войти под одним и тем же логином в течение определенного промежутка времени. После их превышения срабатывает временная блокировка логина. Отправная точка – пять попыток за три минуты (это и слишком жесткие правила для целесообразности автоматического подбора хорошего пароля и сносная пауза для человека, если он опечатался несколько раз подряд).

Храните неудачные попытки входа примерно в такой табличке:

login datetime
 vasya   25.12.2007 09:08:57 
 test   25.12.2007 09:09:06 
 admin   25.12.2007 09:09:31 
 admin   25.12.2007 09:09:39 
 admin   25.12.2007 09:09:50 
 admin   25.12.2007 09:10:06 
 admin   25.12.2007 09:10:22 
 …   … 

При очередной неудачной попытке опросите табличку на предмет ранее зарегистрированных попыток в течение тех самых трёх минут. В этом примере видно, что пора блокировать на некоторое время логин admin, чтобы пресечь дальнейший перебор.

Жестоко? Ничуть. Как сказал один мой коллега: «Не можешь ввести пароль за пять попыток – иди проспись». Весьма метко. Только представьте себе человека, которому пять попыток ввода пароля не принесли успеха. В таком состоянии он сам может стать угрозой. А если он забыл пароль, будет время попытаться вспомнить, спокойно и неторопливо.

Это не идеальный вариант, так как злоумышленник может догадаться намеренно производить попытки входа и тем самым по сути блокировать возможность входа хозяина логина.

Против распределённого перебора паролей с разных компьютеров поможет ограничение количества неудачных входов в единицу времени с одного IP. При нарушении на время блокируется связка IP-логин. Это заодно решает проблему с намеренной блокировкой логина: самое страшное, что может случится после блокировки – admin не сможет войти в течение пяти минут всего лишь на одном компьютере.

ip login datetime
 192.168.0.15   vasya   25.12.2007 09:08:57 
 192.168.0.17   test   25.12.2007 09:09:06 
 192.168.0.10   admin   25.12.2007 09:09:31 
 192.168.0.10   admin   25.12.2007 09:09:39 
 192.168.0.10   admin   25.12.2007 09:09:50 
 192.168.0.10   admin   25.12.2007 09:10:06 
 192.168.0.10   admin   25.12.2007 09:10:22 
 …   …   … 

Против использования прокси-серверов для перебора паролей поможет ограничение на количество неудачных входов при наличии в запросе заголовков, характерных для прокси. В этом случае следует временно заблокировать возможность произвести попытку входа с любого прокси.

proxy_ip datetime
 192.168.0.1   25.12.2007 09:08:57 
 192.168.1.1   25.12.2007 09:09:06 
 192.168.1.1   25.12.2007 09:09:50 
 192.168.4.1   25.12.2007 09:10:06 
 192.168.0.1   25.12.2007 09:10:22 
 …   …