# 上下文編碼(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