Безопасность скриптов

Фанат

oncle terrible
Команда форума
Безопасность скриптов

интересуюсь мнением уважаемого сообщества по поводу этой статьи
http://phpfaq.ru/safety

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

jonjonson

Охренеть
Касательно XSS можно добавить, что это атака не напрямую на скрипт на сервере, а на клиента. Осуществляется за счёт специально сформированного JavaScript или ссылки на внешний скрипт ("активный" и "пассивный" XSS). "Активный" XSS восновном нацелен на похищение сессионного id, а "пассивный" - на выполнение нужного действия, например, смена пароля на известный злоумышленнику.

От "активного" защита - "обезвреживание" JavaScript, а от "пассивного" - передача в формах идентификатора текущего авторизованного пользователя и проверка его наличия при обработке формы.
 

Popoff

popoff.donetsk.ua
Основной принцип написания безопасных программ - это контроль данных, приходящих от пользователя.
Может, имеет смысл как-то сразу записать мысль, что нужно контролировать не только данные, приходящие от пользователя, но, по возможности, вообще все данные. Как-то увязать это с SQL-инъекциями второго порядка и вообще сказать, что, в принципе, очень многие виды атак бывают не только первого, но и второго порядка. Иначе часто рассуждают в духе: "Ага! Эти данные не пришли от пользователя, они получены из безопасной базы данных (безопасной сессии и т.п.)!"

Можно также было бы добавить, что любая уязвимость - это *всегда* ошибка (как умышленная ошибка, как, например, с EVAL, когда человека предупреждали, а он не верил, так и неумышленная, когда, к примеру, забыли кавычки поставить при экранировании кавычек в SQL-запросе). То есть, задача поиска и исправления уязвимостей является частным случаем задачи поиска и исправления ошибок в программе. Можно было бы даже сказать, что любая ошибка - это потенциальная дыра в безопасности. Как вытекающий совет - вести логи всех ошибок, всегда реагировать на наличие ошибок и исправлять их.

Может, было бы полезно указать на то, что существут отличия между виртуальными и физическими файлами и для обращения к физическим файлам виртуальное имя, пришедшее от пользователя, никогда прямо использовать не нужно, а всегда реконструировать его из данных, полученных из других источников (например, хотя бы из БД) или ещё лучше делать физическое имя полностью независимым от виртуального - например, строить физическое имя только на основании числового идентификатора соответствующей записи в базе данных (типа 00/00/00/00/01.bin).

По поводу SQL-инъекции второго порядка, может, написать более выпуклые примеры, что данные могли быть взяты из БД, из сессии. Иначе обобщённое "уже лежащие на сервере" смотрится очень впукло (почти незаметно).

По поводу EVAL многих приходится уговаривать, что пользоваться им не нужно. Возражения типа "а как же ш мне тогда посчитать формулу а+б - иначе ж не возможно..." - это обычные возражения. Может, имеет смысл как-то тут указать, что в большинстве случаев эта функция используется *исключительно только* для уменьшения труда программистов, для которых это самое уменьшение труда *важнее* безопасности. И указать к примеру, мой пример про сложение и сказать, что более трудоёмко, зато безопасно - написать собственный или взять один из готовых калькуляторов.

