Spec-Zone.ru › Phalcon 2

Контекстная экранизация

Веб-сайты и веб-приложения уязвимы к атакам XSS, несмотря на то, что PHP предоставляет функциональность экранирования. В некоторых контекстах этого недостаточно/неподходяще. Phalcon\Escaper обеспечивает контекстную экранизацию; этот компонент написан на C, что обеспечивает минимальную нагрузку при экранировании различных типов текста.

Этот компонент разработан на основе руководства по предотвращению XSS (Cross Site Scripting), созданного OWASP.

Кроме того, этот компонент использует mbstring для поддержки практически любого набора символов.

Чтобы проиллюстрировать работу этого компонента и его важность, рассмотрите следующий пример:

<?php

    //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 Phalcon\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>

Что приводит к следующему:

../_images/escape.jpeg

Каждый текст был экранирован в соответствии с его контекстом. Важно использовать соответствующий контекст, чтобы избежать атак 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">&gt;&lt;/div&gt;&lt;h1&gt;myattack&lt;/h1&gt;</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="&#x22;&#x3e;&#x3c;h1&#x3e;Hello&#x3c;&#x2f;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 unstrusted data here">Some link</a>

Вы можете экранировать атрибут HTML, используя метод 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>

Вы можете экранировать атрибут HTML, используя метод 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–2016 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/2.0.0/reference/escaper.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API