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