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 <p>Чтобы обезопасить свой сайт, нужно помнить, что никогда нельзя доверять пользователям. Это правило касается данных, которые они вводят.</p>
4 <p>Чтобы обезопасить свой сайт, нужно помнить, что никогда нельзя доверять пользователям. Это правило касается данных, которые они вводят.</p>
5 <p>Возьмем пример из предыдущего урока - практику, в которой выводилось имя пользователя взятое из адреса:<em>/users/nick</em>.</p>
5 <p>Возьмем пример из предыдущего урока - практику, в которой выводилось имя пользователя взятое из адреса:<em>/users/nick</em>.</p>
6 <p>Код, который реализует эту функциональность, рассчитывает на то, что в адресе используются только допустимые имена. Но что, если попытаться открыть такой адрес:</p>
6 <p>Код, который реализует эту функциональность, рассчитывает на то, что в адресе используются только допустимые имена. Но что, если попытаться открыть такой адрес:</p>
7 <p>В этом адресе<a>закодирован</a>код на JavaScript, который в оригинале выглядит так:</p>
7 <p>В этом адресе<a>закодирован</a>код на JavaScript, который в оригинале выглядит так:</p>
8 <p>Проблема в том, что этот код не отобразился, а был вставлен в HTML как часть этого HTML. В итоге он выполнился.</p>
8 <p>Проблема в том, что этот код не отобразился, а был вставлен в HTML как часть этого HTML. В итоге он выполнился.</p>
9 <p>Для браузера такой JS выглядит как часть страницы. Если попробовать открыть получившийся HTML, то он будет выглядеть так:</p>
9 <p>Для браузера такой JS выглядит как часть страницы. Если попробовать открыть получившийся HTML, то он будет выглядеть так:</p>
10 <p>Такая атака называется<a>XSS</a>или Межсайтовый скриптинг. В этом случае на страницу внедряется вредоносный код, который выполняется в браузере пользователя и отправляет информацию о нем на сервер злоумышленника.</p>
10 <p>Такая атака называется<a>XSS</a>или Межсайтовый скриптинг. В этом случае на страницу внедряется вредоносный код, который выполняется в браузере пользователя и отправляет информацию о нем на сервер злоумышленника.</p>
11 <p>Вредоносный код может использовать авторизацию пользователя в веб-системе для получения к ней расширенного доступа или авторизационных данных пользователя.</p>
11 <p>Вредоносный код может использовать авторизацию пользователя в веб-системе для получения к ней расширенного доступа или авторизационных данных пользователя.</p>
12 <p>XSS относится к одному из самых распространенных типов атак из-за большого количества уязвимостей даже на сайтах таких компаний, как Facebook.</p>
12 <p>XSS относится к одному из самых распространенных типов атак из-за большого количества уязвимостей даже на сайтах таких компаний, как Facebook.</p>
13 <p>Уязвимость возникает из-за доверия к пользовательским данным. В нашем коде вывод слага делается без предварительной обработки. Это неверно.</p>
13 <p>Уязвимость возникает из-за доверия к пользовательским данным. В нашем коде вывод слага делается без предварительной обработки. Это неверно.</p>
14 <p>Дело в том, что браузер пытается интерпретировать как HTML всё, что похоже на HTML. Если в исходном коде встречается конструкция &lt;текст&gt;, то браузер автоматически считает ее тегом.</p>
14 <p>Дело в том, что браузер пытается интерпретировать как HTML всё, что похоже на HTML. Если в исходном коде встречается конструкция &lt;текст&gt;, то браузер автоматически считает ее тегом.</p>
15 <p>Для вывода данных, которые не рассматриваются как HTML, нужно использовать специализированные функции, которые превращают теги в<a>html entities</a>:</p>
15 <p>Для вывода данных, которые не рассматриваются как HTML, нужно использовать специализированные функции, которые превращают теги в<a>html entities</a>:</p>
16 <p>Получившаяся строка содержит безопасное описание тегов в виде html entities. Например, &amp;lt; отобразится как &lt;, а &amp;gt; - как &gt;. Если вернуться к нашему примеру, правильный вывод в шаблоне должен пропускаться через функцию htmlspecialchars():</p>
16 <p>Получившаяся строка содержит безопасное описание тегов в виде html entities. Например, &amp;lt; отобразится как &lt;, а &amp;gt; - как &gt;. Если вернуться к нашему примеру, правильный вывод в шаблоне должен пропускаться через функцию htmlspecialchars():</p>
17 <p>Теперь мы получим тот вывод, который изначально ожидали:</p>
17 <p>Теперь мы получим тот вывод, который изначально ожидали:</p>
18 <p>Это касается и любого другого вывода. В следующих уроках мы начнем использовать формы, в которых подобная уязвимость встречается часто.</p>
18 <p>Это касается и любого другого вывода. В следующих уроках мы начнем использовать формы, в которых подобная уязвимость встречается часто.</p>
19 <p>PHP не защищает от подобных уязвимостей. Необходимо постоянно держать в голове такую возможность и не забывать вызывать функцию htmlspecialchars().</p>
19 <p>PHP не защищает от подобных уязвимостей. Необходимо постоянно держать в голове такую возможность и не забывать вызывать функцию htmlspecialchars().</p>
20 <p>На практике разработчики часто забывают использовать ее. Это одна из причин, почему популярны другие шаблонизаторы. В большинстве из них любые выводимые данные автоматически пропускаются через функцию, подобную htmlspecialchars(). Это гарантирует безопасность.</p>
20 <p>На практике разработчики часто забывают использовать ее. Это одна из причин, почему популярны другие шаблонизаторы. В большинстве из них любые выводимые данные автоматически пропускаются через функцию, подобную htmlspecialchars(). Это гарантирует безопасность.</p>
21 <p>Кроме XSS часто встречаются и другие виды атак, например, SQL Injection. Но чтобы понимать их, нужно знать, как работают базы данных.</p>
21 <p>Кроме XSS часто встречаются и другие виды атак, например, SQL Injection. Но чтобы понимать их, нужно знать, как работают базы данных.</p>