[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 /><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
<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">
></div><h1>myattack</h1>
</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=""><h1>Hello</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>
```
- 常规
- Welcome
- 贡献
- 生成回溯
- 测试重现
- 单元测试
- 入门
- 安装
- Web服务器设置
- WAMP
- XAMPP
- 教程
- 基础教程
- 教程:创建一个简单的REST API
- 教程:Vökuró
- 提升性能
- 教程:INVO
- 开发环境
- Phalcon Compose (Docker)
- Nanobox
- Phalcon Box (Vagrant)
- 开发工具
- Phalcon开发者工具的安装
- Phalcon开发者工具的使用
- 调试应用程序
- 核心
- MVC应用
- 微应用
- 创建命令行(CLI)应用程序
- 依赖注入与服务定位
- MVC架构
- 服务
- 使用缓存提高性能
- 读取配置
- 上下文转义
- 类加载器
- 使用命名空间
- 日志
- 队列
- 数据库
- 数据库抽象层
- Phalcon查询语言(PHQL)
- ODM(对象文档映射器)
- 使用模型
- 模型行为
- ORM缓存
- 模型事件
- 模型元数据
- 模型关系
- 模型事务
- 验证模型
- 数据库迁移
- 分页
- 前端
- Assets管理
- 闪存消息
- 表单
- 图像
- 视图助手(标签)
- 使用视图
- Volt:模板引擎
- 业务逻辑
- 访问控制列表(ACL)
- 注解解析器
- 控制器
- 调度控制器
- 事件管理器
- 过滤与清理
- 路由
- 在session中存储数据
- 生成URL和路径
- 验证
- HTTP
- Cookies管理
- 请求环境
- 返回响应
- 安全
- 加密/解密
- 安全
- 国际化
- 国际化
- 多语言支持