# 上下文编码(Contextual Escaping)
网站及其它B/S应用极易受到[XSS](https://www.owasp.org/index.php/XSS)攻击,尽管PHP提供了转义功能,在某些情况下依然不够安全。在Phalcon中[Phalcon\\Escaper](http://docs.iphalcon.cn/api/Phalcon_Escaper.html)提供了上下文转义功能,这个模块是由C语言实现的, 这在进行转义时可以有更好的性能。
Phalcon的上下文转义组件基于[OWASP](https://www.owasp.org/)提供的`XSS (Cross Site Scripting) 预防作弊表`\_
另外,这个组件依赖于[mbstring](http://php.net/manual/en/book.mbstring.php)扩展,以支持几乎所有的字符集。
下面的例子中展示了这个组件是如何工作的:
~~~
<?php
use Phalcon\Escaper;
// 带有额外的html标签的恶意的文档标题
$maliciousTitle = "</title><script>alert(1)</script>";
// 恶意的css类名
$className = ";`(";
// 恶意的css字体名
$fontName = "Verdana\"</style>";
// 恶意的Javascript文本
$javascriptText = "';</script>Hello";
// 创建转义实例对象
$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>
<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>
~~~
Phalcon会根据文本所处的上下文进行转义。 恰当的上下文环境对防范XSS攻击来说是非常重要的。
## HTML 编码(Escaping HTML)
最不安全的情形即是在html标签中插入非安全的数据。
~~~
<div class="comments">
<!-- Escape untrusted data here! -->
</div>
~~~
我们可以使用`escapeHtml`方法对这些文本进行转义:
~~~
<div class="comments">
<?php echo $e->escapeHtml('></div><h1>myattack</h1>'); ?>
</div>
~~~
结果如下:
~~~
<div class="comments">
></div><h1>myattack</h1>
</div>
~~~
## HTML 属性编码(Escaping HTML Attributes)
对html属性进行转义和对html内容进行转义略有不同。对html的属性进行转义是通过对所有的非字母和数字转义来实现的。类例的转义都会如此进行的,除了一些复杂的属性外如:href和url:
~~~
<table width="Escape untrusted data here!">
<tr>
<td>
Hello
</td>
</tr>
</table>
~~~
我们这里使用`escapeHtmlAttr`方法对html属性进行转义:
~~~
<table width="<?php echo $e->escapeHtmlAttr('"><h1>Hello</table'); ?>">
<tr>
<td>
Hello
</td>
</tr>
</table>
~~~
结果如下:
~~~
<table width=""><h1>Hello</table">
<tr>
<td>
Hello
</td>
</tr>
</table>
~~~
## URL 编码(Escaping URLs)
一些html的属性如href或url需要使用特定的方法进行转义:
~~~
<a href="Escape untrusted data here!">
Some link
</a>
~~~
我们这里使用`escapeUrl`方法进行url的转义:
~~~
<a href="<?php echo $e->escapeUrl('"><script>alert(1)</script><a href="#'); ?>">
Some link
</a>
~~~
结果如下:
~~~
<a href="%22%3E%3Cscript%3Ealert%281%29%3C%2Fscript%3E%3Ca%20href%3D%22%23">
Some link
</a>
~~~
## CSS 编码(Escaping CSS)
CSS标识/值也可以进行转义:
~~~
<a style="color: Escape untrusted data here">
Some link
</a>
~~~
这里我们使用`escapeCss`方法进行转义:
~~~
<a style="color: <?php echo $e->escapeCss('"><script>alert(1)</script><a href="#'); ?>">
Some link
</a>
~~~
结果:
~~~
<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 编码(Escaping JavaScript)
插入JavaScript代码的字符串也需要进行适当的转义:
~~~
<script>
document.title = 'Escape untrusted data here';
</script>
~~~
这里我们使用`escapeJs`进行转义:
~~~
<script>
document.title = '<?php echo $e->escapeJs("'; alert(100); var x='"); ?>';
</script>
~~~
~~~
<script>
document.title = '\x27; alert(100); var x\x3d\x27';
</script>
~~~
- 简介
- 安装
- 安装(installlation)
- XAMPP下的安装
- WAMP下安装
- Nginx安装说明
- Apache安装说明
- Cherokee 安装说明
- 使用 PHP 内置 web 服务器
- Phalcon 开发工具
- Linux 系统下使用 Phalcon 开发工具
- Mac OS X 系统下使用 Phalcon 开发工具
- Windows 系统下使用 Phalcon 开发工具
- 教程
- 教程 1:让我们通过例子来学习
- 教程 2:INVO简介
- 教程 3: 保护INVO
- 教程4: 使用CRUD
- 教程5: 定制INVO
- 教程 6: Vökuró
- 教程 7:创建简单的 REST API
- 组件
- 依赖注入与服务定位器
- MVC架构
- 使用控制器
- 使用模型
- 模型关系
- 事件与事件管理器
- Behaviors
- 模型元数据
- 事务管理
- 验证数据完整性
- Workingwith Models
- Phalcon查询语言
- 缓存对象关系映射
- 对象文档映射 ODM
- 使用视图
- 视图助手
- 资源文件管理
- Volt 模版引擎
- MVC 应用
- 路由
- 调度控制器
- Micro Applications
- 使用命名空间
- 事件管理器
- Request Environmen
- 返回响应
- Cookie 管理
- 生成 URL 和 路径
- 闪存消息
- 使用 Session 存储数据
- 过滤与清理
- 上下文编码
- 验证Validation
- 表单_Forms
- 读取配置
- 分页 Pagination
- 使用缓存提高性能
- 安全
- 加密与解密 Encryption/Decryption
- 访问控制列表
- 多语言支持
- 类加载器 Class Autoloader
- 日志记录_Logging
- 注释解析器 Annotations Parser
- 命令行应用 Command Line Applications
- Images
- 队列 Queueing
- 数据库抽象层
- 国际化
- 数据库迁移
- 调试应用程序
- 单元测试
- 进阶技巧与延伸阅读
- 提高性能:下一步该做什么?
- Dependency Injection Explained
- Understanding How Phalcon Applications Work
- Api
- Abstract class Phalcon\Acl