November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
Saturday, February 4th, 2006 12:10 am
Темой сегодняшней лекции для веб-девелоперов будет одна простая мысль,
а именно: никогда не доверяйте данным, полученным от пользователя. НИКОГДА.

Вот, собственно, и всё.
Удивительно, но этой мыслью настолько часто пренебрегают, что я начал сомневаться в ее очевидности.

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

Если в некотором поле должно быть число - проверьте, правда ли там число. Или просто сразу запустите функцию преобразования в число. Если оно должно быть в определенном диапазоне или, например, неотрицательным, проверьте это.

Если в поле должен быть (не дай бог!) номер кредитной карты, убедитесь, что там правильно количество цифр, и ничего кроме них.

Если в поле должна быть фамилия, проверьте, что там встречаются исключительно буквы. Максимум - пробелы. Но не цифры и не вопросительные знаки.

И не надейтесь, что J. Random Hacker впишет в поле nickname именно свой nickname из букв и цифр, а не javascript. Лучше проверьте.

Если в поле должен быть URL, то проверьте его на допустимость значения (абсолютный, относительный, с правильным хостом, расширением и допустимым набором символов). А то будет, как на сайте Интерпола.

Ну и так далее.

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

Не забывайте о hidden полях. И ни в коем случае не передавайте через них чувствительные данные. Злой хакер может не только посмотреть, чтО там написано, но и (сюрприз!) подделать и значения hidden полей, и куки, и Referer, и User-Agent, и вообще ВСЁ, что передаётся на сервер. Кроме, разве что, IP-адреса.

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

Наконец, если в форме предумотрена передача данных методом POST, то не надо обрабатывать параметры, переданные методом GET. Потому что это ненормально. И вообще, по возможности не используйте GET, у него и так много недостатков.


Вот, примерно так.


Upd: те же гениталии, вид с другого ракурса, то есть, применительно конкретно к PHP: http://www.citforum.ru/internet/securities/phpsecure.shtml
Saturday, February 4th, 2006 09:57 am (UTC)
Подавляющее большинство проверок, о которых ты написал - правильные RDBMS (например, Оракл :) умеют производить самостоятельно, на уровне constraint'ов. Вывод: юзайте правильные БД, и они изрядную часть девелоперской работы сделают за вас вами :).
Saturday, February 4th, 2006 11:23 am (UTC)
ага
и констрайнты они тоже в схему базы сами автомагически вставляют :)
Saturday, February 4th, 2006 12:38 pm (UTC)
Ну, тут уж придется-таки потрудиться самому... :)
Saturday, February 4th, 2006 08:09 pm (UTC)
Иногда базы вовсе и нет. Вот тут статеечка любопытная про javascript-injection:
http://www.nth-dimension.org.uk/news/entry.php?e=156579087