# 安全類
安全類包含了一些方法,用于安全的處理輸入數據,幫助你創建一個安全的應用。
* [XSS 過濾](http://codeigniter.org.cn/user_guide/libraries/security.html#xss)
* [跨站請求偽造(CSRF)](http://codeigniter.org.cn/user_guide/libraries/security.html#csrf)
* [類參考](http://codeigniter.org.cn/user_guide/libraries/security.html#id2)
## [XSS 過濾](http://codeigniter.org.cn/user_guide/libraries/security.html#id3)
CodeIgniter 自帶了一個 XSS 過濾器來防御攻擊,它可以設置為自動運行過濾 所有遇到的 POST 和 COOKIE 數據,也可以針對某一條數據進行過濾。默認情況下 它不是全局運行的,因為它會有相當的開銷,況且你并不是在所有地方都需要它。
XSS 過濾器會查找那些常被用來觸發 JavaScript 腳本或者其他類型的企圖劫持 Cookie 或者其它惡意行為的代碼。如果發現任何不允許的內容,它將把那些內容 轉換為字符實體,以確保安全。
注意:這個函數只應該用來處理那些提交過來的數據,它不適合在一般情況下使用, 因為它的執行會有相當大的開銷。
使用 XSS 過濾器過濾數據可以使用?xss_clean()?方法:
~~~
$data = $this->security->xss_clean($data);
~~~
它還有一個可選的第二個參數 is_image ,允許此函數對圖片進行檢測以發現那些潛在的 XSS 攻擊, 這對于保證文件上傳的安全非常有用。當此參數被設置為 TRUE 時, 函數的返回值將是一個布爾值,而不是一個修改過的字符串。如果圖片是安全的則返回 TRUE , 相反, 如果圖片中包含有潛在的、可能會被瀏覽器嘗試運行的惡意信息,函數將返回 FALSE 。
~~~
if ($this->security->xss_clean($file, TRUE) === FALSE)
{
// file failed the XSS test
}
~~~
## [跨站請求偽造(CSRF)](http://codeigniter.org.cn/user_guide/libraries/security.html#id4)
打開你的 application/config/config.php 文件,進行如下設置,即可啟用 CSRF 保護:
~~~
$config['csrf_protection'] = TRUE;
~~~
如果你使用?[表單輔助函數](http://codeigniter.org.cn/user_guide/helpers/form_helper.html)?,form_open()?函數將會自動地在你的表單中插入一個隱藏的 CSRF 字段。如果沒有插入這個字段, 你可以手工調用get_csrf_token_name()?和?get_csrf_hash()?這兩個函數。
~~~
$csrf = array(
'name' => $this->security->get_csrf_token_name(),
'hash' => $this->security->get_csrf_hash()
);
...
<input type="hidden" name="<?=$csrf['name'];?>" value="<?=$csrf['hash'];?>" />
~~~
令牌(tokens)默認會在每一次提交時重新生成,或者你也可以設置成在 CSRF cookie 的生命周期內一直有效。默認情況下令牌重新生成提供了更嚴格的安全機制,但可能會對 可用性帶來一定的影響,因為令牌很可能會變得失效(譬如使用瀏覽器的返回前進按鈕、 使用多窗口或多標簽頁瀏覽、異步調用等等)。你可以修改下面這個參數來改變這一點。
~~~
$config['csrf_regenerate'] = TRUE;
~~~
另外,你可以添加一個 URI 的白名單,跳過 CSRF 保護(例如某個 API 接口希望接受 原始的 POST 數據),將這些 URI 添加到 'csrf_exclude_uris' 配置參數中:
~~~
$config['csrf_exclude_uris'] = array('api/person/add');
~~~
URI 中也支持使用正則表達式(不區分大小寫):
~~~
$config['csrf_exclude_uris'] = array(
'api/record/[0-9]+',
'api/title/[a-z]+'
);
~~~
## [類參考](http://codeigniter.org.cn/user_guide/libraries/security.html#id5)
classCI_Security
xss_clean($str[,?$is_image = FALSE])
參數:
* **$str**?(mixed) -- Input string or an array of strings
返回: XSS-clean data
返回類型: mixed
嘗試移除輸入數據中的 XSS 代碼,并返回過濾后的數據。 如果第二個參數設置為 TRUE ,將檢查圖片中是否含有惡意數據,是的話返回 TRUE ,否則返回 FALSE 。
sanitize_filename($str[,?$relative_path = FALSE])
參數:
* **$str**?(string) -- File name/path
* **$relative_path**?(bool) -- Whether to preserve any directories in the file path
返回: Sanitized file name/path
返回類型: string
嘗試對文件名進行凈化,防止目錄遍歷嘗試以及其他的安全威脅,當文件名作為用戶輸入的參數時格外有用。
~~~
$filename = $this->security->sanitize_filename($this->input->post('filename'));
~~~
如果允許用戶提交相對路徑,譬如?file/in/some/approved/folder.txt?,你可以將第二個參數?$relative_path?設置為 TRUE 。
~~~
$filename = $this->security->sanitize_filename($this->input->post('filename'), TRUE);
~~~
get_csrf_token_name()
返回: CSRF token name
返回類型: string
返回 CSRF 的令牌名(token name),也就是?$config['csrf_token_name']?的值。
get_csrf_hash()
返回: CSRF hash
返回類型: string
返回 CSRF 哈希值(hash value),在和?get_csrf_token_name()?函數一起使用時很有用,用于生成表單里的 CSRF 字段 以及發送有效的 AJAX POST 請求。
entity_decode($str[,?$charset = NULL])
參數:
* **$str**?(string) -- Input string
* **$charset**?(string) -- Character set of the input string
返回: Entity-decoded string
返回類型: string
該方法和 ENT_COMPAT 模式下的 PHP 原生函數?html_entity_decode()?差不多,只是它除此之外,還會檢測不以分號結尾的 HTML 實體,因為有些瀏覽器允許這樣。
如果沒有設置?$charset?參數,則使用你配置的?$config['charset']?參數作為編碼格式。
get_random_bytes($length)
參數:
* **$length**?(int) -- Output length
返回: A binary stream of random bytes or FALSE on failure
返回類型: string
這是一種生成隨機字符串的簡易方法,該方法通過按順序調用?mcrypt_create_iv(),?/dev/urandom?和?openssl_random_pseudo_bytes()?這三個函數,只要有一個函數是可用的,都可以返回隨機字符串。
用于生成 CSRF 和 XSS 的令牌。
注解
輸出并不能保證絕對安全,只是盡量做到更安全。
- 歡迎使用 CodeIgniter
- 安裝說明
- 下載 CodeIgniter
- 安裝說明
- 從老版本升級
- 疑難解答
- CodeIgniter 概覽
- CodeIgniter 將從這里開始
- CodeIgniter 是什么?
- 支持特性
- 應用程序流程圖
- 模型-視圖-控制器
- 設計與架構目標
- 教程 - 內容提要
- 加載靜態內容
- 讀取新聞條目
- 創建新聞條目
- 結束語
- 常規主題
- CodeIgniter URL
- 控制器
- 保留名稱
- 視圖
- 模型
- 輔助函數
- 使用 CodeIgniter 類庫
- 創建類庫
- 使用 CodeIgniter 驅動器
- 創建驅動器
- 創建核心系統類
- 創建附屬類
- 鉤子 - 擴展框架核心
- 自動加載資源
- 公共函數
- 兼容性函數
- URI 路由
- 錯誤處理
- 網頁緩存
- 程序分析
- 以 CLI 方式運行
- 管理你的應用程序
- 處理多環境
- 在視圖文件中使用 PHP 替代語法
- 安全
- PHP 開發規范
- 類庫參考
- 基準測試類
- 緩存驅動器
- 日歷類
- 購物車類
- 配置類
- Email 類
- 加密類
- 加密類(新版)
- 文件上傳類
- 表單驗證類
- FTP 類
- 圖像處理類
- 輸入類
- Javascript 類
- 語言類
- 加載器類
- 遷移類
- 輸出類
- 分頁類
- 模板解析類
- 安全類
- Session 類
- HTML 表格類
- 引用通告類
- 排版類
- 單元測試類
- URI 類
- 用戶代理類
- XML-RPC 與 XML-RPC 服務器類
- Zip 編碼類
- 數據庫參考
- 數據庫快速入門: 示例代碼
- 數據庫配置
- 連接你的數據庫
- 查詢
- 生成查詢結果
- 查詢輔助函數
- 查詢構造器類
- 事務
- 數據庫元數據
- 自定義函數調用
- 數據庫緩存類
- 數據庫工廠類
- 數據庫工具類
- 數據庫驅動器參考
- 輔助函數參考
- 數組輔助函數
- 驗證碼輔助函數
- Cookie 輔助函數
- 日期輔助函數
- 目錄輔助函數
- 下載輔助函數
- 郵件輔助函數
- 文件輔助函數
- 表單輔助函數
- HTML 輔助函數
- 語言輔助函數
- Inflector 輔助函數
- 數字輔助函數
- 路徑輔助函數
- 安全輔助函數
- 表情輔助函數
- 字符串輔助函數
- 文本輔助函數
- 排版輔助函數
- URL 輔助函數
- XML 輔助函數
- 向 CodeIgniter 貢獻你的力量