🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 上下文转义 网站和Web应用程序容易受到[XSS](https://www.owasp.org/index.php/XSS)攻击,虽然PHP提供了转义功能,但在某些情况下,它还不够/适当。`Phalcon\Escaper`提供了上下文转义,并以Zephir编写,在转义不同类型的文本时提供最小的开销。 我们基于[OWASP](https://www.owasp.org)创建的[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) 来支持几乎任何字符集。 为了说明此组件的工作原理及其重要性,请考虑以下示例: ```php <?php use Phalcon\Escaper; // 使用恶意的额外HTML标记记录标题 $maliciousTitle = "</title><script>alert(1)</script>"; // 恶意CSS类名称 $className = ";`("; // 恶意CSS字体名称 $fontName = "Verdana\"</style>"; // 恶意Javascript文本 $javascriptText = "';</script>Hello"; // 创建一个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 <br />&lt;html&gt; &lt;head&gt; &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt; &lt;title&gt; &lt;/title&gt;&lt;script&gt;alert(1)&lt;/script&gt; &lt;/title&gt; &lt;style type="text/css"&gt; .\3c \2f style\3e { font-family: "Verdana\22 \3c \2f style\3e"; color: red; } &lt;/style&gt; &lt;/head&gt; &lt;body&gt; &lt;div class='&#x3c &#x2f style&#x3e '&gt; hello &lt;/div&gt; &lt;script&gt; var some = '\x27\x3b\x3c\2fscript\x3eHello'; &lt;/script&gt; &lt;/body&gt; &lt;/html&gt; ``` 每个文本都根据其上下文进行了转义。使用适当的上下文对于避免XSS攻击很重要。 ## 转义HTML 插入不安全数据时最常见的情况是在HTML标记之间: ```html <div class="comments"> <!-- Escape untrusted data here! --> </div> ``` 您可以使用`escapeHtml`方法转义这些数据: ```php <div class="comments"> <?php echo $e->escapeHtml('></div><h1>myattack</h1>'); ?> </div> ``` 生成: ```html <div class="comments"> &gt;&lt;/div&gt;&lt;h1&gt;myattack&lt;/h1&gt; </div> ``` ## 转义HTML属性 转义HTML属性与转义HTML内容不同。escaper通过将每个非字母数字字符更改为表单来工作。这种转义是针对大多数简单的属性,不包括像`href`或`url`这样的复杂属性: ```html <table width="Escape untrusted data here!"> <tr> <td> Hello </td> </tr> </table> ``` 您可以使用`escapeHtmlAttr`方法转义HTML属性: ```php <table width="<?php echo $e->escapeHtmlAttr('"><h1>Hello</table'); ?>"> <tr> <td> Hello </td> </tr> </table> ``` 生成: ```html <table width="&#x22;&#x3e;&#x3c;h1&#x3e;Hello&#x3c;&#x2f;table"> <tr> <td> Hello </td> </tr> </table> ``` ## 转义网址 某些HTML属性(如`href` 或`url`)需要以不同方式进行转义: ```html <a href="Escape untrusted data here!"> Some link </a> ``` 您可以使用`escapeUrl`方法转义HTML属性: ```php <a href="<?php echo $e->escapeUrl('"><script>alert(1)</script><a href="#'); ?>"> Some link </a> ``` 生成: ```html <a href="%22%3E%3Cscript%3Ealert%281%29%3C%2Fscript%3E%3Ca%20href%3D%22%23"> Some link </a> ``` ## 转义CSS CSS标识符/值也可以转义: ```html <a style="color: Escape untrusted data here"> Some link </a> ``` 您可以使用`escapeCss`方法转义CSS标识符/值: ```php <a style="color: <?php echo $e->escapeCss('"><script>alert(1)</script><a href="#'); ?>"> Some link </a> ``` 生成: ```html <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代码的字符串也必须正确转义: ```html <script> document.title = 'Escape untrusted data here'; </script> ``` 您可以使用`escapeJs`方法转义JavaScript代码: ```php <script> document.title = '<?php echo $e->escapeJs("'; alert(100); var x='"); ?>'; </script> ``` ```html <script> document.title = '\x27; alert(100); var x\x3d\x27'; </script> ```