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