[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管理
- 請求環境
- 返回響應
- 安全
- 加密/解密
- 安全
- 國際化
- 國際化
- 多語言支持