上下文编码(Contextual Escaping) ================================= 网站及其它B/S应用极易受到 XSS_ 攻击,尽管PHP提供了转义功能,在某些情况下依然不够安全。在Phalcon中 :doc:`Phalcon\\Escaper <../api/Phalcon_Escaper>` 提供了上下文转义功能,这个模块是由C语言实现的, 这在进行转义时可以有更好的性能。 Phalcon的上下文转义组件基于 OWASP_ 提供的`XSS (Cross Site Scripting) 预防作弊表`_ 另外,这个组件依赖于 mbstring_ 扩展,以支持几乎所有的字符集。 下面的例子中展示了这个组件是如何工作的: .. code-block:: html+php '; // 恶意的css类名 $className = ';`('; // 恶意的css字体名 $fontName = 'Verdana"'; // 恶意的Javascript文本 $javascriptText = "';Hello"; // 创建转义实例对象 $e = new Phalcon\Escaper(); ?> <?php echo $e->escapeHtml($maliciousTitle); ?>
hello
结果如下: .. figure:: ../_static/img/escape.jpeg :align: center Phalcon会根据文本所处的上下文进行转义。 恰当的上下文环境对防范XSS攻击来说是非常重要的。 HTML 编码(Escaping HTML) -------------------------- 最不安全的情形即是在html标签中插入非安全的数据。 .. code-block:: html
我们可以使用 :code:`escapeHtml` 方法对这些文本进行转义: .. code-block:: html+php
escapeHtml('>

myattack

'); ?> 结果如下: .. code-block:: html
></div><h1>myattack</h1>
HTML 属性编码(Escaping HTML Attributes) ----------------------------------------- 对html属性进行转义和对html内容进行转义略有不同。对html的属性进行转义是通过对所有的非字母和数字转义来实现的。类例的转义都会如此进行的,除了一些复杂的属性外如:href和url: .. code-block:: html
Hello
我们这里使用 :code:`escapeHtmlAttr` 方法对html属性进行转义: .. code-block:: html+php

Hello">

Hello
结果如下: .. code-block:: html
Hello
URL 编码(Escaping URLs) ------------------------- 一些html的属性如href或url需要使用特定的方法进行转义: .. code-block:: html Some link 我们这里使用 :code:`escapeUrl` 方法进行url的转义: .. code-block:: html+php Some link 结果如下: .. code-block:: html Some link CSS 编码(Escaping CSS) ------------------------ CSS标识/值也可以进行转义: .. code-block:: html Some link 这里我们使用 :code:`escapeCss` 方法进行转义: .. code-block:: html+php Some link 结果: .. code-block:: html Some link JavaScript 编码(Escaping JavaScript) -------------------------------------- 插入JavaScript代码的字符串也需要进行适当的转义: .. code-block:: html 这里我们使用 :code:`escapeJs` 进行转义: .. code-block:: html+php .. code-block:: html .. _OWASP: https://www.owasp.org .. _XSS: https://www.owasp.org/index.php/XSS .. _`XSS (Cross Site Scripting) 预防作弊表`: https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet .. _mbstring: http://php.net/manual/en/book.mbstring.php