|
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
|
|||
---|---|---|---|
#18+
HOT TIP №1 Кодируйте ввод пользователя перед тем, как вывести его на страницу – или куда-нибудь ещё! ЯЗЫК: C# ВЕРСИИ ASP.NET: 1.0 | 1.1 АВТОР: Jeff Prosise, http://www.aspnetpro.com/ ПЕРЕВОД: hDrummer Превратите «плохой» ввод пользователя в «хороший», чтобы предотвратить взлом вашего веб-сервера. Перед вами простая ASP.NET веб-страница – одна из тех, что показывают персонифицированное приветствие, состоящее из «Привет» с последующим добавлением имени пользователя, ввеённое им же, в ответ на нажатие кнопки «Нажми меня». Несмотря на свою простоту, страница содержит потенциально фатальную «дырку», с помощью которой могут быть поставлены под угрузу cookie, ваш веб-сервер и даже другие компьютеры, находящиеся за вашим брандмауэром. Найдёти ли вы эту «дыру»? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Если вы подумали, что «дыра» касается строки, введённой пользователем, ваша мысль верна. Веб-страница никогда, НИ ПРИ КАКИХ УСЛОВИЯХ, не должна использовать необработанный пользовательский ввод. Почему? Потому что в этом случае страница становится восприимчивой к кросс-сайт скриптовым атакам (to cross-site scripting (XSS) attacks). Для демонстрации этого, запустите страницу и наберите следующий текст в поле ввода: Код: plaintext
Нажмите кнопку «Нажми меня» и окно с сообщением появится в вашем браузере. Проблема? Когда вы нажали на кнопку, браузер интерпретировал ввод, как часть кода, которую необходимо выполнить. И если этот скрипт достаточно безвреден, то хакеры могут ввести далеко не такие безвредные скрипты. Даже написав такую простую страницу как эта, нельзя быть уверенным, что все посетители будут использовать её так, как вы задумали. (Заметьте, что если вы используете страницу с ASP.NET 1.1, ва надо будет добавить директиву <%@ Page ValidateRequest="false" %> вверху вашей страницы, чтобы увидеть окно с сообщением.) Прим. переводчика: Честно говоря после этой поправки лично для меня ценность этого HotTip’a для меня значительно упала, но раз уж начал переводить, доведу дело до конца. Решение проблемы довольно простое. Перед тем как отображать ввод пользователя на странице, используйте метод Server.HtmlEncode для HTML-кодирования этого ввода. Следующая страница функционально эквивалентна предыдущей, однако, благодаря HTML-кодированию, текст пользователя меняется пред выводом на страницу. Например, символы <> превращаются в < и > - что неприемлемо для XSS-атакующего. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Помните: пользовательский ввод является вредоносным по умолчанию и должен рассматриваться именно с этой точки зрения. Server.HtmlEncode превращает «плохой» пользовательский ввод в «хороший» и, может быть, спасёт ваш веб-сервер от взлома – или чего-нибудь похуже. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2003, 15:50 |
|
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
|
|||
---|---|---|---|
#18+
Вобщем, если эта идея понравилась, то буду стараться каждую пятницу выкладывать по HotTip'y. Если есть желающие присоединиться - you are welcome. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2003, 15:53 |
|
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
|
|||
---|---|---|---|
#18+
Есть ощущение, что никому, кроме сябя самого, такой хакер не навредит. Почему - да потому, что исполнится введенный скрипт на клиентской стороне. Гыгыгы. А у кого эта клиентская сторона? Правильно - у хакера Так что пусть пишут хоть формат с://, только потом пусть не удивляются, почему у них же диск снесло :) -- Tygra's -- ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2003, 16:32 |
|
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
|
|||
---|---|---|---|
#18+
Вообще-то к концу перевода у меня сложилось мнение, что у автора статьи паранойя. Не потому, что статья такой направленности, а потому, что стиль изложения несколько параноидальный ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2003, 16:57 |
|
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
|
|||
---|---|---|---|
#18+
м.б. тут скорее SQL code injection'a надо бояться, а не клиентских скриптов... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2003, 18:12 |
|
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
|
|||
---|---|---|---|
#18+
Тут речь о CSS - Cross Site Scripting и Data Tampering Личного опыта у меня нет, но по слухам <%@ Page ValidateRequest="false" %> иногда фильрует и "правильный" ввод пользователя. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2003, 11:30 |
|
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
|
|||
---|---|---|---|
#18+
Оно конечно выполняется на стороне клиента, но вот представим ситуацию гостевая книга или форум, пользователь вводит такой небольшой скриптик , а потом каждому кто твою гостевую пытается читать приходит приглашение на другой сайт, или просто или еще что :) Оно все на стороне клиента, но достаточно для вреда. tygra: Ага, пропишет он этот формат, и у каждого кто эту гостевушку потом откроет форматнется :) :) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.12.2003, 17:45 |
|
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
|
|||
---|---|---|---|
#18+
Да, действительно. Всё это безобидно до тех пор, пока не пишется в СУБД и не выводится где-то для других посетителей. Тот же алерт можно влепить в цикле с какой-нибудь нецензурщиной - и посещаемость сайта резко упадёт :((( ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2003, 12:07 |
|
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
|
|||
---|---|---|---|
#18+
авторОно конечно выполняется на стороне клиента, но вот представим ситуацию гостевая книга или форум, пользователь вводит такой небольшой скриптик , а потом каждому кто твою гостевую пытается читать приходит приглашение на другой сайт, или просто или еще что :) Оно все на стороне клиента, но достаточно для вреда. авторВсё это безобидно до тех пор, пока не пишется в СУБД и не выводится где-то для других посетителей. Тот же алерт можно влепить в цикле с какой-нибудь нецензурщиной - и посещаемость сайта резко упадёт :((( Эгегеге, вы об чем? Скрипт выполнится на клиентской стороне того, кто его отослал. Никакие другие клиенты его не увидят -- Tygra's -- ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2003, 12:58 |
|
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
|
|||
---|---|---|---|
#18+
2tygra это почему? а если это действительно гостевая книга, которую просматривают все? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2003, 13:01 |
|
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
|
|||
---|---|---|---|
#18+
tygra: Если вести речь о гостевой книге или форуме или чем-то подобном, то любые записи вначале вносятся в базу данных для хранения, а уже потом достается из нее и распечатываются на сайте. Соотвественно если кто-то ввел script то он впоследствий при распечатываний будет распечатан и запустится всем пользователям которые будут просматривать данный рессурс. И исполняясь на стороне клиента он сможет принести вред всем кто посетит рессурс. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2003, 13:41 |
|
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
|
|||
---|---|---|---|
#18+
Ну если так, то да. Но это естественно - в форумах проверять введенный текст. А вот как автор статьи говорит - в приветствии, то тут совсем неудачный пример. Даже провальный. -- Tygra's -- ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2003, 16:38 |
|
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
|
|||
---|---|---|---|
#18+
Вот потому я и сказал, что отдаёт паранойей. Видно автор боялся обвинения в пособничестве кибер-террористам. Хотя надо сказать, что проверять введённый текст стало естественным совсем не давно. Да я думаю что ещё и не везде. Вот помнится пару лет назад чуть ли не в каждый чат зайдёшь, а там никаких проверок... Весело было :) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2003, 16:48 |
|
|
start [/forum/topic.php?fid=18&fpage=1042&tid=1396110]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 14ms |
total: | 160ms |
0 / 0 |