В качестве отдельного раздела можно было бы указать на некоторые психологические особенности обеспечения безопасности:
- часто считают, что опасности нет, если о ней не думать. Пример с EVAL - яркий пример. Программисты, утверждающие, что ошибка не является дырой в безопасности, действуют примерно по такому же принципу. Думаю, в первую очередь подобным "страусиным" поведением прикрывается нежелание приложить усилия к обеспечению безопасности;
- не менее часто считают, что невозможно приложить слишком много усилий для обеспечения безопасности. В таком случае получается безопасная программа, которой невозможно пользоваться, так как в ней запрещено абсолютно всё. Тут можно было бы явно указать на то, что очень часто приходится искать компромисс между безопасностью и удобством использования, и что слишком жёсткие меры обеспечения безопасности не всегда оправданы;
- сильно часто путают действительно опасные вещи (уязвимости XSS, SQL-инъекция) с "яркими опасностями" (например, кража пароля, удаление базы данных и т.п.). То есть, считают, что чем "ярче" уязвимость (часто "ярче" означает "понятнее суть этой уязвимости"), тем она опаснее. И думать начинают, соответственно, не о том, что действительно может помочь обеспечению безопасности (то есть, к примеру, об одних только кавычках и слешах в случае SQL-инъекции), а обо всех опасностях, порождаемых этой инъекцией сразу (то есть, сразу пытаются думать и о паролях, и об удалении базы данных, воспринимая их как совершенно разные виды опаностей). Это и понятно, кража пароля - это гораздо интереснее и занятнее кавычек и слешей. Результат часто состоит в том, что вместо того, чтобы исправить причину (то есть, поставить кавычки и слеши), начинают говорить огород для каждой опасности отдельно (в случае с EVAL, например, проверяют все возможные входящие данные, которые могут привести к ошибке, вместо того, чтобы избавиться от самого EVAL).

применения. практически
применения. Практически

идентификатора. подробнее
идентификатора. Подробнее

Ссылки:
http://www.securitylab.ru/

Анализ уязвимостей в веб приложениях за 2007 и 1 квартал 2008 г.
http://www.securitylab.ru/analytics/313489.php
http://www.securitylab.ru/analytics/351464.php

http://www.securitylab.ru/analytics/293535.php - об MX-инъекциях

http://www.securitylab.ru/analytics/216311.php - На эту статью, может, не надо давать прямую ссылку - из-за размещённых там утилит для тестирования, которые не нужны начинающим. Но её можно посмотреть с точки зрения других аспектов безопасности.

http://www.securitylab.ru/analytics/216332.php - подробнее об СКЛ-инъекции. В общем-то, все выводы о том, как защититься, можно сделать из первой части этой статьи. Вторая часть только ещё подробнее описывает, как можно эксплуатировать СКЛ-инъекции.

http://www.cgisecurity.com/articles/xss-faq.shtml

Вот тут по поводу защиты Апаче:
http://www.securitylab.ru/analytics/216358.php

цикл статей по психологии безопасности:
http://www.securitylab.ru/analytics/350799.php
 

Farsh

~ on ~ high ~ wave ~
[offtop]
В первом предложении "небольшой" пишется слитно ;)
( если я ещё не забыл русский язык )
[/offtop]
 

Popoff

popoff.donetsk.ua
Ещё есть важный принцип - если неправильное данное невозможно ввести в форму в браузере, то это совсем не означает, что не найдётся умелец, который возмёт и напишет скрипт для отправки формы с любыми данными, в том числе и с переносами на новую строку. Как вывод можно написать о том, что не достаточно проверки в браузере.

-~{}~ 29.04.08 14:17:

И про куки можно указать - если мы говорим о ликбезе, то эта очевидная вещь тоже не всем ясна :)

-~{}~ 29.04.08 14:19:

Farsh
Раздельно. Потому что он хотел сказать, что он "не является большим специалистом". В твоём варианте получится, что он "является маленьким специалистом".
 

whirlwind

TDD infected, paranoid
У меня такое предложение по поводу SQL-Injection. ИМХО, обсасывание и переливание из пустого в порожнее этой темы ничего хорошего не принесет. Сами посмотрите http://phpfaq.ru/slashes - какой чайник, которому лень даже в мануал заглянуть, будет читать и переваривать такую объемную статью? В лучшем случае получим кучу addslashes распиханных по всему проекту в разных местах, котрые способны запутать не только чайника. По моему давно пора решать эту проблему за счет проверенных временем средств, то есть драйверов БД с поддержкой плейсхолдеров. Просто разместить ссылки на наиболее популярные драйверы. Это в любом случае будет полезно. Меньше отсебятины - меньше багов.
 

