Web 應用安全是系統設計的底線。YII 內建針對 XSS、CSRF、Cookie 竊取的三大防護機制,配置簡單且效果顯著。本文深度解析原理、配置與最佳實踐。
攻擊者向應用注入惡意 JavaScript/VBScript/HTML,受害者瀏覽頁面時腳本執行,竊取 Cookie、鍵盤記錄、釣魚跳轉等。
通過白名單機制過濾 HTML,保留安全標籤屬性,剔除腳本、事件處理器、危險 CSS 等。
<?php $this->beginWidget('CHtmlPurifier'); ?>
<!-- 此處顯示用戶輸入內容,如評論、文章 -->
<?php echo $userComment; ?>
<?php $this->endWidget(); ?>
也可作為過濾器掛載到控制器:
public function filters() {
return array(
array('CHtmlPurifier'), // 全局過濾輸出
);
}
用戶登錄受信站點 A,訪問惡意站點 B,B 頁面隱藏表單/圖片向 A 發起帶 Cookie 的請求(如轉賬、改密),利用用戶在 A 的身份執行敏感操作。
'components' => array(
'request' => array(
'enableCsrfValidation' => true,
),
),
<?php echo CHtml::form(); ?>
<!-- 表單字段 -->
<?php echo CHtml::endForm(); ?>
框架自動在表單內插入隱藏字段 YII_CSRF_TOKEN,提交時自動驗證。
$.ajax({
url: '/post/delete',
type: 'POST',
data: { id: 123, YII_CSRF_TOKEN: 'request->csrfToken; ?>' },
success: ...
});
Secure 標誌HttpOnly 防止 JavaScript 讀取'components' => array(
'request' => array(
'enableCookieValidation' => true,
),
),
$_COOKIE 直接讀寫):
// 讀取
$cookie = Yii::app()->request->cookies['name'];
$value = $cookie->value;
// 寫入
$cookie = new CHttpCookie('name', 'value');
$cookie->expire = time() + 3600;
$cookie->httpOnly = true;
Yii::app()->request->cookies['name'] = $cookie;
框架自動為 Cookie 值計算 HMAC 簽名,讀取時驗證完整性,篡改即失效。
| 項目 | 配置/操作 | 驗證方式 |
|---|---|---|
| XSS 防護 | 啟用 CHtmlPurifier 過濾所有用戶輸出 | 提交 <script>alert(1)</script> 檢查是否被轉義/移除 |
| CSRF 防護 | enableCsrfValidation=true + CHtml::form() | 刪除表單隱藏 Token 提交,應報 400 錯誤 |
| Cookie 安全 | enableCookieValidation=true + HttpOnly + Secure | 瀏覽器開發工具檢查 Cookie 標誌;嘗試篡改 Cookie 值 |
| HTTPS 強制 | Web 服務器配置 HSTS、重定向 HTTP→HTTPS | SSL Labs A+ 級別 |
| SQL 注入 | 參數化查詢 / CDbCriteria / ActiveRecord | 代碼審計、SQLMap 掃描 |
| 錯誤信息洩露 | 生產環境 YII_DEBUG=false、displayErrors=false | 觸發 500 檢查是否顯示堆棧 |