永遠不要信任外部輸入。請在使用外部輸入前進行過濾和驗證。`filter_var()` 和 `filter_input()` 函數可以過濾文本并對格式進行校驗(例如 email 地址)。
外部輸入可以是任何東西:`$_GET` 和 `$_POST` 等表單輸入數據,`$_SERVER` 超全局變量中的某些值,還有通過 `fopen('php://input', 'r') `得到的 HTTP 請求體。記住,外部輸入的定義并不局限于用戶通過表單提交的數據。上傳和下載的文檔,session 值,cookie 數據,還有來自第三方 web 服務的數據,這些都是外服輸入。
雖然外部輸入可以被存儲、組合并在以后繼續使用,但它依舊是外部輸入。每次你處理、輸出、連結或在代碼中包含時,請提醒自己檢查數據是否已經安全地完成了過濾。
數據可以根據不同的目的進行不同的 過濾 。比如,當原始的外部輸入被傳入到了 HTML 頁面的輸出當中,它可以在你的站點上執行 HTML 和 JavaScript 腳本!這屬于跨站腳本攻擊(XSS),是一種很有殺傷力的攻擊方式。一種避免 XSS 攻擊的方法是在輸出到頁面前對所有用戶生成的數據進行清理,使用 `strip_tags()` 函數來去除 HTML 標簽或者使用 `htmlentities()` 或是 `htmlspecialchars()` 函數來對特殊字符分別進行轉義從而得到各自的 HTML 實體。
另一個例子是傳入能夠在命令行中執行的選項。這是非常危險的(同時也是一個不好的做法),但是你可以使用自帶的 `escapeshellarg()` 函數來過濾執行命令的參數。
最后的一個例子是接受外部輸入來從文件系統中加載文件。這可以通過將文件名修改為文件路徑來進行利用。你需要過濾掉"/", "../", [null 字符](http://php.net/security.filesystem.nullbytes)或者其他文件路徑的字符來確保不會去加載隱藏、私有或者敏感的文件。
* [學習更多數據過濾](http://php.net/book.filter)
* [學習更多 filter_var](http://php.net/function.filter-var)
* [學習更多 filter_input](http://php.net/function.filter-input)
* [學習更多 null 字符問題](http://php.net/security.filesystem.nullbytes)
### 數據清理
數據清理是指刪除(或轉義)外部輸入中的非法和不安全的字符。
例如,你需要在將外部輸入包含在 HTML 中或者插入到原始的 SQL 請求之前對它進行過濾。當你使用 [PDO ](http://laravel-china.github.io/php-the-right-way/#databases)中的限制參數功能時,它會自動為你完成過濾的工作。
有些時候你可能需要允許一些安全的 HTML 標簽輸入進來并被包含在輸出的 HTML 頁面中,但這實現起來并不容易。盡管有一些像 [HTML Purifier](http://htmlpurifier.org/) 的白名單類庫為了這個原因而出現,實際上更多的人通過使用其他更加嚴格的格式限制方式例如使用 Markdown 或 BBCode 來避免出現問題。
[查看 Sanitization Filters](http://php.net/filter.filters.sanitize)
### 有效性驗證
驗證是來確保外部輸入的是你所想要的內容。比如,你也許需要在處理注冊申請時驗證 email 地址、手機號碼或者年齡等信息的有效性。
[查看 Validation Filters](http://php.net/filter.filters.validate)
- 歡迎
- 入門指南
- 使用當前穩定版本
- 內置的WEB服務器
- Mac安裝
- Windows安裝
- 代碼風格指南
- 語言亮點
- 編程范式
- 命名空間
- PHP標準庫
- 命令行接口
- Xdebug
- 依賴管理
- Composer 與 Packagist
- PEAR
- 開發實踐
- 基礎知識
- 日期和時間
- 設計模式
- 使用UTF8編碼
- 依賴注入
- 基本概念
- 復雜的問題
- 容器
- 延伸閱讀
- 數據庫
- MYSQL 擴展
- PDO 擴展
- 數據庫交互
- 數據庫抽象層
- 使用模板
- 好處
- 原生PHP模板
- 編譯模板
- 延伸閱讀
- 錯誤與異常
- 錯誤
- 異常
- 安全
- Web應用程序安全
- 密碼哈希
- 數據過濾
- 配置文件
- 注冊全局變量
- 錯誤報告
- 測試
- 測試驅動開發
- 行為驅動開發
- 其他測試工具
- 服務器與部署
- Platform as a Service (PaaS)
- 虛擬或專用服務器
- 共享服務器
- 構建及部署應用
- 虛擬化
- Vagrant
- Docker
- 緩存
- Opcode緩存
- 對象緩存
- 文檔撰寫
- 資源
- 社區
- Credits