ys

отодвинутый новичок
Вот предложение из раздела "Заливка файлов на сервер" я совсем не понял. У меня сервер чхать хотел на расширение файла.
 

kruglov

Новичок
ys
В смысле чихать? А как у вас сервер понимает, что в .php надо скрипты выполнять, а в .html - нет?
 

ys

отодвинутый новичок
kruglov
Очень просто.
Я эти "присланные пользователем" имена никогда не использую.
Все присланные файлы складываются и именуются отдельно.
Ну иногда в базе храню "присланное пользователем" имя файла да и только.

Или я не понял про какую "заливку" идет речь?
Хотя вроде про ту самую.
 

kruglov

Новичок
ys
Не, оно, конечно, пожалста. Только это уже не сервер чихает, а скрипт-обработчик загрузки.
 

ys

отодвинутый новичок
kruglov

Ну да, файл без обработчика вообще не "залить" на сервер.
 

Фанат

oncle terrible
Команда форума
А вот, кстати, я хотел этот вопрос тоже поднять
Дело в том, что использование реферера представляется мне весьма ненадежным решением
 

kruglov

Новичок
Фанат
При логине генерим случайную строку, пишем в сессию.
Приделываем к формам в хиддены. Сверяем с сессией при самбите.

А то можно и сам идентификатор сессии из кук брать и в хидден писать, по-моему, безопасность не страдает.
 

Popoff

popoff.donetsk.ua
kruglov
Глючит этот способ часто, как и проверка рефереров.
То рефереры у людей не передаются, то сессии не держатся, то вообще непонятное ПО для "повышения защиты" юзается.
Применять нужно только если действительно нужно.
На форме голосования, к примеру, я пробывал прикрутить штутку - так мне начали часто жаловаться, что не работает форма. При анализе каждый раз выяснялось, что проблемы у юзера. Не прижилась, в общем у меня эта штука, а потом я подумал и решил выкинуть - проблемы она иногда приносит, а от чего конкретно защищает - не совсем ясно.
 

Фанат

oncle terrible
Команда форума
Popoff
речь идет об авторизованных юзерах или просто с улицы?
 

Popoff

popoff.donetsk.ua
*****
Я попутал.
Я, конечно, говорил о юзерах с улицы.
Но в любом случае не совсем ясно, от чего конкретно мы защищаемся таким способом.
 

Фанат

oncle terrible
Команда форума
хороший вопрос. меня он тоже интересует
ты считаешь, что форжестовой демонстрации недостаточно?
 

fixxxer

К.О.
Партнер клуба
"с улицы" = неавторизованный? а нефиг тогда без капчи постить. для авторизованных - хидден, по поводу реферера ваще следует полагать что его никогда нет, он годится только для статистики. ну а для случаев типа "подсунули книжку для геев в корзину инет магазина" - точно так же хидден поле - сессия то у нас уже полюбак есть. если уж параноить.

там где про инициализацию переменных - ваще при error_reporting E_ALL такое не пройдет незамеченным, а при error_reporting ниже надо уже кастрировать руки и отрывать яйца

про аплоад проверку расширения не совсем понял. :) а не пофиг ли на расширение то. по сигнатурам проверять надо. или это к тому, с каким именем мы пишем? так это ваще нефиг сохранять оригинальное имя, разве что гденить в базе.

насчет замечаний про "валидацию в браузере" вспомнил веселую историю. один асп-программист написал чего-то там, интернет магазин кажется, не помню. я первым делом сунул кавычку в форму поиска, увидел ясно что, и посоветовал ему это дело поправить. ну, поправил - говорит он - смотри. смотрю, одинхрен. смотрю надо заметить в мозилле. что же думаю он поправил то. смотрю view source, вижу... VbScript на onSubmit ;)
 
Сверху