Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу / 14 сообщений из 14, страница 1 из 1
05.12.2003, 15:50
    #32345074
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
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.
<html> 
  <body> 
    <form runat= "server" > 
      <asp:TextBox ID= "Input"  RunAt= "server"  /> 
      <asp:Button Text= "Click Me"  OnClick= "OnSubmit"  
        RunAt= "server"  /> 
       <asp:Label ID= "Output"  RunAt= "server"  /> 
    </form> 
  </body> 
</html> 

<script language= "C#"  runat= "server" > 
void OnSubmit (Object sender, EventArgs e) 
{
    Output.Text =  "Hello, "  + Input.Text; 
}
</script> 


Если вы подумали, что «дыра» касается строки, введённой пользователем, ваша мысль верна. Веб-страница никогда, НИ ПРИ КАКИХ УСЛОВИЯХ, не должна использовать необработанный пользовательский ввод. Почему? Потому что в этом случае страница становится восприимчивой к кросс-сайт скриптовым атакам (to cross-site scripting (XSS) attacks). Для демонстрации этого, запустите страницу и наберите следующий текст в поле ввода:
Код: plaintext
<script>alert('Опачки!')</script>


Нажмите кнопку «Нажми меня» и окно с сообщением появится в вашем браузере. Проблема? Когда вы нажали на кнопку, браузер интерпретировал ввод, как часть кода, которую необходимо выполнить. И если этот скрипт достаточно безвреден, то хакеры могут ввести далеко не такие безвредные скрипты. Даже написав такую простую страницу как эта, нельзя быть уверенным, что все посетители будут использовать её так, как вы задумали. (Заметьте, что если вы используете страницу с 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.
<html> 
  <body> 
    <form runat= "server" > 
      <asp:TextBox ID= "Input"  RunAt= "server"  /> 
      <asp:Button Text= "Click Me"  OnClick= "OnSubmit"  
        RunAt= "server"  /> 
      <asp:Label ID= "Output"  RunAt= "server"  /> 
    </form> 
  </body> 
</html> 
  

<script language= "C#"  runat= "server" > 
void OnSubmit (Object sender, EventArgs e) 
{
    Output.Text =  "Hello, "  + Server.HtmlEncode (Input.Text); 
}
</script> 



Помните: пользовательский ввод является вредоносным по умолчанию и должен рассматриваться именно с этой точки зрения. Server.HtmlEncode превращает «плохой» пользовательский ввод в «хороший» и, может быть, спасёт ваш веб-сервер от взлома – или чего-нибудь похуже.
...
Рейтинг: 0 / 0
05.12.2003, 15:53
    #32345081
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
Вобщем, если эта идея понравилась, то буду стараться каждую пятницу выкладывать по HotTip'y. Если есть желающие присоединиться - you are welcome.
...
Рейтинг: 0 / 0
05.12.2003, 16:32
    #32345176
tygra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
Есть ощущение, что никому, кроме сябя самого, такой хакер не навредит. Почему - да потому, что исполнится введенный скрипт на клиентской стороне. Гыгыгы. А у кого эта клиентская сторона? Правильно - у хакера Так что пусть пишут хоть формат с://, только потом пусть не удивляются, почему у них же диск снесло :)

-- Tygra's --
...
Рейтинг: 0 / 0
05.12.2003, 16:57
    #32345231
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
Вообще-то к концу перевода у меня сложилось мнение, что у автора статьи паранойя. Не потому, что статья такой направленности, а потому, что стиль изложения несколько параноидальный
...
Рейтинг: 0 / 0
05.12.2003, 18:12
    #32345348
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
м.б. тут скорее SQL code injection'a надо бояться, а не клиентских скриптов...
...
Рейтинг: 0 / 0
07.12.2003, 11:30
    #32345748
EvAlex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
Тут речь о CSS - Cross Site Scripting и Data Tampering

Личного опыта у меня нет, но по слухам <%@ Page ValidateRequest="false" %> иногда фильрует и "правильный" ввод пользователя.
...
Рейтинг: 0 / 0
07.12.2003, 17:45
    #32345822
Antropos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
Оно конечно выполняется на стороне клиента, но вот представим ситуацию гостевая книга или форум, пользователь вводит такой небольшой скриптик , а потом каждому кто твою гостевую пытается читать приходит приглашение на другой сайт, или просто или еще что :)
Оно все на стороне клиента, но достаточно для вреда.


tygra:

Ага, пропишет он этот формат, и у каждого кто эту гостевушку потом откроет форматнется :) :)
...
Рейтинг: 0 / 0
08.12.2003, 12:07
    #32346235
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
Да, действительно. Всё это безобидно до тех пор, пока не пишется в СУБД и не выводится где-то для других посетителей. Тот же алерт можно влепить в цикле с какой-нибудь нецензурщиной - и посещаемость сайта резко упадёт :(((
...
Рейтинг: 0 / 0
08.12.2003, 12:58
    #32346310
tygra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
авторОно конечно выполняется на стороне клиента, но вот представим ситуацию гостевая книга или форум, пользователь вводит такой небольшой скриптик , а потом каждому кто твою гостевую пытается читать приходит приглашение на другой сайт, или просто или еще что :)
Оно все на стороне клиента, но достаточно для вреда.
авторВсё это безобидно до тех пор, пока не пишется в СУБД и не выводится где-то для других посетителей. Тот же алерт можно влепить в цикле с какой-нибудь нецензурщиной - и посещаемость сайта резко упадёт :(((

Эгегеге, вы об чем? Скрипт выполнится на клиентской стороне того, кто его отослал. Никакие другие клиенты его не увидят

-- Tygra's --
...
Рейтинг: 0 / 0
08.12.2003, 13:01
    #32346320
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
2tygra
это почему?
а если это действительно гостевая книга, которую просматривают все?
...
Рейтинг: 0 / 0
08.12.2003, 13:41
    #32346390
Antropos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
tygra:

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

И исполняясь на стороне клиента он сможет принести вред всем кто посетит рессурс.
...
Рейтинг: 0 / 0
08.12.2003, 16:38
    #32346765
tygra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
Ну если так, то да. Но это естественно - в форумах проверять введенный текст.

А вот как автор статьи говорит - в приветствии, то тут совсем неудачный пример. Даже провальный.

-- Tygra's --
...
Рейтинг: 0 / 0
08.12.2003, 16:48
    #32346777
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
Вот потому я и сказал, что отдаёт паранойей. Видно автор боялся обвинения в пособничестве кибер-террористам.

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

Весело было :)
...
Рейтинг: 0 / 0
08.12.2003, 20:36
    #32347050
Antropos
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу
У автора видать сердце доброе , пример слишком добренкий
Реальность если случается бывает зачастую похуже :-)
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / HOT TIP #1Кодируйте ввод пользователя перед тем, как вывести его на страницу / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]