PHP 資訊安全 - 資料消毒
荀子-性惡篇第二十三: 人之性惡,其善者僞也。
永遠不要相信任何來源不明的資料
不可信資料來源
只要不是系統產出組合之資料,皆不可信。
如下:
1 | $_GET |
只要是外部來源資料都有可能是攻擊的源頭(XSS
、CSRF
等…)
怎麼說呢?
您的網站允許使用 HTML
下評論,那將有可能受到 <script>
隱碼攻擊。
1 | <p>This is good!!!</p> |
您的登入帳號密碼被如此輸入,即會遭受 SQL Injection
。
1 | account: ' OR 1=1 # |
如此一來是不是令您毛骨悚然呢?
所以呢?
想要開發安全的 Web 應用程式,最重要的是正確掌握資料的用途狀態。
一般正規化消毒→一般處理用資料
- 例如:trim、magicquotesgpc、NUL、強制轉型、大小寫轉換、值域範圍檢查、白名單檢查、RegExp規則檢查
HTML輸出用消毒→HTML輸出用資料
- 例如:htmlspecialchars, strip_tags, htmlentities
SQL輸出用消毒→SQL輸出用資料
- 例如:mysqlrealescape_string, addslashes
–
最重要的是,這些用途的資料,應明確加以區別,不要混淆使用,一定要明確配合用途進行轉換。
所有資料的交換,都應使用一般處理用資料來進行,再依資料用途進行消毒,避免混用而造成遺忘或重複消毒。