上下文转义

最后更新于:2022-04-02 05:14:02

[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 "; // 恶意CSS类名称 $className = ";`("; // 恶意CSS字体名称 $fontName = "Verdana\""; // 恶意Javascript文本 $javascriptText = "';Hello"; // 创建一个escaper $e = new Escaper(); ?> <?php echo $e->escapeHtml($maliciousTitle); ?>
hello
``` 其中产生以下内容: ```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标记之间: ```html
``` 您可以使用`escapeHtml`方法转义这些数据: ```php
escapeHtml('>

myattack

'); ?>
``` 生成: ```html
></div><h1>myattack</h1>
``` ## 转义HTML属性 转义HTML属性与转义HTML内容不同。escaper通过将每个非字母数字字符更改为表单来工作。这种转义是针对大多数简单的属性,不包括像`href`或`url`这样的复杂属性: ```html
Hello
``` 您可以使用`escapeHtmlAttr`方法转义HTML属性: ```php

Hello">

Hello
``` 生成: ```html
Hello
``` ## 转义网址 某些HTML属性(如`href` 或`url`)需要以不同方式进行转义: ```html Some link ``` 您可以使用`escapeUrl`方法转义HTML属性: ```php Some link ``` 生成: ```html Some link ``` ## 转义CSS CSS标识符/值也可以转义: ```html Some link ``` 您可以使用`escapeCss`方法转义CSS标识符/值: ```php Some link ``` 生成: ```html Some link ``` ## 转义JavaScript 要插入JavaScript代码的字符串也必须正确转义: ```html ``` 您可以使用`escapeJs`方法转义JavaScript代码: ```php ``` ```html ```
';