HTML Diff
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 всё, что похоже на него. Если в исходном коде встречается конструкция &lt;текст&gt;, то браузер автоматически считает ее тегом. Чтобы вывести данные, которые не рассматриваются как HTML, нужно использовать специализированные функции для превращения теги в<a>html entities</a>:</p>
14 <p>Дело в том, что браузер пытается интерпретировать как HTML всё, что похоже на него. Если в исходном коде встречается конструкция &lt;текст&gt;, то браузер автоматически считает ее тегом. Чтобы вывести данные, которые не рассматриваются как HTML, нужно использовать специализированные функции для превращения теги в<a>html entities</a>:</p>
15 <p>Получившаяся строка содержит безопасное описание тегов в виде html entities. Например, &amp;lt; отобразится как &lt;, а &amp;gt; как &gt;. Используемый нами шаблонизатор Jinja2 внутри Flask уже настроен на автоматическое экранирование всех значений. Поэтому, если применить простой вывод переменной:</p>
15 <p>Получившаяся строка содержит безопасное описание тегов в виде html entities. Например, &amp;lt; отобразится как &lt;, а &amp;gt; как &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>