# 安全
這篇文章將介紹一些基本的關于 Web 安全的 "最佳實踐" ,并詳細說明了 CodeIgniter 內部的安全特性。
## URI 安全
CodeIgniter 嚴格限制 URI 中允許出現的字符,以此來減少惡意數據傳到你的應用程序的可能性。 URI 中只允許包含一些字符:
* 字母和數字
* 波浪符:~
* 百分號:%
* 句號:.
* 分號::
* 下劃線:_
* 連字號:-
* 空格
## Register_globals
在系統初始化期間,如果發現任何?$_GET、$_POST、$_REQUEST?和?$_COOKIE?數組中的鍵值變成了全局變量,則刪除該變量。
這個過程和設置?register_globals = off?效果是一樣的。 (譯注:閱讀這里了解?[register_globals 設置](http://php.net/manual/zh/security.globals.php)?)
## display_errors
在生產環境下,一般都是通過將?display_errors?標志設置為 0 來禁用 PHP 的錯誤報告。 這可以阻止原生的 PHP 錯誤被顯示到頁面上,錯誤中可能會包含潛在的敏感信息。
在 CodeIgniter 中,可以將 index.php 文件中的?**ENVIRONMENT**?常量設置為?**'production'**?, 這樣也可以關閉這些錯誤信息。在開發模式下,建議將它設置為 'development' 。 關于不同環境之間的區別可以閱讀?[處理多環境](http://codeigniter.org.cn/user_guide/general/environments.html)?頁面了解更多。
## magic_quotes_runtime
在系統初始化期間,?magic_quotes_runtime?指令會被禁用, 這樣當你在從數據庫中獲取數據時就不用再去除反斜線了。
### 最佳實踐
在你的應用程序處理任何數據之前,無論這些數據是來自于提交的表單 POST ,還是來自 COOKIE、URI、XML-RPC ,或者甚至是來自于 SERVER 數組,你都應該使用下面這三步 來處理:
1. 驗證數據類型是否正確,以及長度、大小等等
2. 過濾不良數據
3. 在提交到數據庫或者顯示到瀏覽器之前對數據進行轉義
CodeIgniter 提供了以下的方法和技巧來幫你處理該過程:
## XSS 過濾
CodeIgniter 自帶有一個 XSS 過濾器,這個過濾器可以查找一些 XSS 的常用技術, 譬如向你的數據中嵌入惡意的 JavaScript 腳本,劫持 cookie 信息或其他一些技術。 XSS 過濾器在?[這里](http://codeigniter.org.cn/user_guide/libraries/security.html)?有更詳細的描述。
>[info] 注解
> XSS 過濾?只應該在輸出數據時使用?。 對輸入的數據進行過濾可能會 在無意中對數據造成修改,譬如過濾密碼中的特殊字符,這樣會降低安全性, 而不是提高安全性。
## CSRF 保護
CSRF(Cross-Site Request Forgery,跨站請求偽造)是攻擊者騙取受害者 在不知情的情況下提交請求的攻擊方式。
CodeIgniter 提供了對 CSRF 的保護,會在每個非 GET HTTP 請求時自動觸發, 當然前提是你要使用某種方式來創建表單,這在?[安全類](http://codeigniter.org.cn/user_guide/libraries/security.html)?文檔中有進一步的解釋。
## 密碼處理
在你的應用程序中正確處理密碼是非常關鍵的。
但是不幸的是,許多開發者并不知道怎么去做,而且網絡上充斥著大量過時的 甚至錯誤的建議,提供不了任何幫助。
我們提供了一個清單來幫助你,告訴你什么該做,什么不該做。
* 絕不要以明文存儲密碼。
永遠使用?**哈希算法**?來處理密碼。
* 絕不要使用 Base64 或其他編碼方式來存儲密碼。
這和以明文存儲密碼是一樣的,使用?**哈希**?,而不要使用?**編碼**?。
編碼以及加密,都是雙向的過程,而密碼是保密的,應該只被它的所有者知道, 這個過程必須是單向的。哈希正是用于做這個的,從來沒有解哈希這種說法, 但是編碼就存在解碼,加密就存在解密。
* 絕不要使用弱哈希或已被破解的哈希算法,像 MD5 或 SHA1 。
這些算法太老了,而且被證明存在缺陷,它們一開始就并不是為了保存密碼而設計的。
另外,絕不要自己發明算法。
只使用強密碼哈希算法,譬如 BCrypt ,在 PHP 自己的?[密碼哈希](http://php.net/password)?函數中也是使用它。
即使你的 PHP 版本不是 5.5+ ,也請使用它們,CodeIgniter 為你提供了這些算法,只要你的 PHP 版本是 5.3.7 以上都可以使用。(如果不滿足這點要求,那么請升級你的 PHP)
如果你連升級 PHP 也無法做到,那么使用?hash_pbkdf() ?吧, 為實現兼容性我們提供了這個函數。
* 絕不要以明文形式顯示或發送密碼。
即使是對密碼的所有者也應該這樣。如果你需要 "忘記密碼" 的功能,可以隨機生成一個新的 一次性的(這點很重要)密碼,然后把這個密碼發送給用戶。
* 絕不要對用戶的密碼做一些沒必要的限制。
如果你使用除 BCrypt (它有最多 72 字符的限制)之外的其他哈希算法,你應該設置一個相對 長一點的密碼長度(例如 1024 字符),這樣可以緩解 DoS 攻擊 。(這樣可以緩解 DoS 攻擊?)
但是除此之外,對密碼的其他限制諸如密碼中只允許使用某些字符,或者密碼中不允許包含某些字符, 就沒有任何意義了。
這樣做不僅不會提高安全性,反而降低了安全性,而且真的沒有任何理由需要這樣做。 只要你對密碼進行哈希處理了,那么無論是技術上,還是在存儲上都沒有任何限制。
## 驗證輸入數據
CodeIgniter 有一個?[表單驗證類](http://codeigniter.org.cn/user_guide/libraries/form_validation.html)?用于幫助你驗證、 過濾以及預處理你的數據。
就算這個類不適用于你的使用場景,那么你也應該確保對輸入數據進行驗證過濾。 例如,你希望接受一個數字型的參數,你可以使用?is_numeric()?或ctype_digit()?函數來檢查一下。永遠將數據限制在你運行的范圍內。
記住,不僅要驗證?$_POST?和?$_GET?變量,而且也不要放過 cookie 、user-agent 以及?**其他所有的不是直接由你的代碼生成的數據**?。
## 插入數據庫之前對數據進行轉義
永遠不要不做轉義就將數據插入到數據庫,更多信息,可以閱讀?[數據庫查詢](http://codeigniter.org.cn/user_guide/database/queries.html)?這一節。
## 隱藏你的文件
另一個很好的安全實踐是,在你的?webroot?目錄(通常目錄名為 "htdocs/")下只保留?index.php?文件和 "assets" 目錄(用于存放 js、css、圖片等靜態資源)。 只需要這些文件能從 Web 上訪問就可以了。
允許你的訪問者訪問其他位置可能潛在的導致他們訪問一些敏感數據或者執行腳本等等。
如果你不允許這樣做,你可以使用 .htaccess 文件來限制對這些資源的訪問。
CodeIgniter 在每個目錄下放置了一個 index.html 文件,試圖隱藏這些敏感數據, 但是要記住的是,這對于防止一個真正的攻擊者來說并不夠。
- 歡迎使用 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 貢獻你的力量