Skip to content

Commit bcf9adf

Browse files
committed
04.3
1 parent e9dc2f8 commit bcf9adf

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

ru/04.3.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
# 4.3 Межсайтовый скриптинг
2+
3+
Для совершенствования взаимодействия с пользоваталем современные сайты содержат все больше динамического контента, что означает, что мы должны предоставлять информацию динамически в зависимости от поведения каждого пользователя. К сожалению, существует такое явление как "межсайтовый скриптинг" (известный как "XSS"), осуществляющее постоянные атаки на динамические сайты, в то время как сайты со статическим содержимым этим атакам не подвержены.
4+
5+
Злоумышленники посылают на сайты, подверженные межсайтовому скриптингу, скрипты на JavaScript, VBScript, ActiveX или Flash. Если скрипт удачно вторгся на сайт, пользовательская инормация может быть похищена, а сайт наполнен спамом. Злоумышленники могут также изменить настройки пользователя на те, которые захотят.
6+
7+
Если Вы хотите предотвратить этот тип атаки, Вам нужно комбинировать два следующих подхода:
8+
9+
- Проверка всех данных, идущих от пользователя, о чем мы поговорили в предыдущей главе.
10+
- Обработка всех данных, посылаемых клиенту, для того, чтобы предотвратить запуск опасных скриптов в браузере.
11+
12+
Итак, как нам осуществить эти два пункта в Go? К счастью, пакет `html/template` имеет в своем распоряжении несколько полезных функций, чтобы обезопасить данные:
13+
14+
- `func HTMLEscape(w io.Writer, b []byte)` отправляет в w версию b с заменой потенциально опасных символов на их escape-последовательности.
15+
- `func HTMLEscapeString(s string) string` возвращает версию s с заменой потенциально опасных символов на их escape-последовательности.
16+
- `func HTMLEscaper(args ...interface{}) string` формирует строку из множества аргументов с заменой потенциально опасных символов на escape-последовательности.
17+
18+
Давайте изменим пример из раздела 4.1:
19+
20+
fmt.Println("Имя пользователя:", template.HTMLEscapeString(r.Form.Get("username"))) // печатает на стороне сервера
21+
fmt.Println("Пароль:", template.HTMLEscapeString(r.Form.Get("password")))
22+
template.HTMLEscape(w, []byte(r.Form.Get("username"))) // отправляет клиенту
23+
24+
Если кто-то попробует ввести в поле для ввода имени пользователя `<script>alert()</script>`, мы увидим следующую картину в браузере:
25+
26+
![](images/4.3.escape.png?raw=true)
27+
28+
Рисунок 4.3 JavaScript после обработки escape-последовательностью
29+
30+
Функции пакета `html/template` помогут Вам заменить все теги HTML на их безопасные аналоги. Но что, если Вам нужно передать в браузер `<script>alert()</script>`? В этом случае нужно использовать пакет `text/template`.
31+
32+
import "text/template"
33+
...
34+
t, err := template.New("foo").Parse(`{{define "T"}}Привет, {{.}}!{{end}}`)
35+
err = t.ExecuteTemplate(out, "T", "<script>alert('Вы попались!')</script>")
36+
37+
Вывод:
38+
39+
Привет, <script>alert('Вы попались!')</script>!
40+
41+
Или можно использовать тип `template.HTML` :
42+
Содержимое переменной типа `template.HTML` не изменяется с учетом escape-последовательностей.
43+
44+
import "html/template"
45+
...
46+
t, err := template.New("foo").Parse(`{{define "T"}}Привет, {{.}}!{{end}}`)
47+
err = t.ExecuteTemplate(out, "T", template.HTML("<script>alert('Вы попались!')</script>"))
48+
49+
Вывод:
50+
51+
Привет, <script>alert('Вы попались!')</script>!
52+
53+
Еще один пример эскейпинга:
54+
55+
import "html/template"
56+
...
57+
t, err := template.New("foo").Parse(`{{define "T"}}Привет, {{.}}!{{end}}`)
58+
err = t.ExecuteTemplate(out, "T", "<script>alert('Вы попались!')</script>")
59+
60+
Вывод:
61+
62+
Привет, &lt;script&gt;alert(&#39;Вы попались!&#39;)&lt;/script&gt;!
63+
64+
## Ссылки
65+
66+
- [Содержание](preface.md)
67+
- Предыдущий раздел: [Проверка введенных данных](04.2.md)
68+
- Следующий раздел: [Дублирование отправки](04.4.md)

0 commit comments

Comments
 (0)