Контекстуальное экранирование
Веб-сайты и веб-приложения уязвимы для атак XSS, и хотя PHP предоставляет функции экранирования, в некоторых контекстах этого недостаточно/неприемлемо. Phalcon\Escaper обеспечивает контекстуальное экранирование и написан на Zephir, предоставляя минимальную нагрузку при экранировании различных типов текста.
Этот компонент разработан на основе XSS (Cross Site Scripting) Prevention Cheat Sheet, созданной организацией OWASP.
Кроме того, этот компонент использует mbstring для поддержки практически любого набора символов.
Чтобы проиллюстрировать, как работает этот компонент и почему это важно, рассмотрите следующий пример:
<?php
use Phalcon\Escaper;
// Document title with malicious extra HTML tags
$maliciousTitle = "</title><script>alert(1)</script>";
// Malicious CSS class name
$className = ";`(";
// Malicious CSS font name
$fontName = "Verdana\"</style>";
// Malicious Javascript text
$javascriptText = "';</script>Hello";
// Create an escaper
$e = new Escaper();
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>
<?php echo $e->escapeHtml($maliciousTitle); ?>
</title>
<style type="text/css">
.<?php echo $e->escapeCss($className); ?> {
font-family: "<?php echo $e->escapeCss($fontName); ?>";
color: red;
}
</style>
</head>
<body>
<div class='<?php echo $e->escapeHtmlAttr($className); ?>'>
hello
</div>
<script>
var some = '<?php echo $e->escapeJs($javascriptText); ?>';
</script>
</body>
</html>
Что приводит к следующему:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>
</title><script>alert(1)</script>
</title>
<style type="text/css">
.\3c \2f style\3e {
font-family: "Verdana\22 \3c \2f style\3e";
color: red;
}
</style>
</head>
<body>
<div class='< / style> '>
hello
</div>
<script>
var some = '\x27\x3b\x3c\2fscript\x3eHello';
</script>
</body>
</html>
Каждый текст был экранирован в соответствии с его контекстом. Важно использовать соответствующий контекст для предотвращения атак XSS.
Экранирование HTML
Самая распространённая ситуация, когда необходимо вставлять небезопасные данные, — это между тегами HTML:
<div class="comments">
<!-- Escape untrusted data here! -->
</div>
Вы можете экранировать эти данные, используя метод escapeHtml.
<div class="comments">
<?php echo $e->escapeHtml('></div><h1>myattack</h1>'); ?>
</div>
Что приводит к:
<div class="comments">
></div><h1>myattack</h1>
</div>
Экранирование атрибутов HTML
Экранирование атрибутов HTML отличается от экранирования контента HTML. Экранировщик преобразует каждый небуквенно-цифровой символ в соответствующий код. Такое экранирование предназначено в первую очередь для простых атрибутов, исключая сложные, такие как «href» или «url»:
<table width="Escape untrusted data here!">
<tr>
<td>
Hello
</td>
</tr>
</table>
Вы можете экранировать атрибут HTML, используя метод escapeHtmlAttr.
<table width="<?php echo $e->escapeHtmlAttr('"><h1>Hello</table'); ?>">
<tr>
<td>
Hello
</td>
</tr>
</table>
Что приводит к:
<table width=""><h1>Hello</table">
<tr>
<td>
Hello
</td>
</tr>
</table>
Экранирование URL-адресов
Некоторые атрибуты HTML, такие как «href» или «url», требуют различного экранирования:
<a href="Escape untrusted data here!">
Some link
</a>
Вы можете экранировать атрибут HTML, используя метод escapeUrl.
<a href="<?php echo $e->escapeUrl('"><script>alert(1)</script><a href="#'); ?>">
Some link
</a>
Что приводит к:
<a href="%22%3E%3Cscript%3Ealert%281%29%3C%2Fscript%3E%3Ca%20href%3D%22%23">
Some link
</a>
Экранирование CSS
Также можно экранировать идентификаторы/значения CSS:
<a style="color: Escape untrusted data here">
Some link
</a>
Вы можете экранировать идентификаторы/значения CSS, используя метод escapeCss.
<a style="color: <?php echo $e->escapeCss('"><script>alert(1)</script><a href="#'); ?>">
Some link
</a>
Что приводит к:
<a style="color: \22 \3e \3c script\3e alert\28 1\29 \3c \2f script\3e \3c a\20 href\3d \22 \23 ">
Some link
</a>
Экранирование JavaScript
Строки, которые необходимо вставить в код JavaScript, также должны быть должным образом экранированы:
<script>
document.title = 'Escape untrusted data here';
</script>
Вы можете экранировать код JavaScript, используя метод escapeJs.
<script>
document.title = '<?php echo $e->escapeJs("'; alert(100); var x='"); ?>';
</script>
<script>
document.title = '\x27; alert(100); var x\x3d\x27';
</script>
© 2011–2017 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/latest/reference/escaper.html