0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Безопасность сайтов - тема, о которой редко говорят с новичками. При этом от нее зависит судьба любого бизнеса. Проблемы с безопасностью могут привести к утечке данных пользователей и даже к полному уничтожению сайта.</p>
1
<p>Безопасность сайтов - тема, о которой редко говорят с новичками. При этом от нее зависит судьба любого бизнеса. Проблемы с безопасностью могут привести к утечке данных пользователей и даже к полному уничтожению сайта.</p>
2
<p>Исследования показывают, что у подавляющего большинства сайтов есть проблемы с безопасностью, и они подвержены атакам. И иногда случаются громкие взломы и утечки данных сотен тысяч и миллионов пользователей.</p>
2
<p>Исследования показывают, что у подавляющего большинства сайтов есть проблемы с безопасностью, и они подвержены атакам. И иногда случаются громкие взломы и утечки данных сотен тысяч и миллионов пользователей.</p>
3
<p>В этом уроке поговорим о том, как стоит поступать, чтобы злоумышленники не получили данные пользователей, и как обезопасить свой сайт от атак. Об этой теме нужно говорить как можно раньше, что позволит избежать фатальных ошибок.</p>
3
<p>В этом уроке поговорим о том, как стоит поступать, чтобы злоумышленники не получили данные пользователей, и как обезопасить свой сайт от атак. Об этой теме нужно говорить как можно раньше, что позволит избежать фатальных ошибок.</p>
4
<h2>Защищаем сайт от атак</h2>
4
<h2>Защищаем сайт от атак</h2>
5
<p>Чтобы сайты были защищены, нужно соблюдать первое главное правило безопасности - никогда не доверяйте пользователям. В первую очередь это правило касается данных, которые они вводят.</p>
5
<p>Чтобы сайты были защищены, нужно соблюдать первое главное правило безопасности - никогда не доверяйте пользователям. В первую очередь это правило касается данных, которые они вводят.</p>
6
<p>Представим, что нам нужно вывести имя пользователя, взятое из адреса:<em>/users/nick</em>. Код, который реализует эту функциональность, рассчитывает на то, что в адресе используются только допустимые имена. Но что произойдет, если попытаться открыть такой адрес:</p>
6
<p>Представим, что нам нужно вывести имя пользователя, взятое из адреса:<em>/users/nick</em>. Код, который реализует эту функциональность, рассчитывает на то, что в адресе используются только допустимые имена. Но что произойдет, если попытаться открыть такой адрес:</p>
7
<p>В этом адресе<a>закодирован</a>код на JavaScript, который в оригинале выглядит так:</p>
7
<p>В этом адресе<a>закодирован</a>код на JavaScript, который в оригинале выглядит так:</p>
8
<p>Проблема в том, что этот код не отобразился, а был вставлен в HTML как его часть и выполнился. Для браузера такой JS выглядит как часть страницы. Если попробовать открыть получившийся HTML, то он будет выглядеть так:</p>
8
<p>Проблема в том, что этот код не отобразился, а был вставлен в HTML как его часть и выполнился. Для браузера такой JS выглядит как часть страницы. Если попробовать открыть получившийся HTML, то он будет выглядеть так:</p>
9
<p>Совсем не то, что мы ожидали. Такая атака называется<a>XSS или "межсайтовый скриптинг"</a>. Она работает так:</p>
9
<p>Совсем не то, что мы ожидали. Такая атака называется<a>XSS или "межсайтовый скриптинг"</a>. Она работает так:</p>
10
<ol><li>На страницу внедряется вредоносный код, который выполняется в браузере пользователя</li>
10
<ol><li>На страницу внедряется вредоносный код, который выполняется в браузере пользователя</li>
11
<li>Этот код отправляет информацию о пользователе на сервер злоумышленника</li>
11
<li>Этот код отправляет информацию о пользователе на сервер злоумышленника</li>
12
</ol><p>Специфика подобных атак заключается в том, что вредоносный код может использовать авторизацию пользователя в веб-системе. Так он получает к ней расширенный доступ или авторизационные данные пользователя. XSS относится к одному из самых распространенных типов атак из-за большого количества уязвимостей даже на сайтах больших и серьезных компаний, например, Facebook.</p>
12
</ol><p>Специфика подобных атак заключается в том, что вредоносный код может использовать авторизацию пользователя в веб-системе. Так он получает к ней расширенный доступ или авторизационные данные пользователя. XSS относится к одному из самых распространенных типов атак из-за большого количества уязвимостей даже на сайтах больших и серьезных компаний, например, Facebook.</p>
13
<p>Уязвимость возникает из-за доверия к пользовательским данным. В нашем коде вывод слага делается без предварительной обработки. Но это неправильно.</p>
13
<p>Уязвимость возникает из-за доверия к пользовательским данным. В нашем коде вывод слага делается без предварительной обработки. Но это неправильно.</p>
14
<p>Дело в том, что браузер пытается интерпретировать как HTML всё, что похоже на него. Если в исходном коде встречается конструкция <текст>, то браузер автоматически считает ее тегом. Чтобы вывести данные, которые не рассматриваются как HTML, нужно использовать специализированные функции для превращения теги в<a>html entities</a>:</p>
14
<p>Дело в том, что браузер пытается интерпретировать как HTML всё, что похоже на него. Если в исходном коде встречается конструкция <текст>, то браузер автоматически считает ее тегом. Чтобы вывести данные, которые не рассматриваются как HTML, нужно использовать специализированные функции для превращения теги в<a>html entities</a>:</p>
15
<p>Получившаяся строка содержит безопасное описание тегов в виде html entities. Например, &lt; отобразится как <, а &gt; как >. Используемый нами шаблонизатор Jinja2 внутри Flask уже настроен на автоматическое экранирование всех значений. Поэтому, если применить простой вывод переменной:</p>
15
<p>Получившаяся строка содержит безопасное описание тегов в виде html entities. Например, &lt; отобразится как <, а &gt; как >. Используемый нами шаблонизатор Jinja2 внутри Flask уже настроен на автоматическое экранирование всех значений. Поэтому, если применить простой вывод переменной:</p>
16
<p>Мы получим следующий результат:</p>
16
<p>Мы получим следующий результат:</p>
17
<p>Автоматическое экранирование помогает исключить проблемы с XSS атаками, но есть и другие места, где нужно быть осторожным:</p>
17
<p>Автоматическое экранирование помогает исключить проблемы с XSS атаками, но есть и другие места, где нужно быть осторожным:</p>
18
<ul><li>Генерация HTML без помощи Jinja2</li>
18
<ul><li>Генерация HTML без помощи Jinja2</li>
19
<li>Обработка разметки, предоставляемой пользователем</li>
19
<li>Обработка разметки, предоставляемой пользователем</li>
20
<li>Обработка HTML кода из загруженных пользователем файлов</li>
20
<li>Обработка HTML кода из загруженных пользователем файлов</li>
21
</ul><p>Хоть Jinja2 и защищает от XSS, экранируя HTML, есть два вида уязвимостей, от которых Jinja2 не может защитить:</p>
21
</ul><p>Хоть Jinja2 и защищает от XSS, экранируя HTML, есть два вида уязвимостей, от которых Jinja2 не может защитить:</p>
22
<ul><li><p>XSS путем внедрения в атрибуты. Чтобы защититься от таких атак, нужно заключать значения атрибутов в двойные или одинарные кавычки:</p>
22
<ul><li><p>XSS путем внедрения в атрибуты. Чтобы защититься от таких атак, нужно заключать значения атрибутов в двойные или одинарные кавычки:</p>
23
<p>Если этого не сделать, то злоумышленник может с легкостью внедрить JS-код на страницу, например:</p>
23
<p>Если этого не сделать, то злоумышленник может с легкостью внедрить JS-код на страницу, например:</p>
24
</li>
24
</li>
25
<li><p>Атрибут href тега a может содержать javascript:URI, который браузер выполнит при нажатии:</p>
25
<li><p>Атрибут href тега a может содержать javascript:URI, который браузер выполнит при нажатии:</p>
26
<p>Чтобы защитить от такого вида атак, необходимо использовать заголовок ответа<a>Content Security Policy (CSP)</a>.</p>
26
<p>Чтобы защитить от такого вида атак, необходимо использовать заголовок ответа<a>Content Security Policy (CSP)</a>.</p>
27
</li>
27
</li>
28
</ul><p>Кроме XSS часто встречаются и другие виды атак, например, SQL Injection. Но чтобы их понимать, важно разобраться в принципе работы базы данных.</p>
28
</ul><p>Кроме XSS часто встречаются и другие виды атак, например, SQL Injection. Но чтобы их понимать, важно разобраться в принципе работы базы данных.</p>