PHP SQL Injection 和 XSS 的偵測程式 和 程式撰寫注意事項 - 2008

作者:jon

程式的安全, 除了本身自己該注意的事項外, 還有不少偵測程式, 可以幫你避免掉意外狀況.

此文章加上年份的資料, 主要是因為安全性會隨著時間演變, 原本安全的程式也會變的不安全(ex: XSS), 所以本篇文章是 2008 年寫的, 或許到 2009 年就過時囉, 請把此篇當參考, 再去看最新的安全資訊會比較保險.(不過就算過時, 請還是不要把它遺漏掉, 過時的漏洞還是漏洞, 還是會有安全性的問題產生)

關於安全的資訊, 先講結論就是: 網路是危險的. 大家能做到的就是盡可能的保護, 但是無法保證絕對的安全.(另外 安全方便 通常是呈反比的)

這兩篇文章/簡報都蠻值得看看, 有助於瞭解下面為何要做那些事, 和其它的防範:

下述先就幾方面做整理:

  1. PHP 程式撰寫上該注意到的事項
  2. SQL Injection/XSS(Cross-site scripting attacks) 偵測程式(白箱/黑箱測試)
  3. PHP 系統上的注意事項
  4. 相關文章整理

PHP 程式撰寫上該注意到的事項

首先對於安全的認知, 就是 外部拉到的資料(使用者送出的資料), 都是不安全的, 都要做嚴謹的檢查.

哪些是外部拉到的資料(使用者送出的資料)?

  • GET: $_GET (Form submit/網址列參數)
  • POST: $_POST
  • REQUEST: $_REQUEST
  • COOKIE: $_COOKIE
  • JSON/AJAX/合作廠商送的資料/讀取檔案, 要將資料寫入 DB 的 Data 等.

有人常會說用 Framework 就可以避免掉這種事情, 個人認為這是不太正確的想法, 因為太依賴 Framework, 反而有可能造成安全上的漏洞.(註: 並不是指不要用 Framework, 而是用 Framework 還是要注意下述的安全問題)

ex: Framework 通常會幫你做好 SQL Injection 預防的處理, 但是於 XSS 的處理上, 這通常還是得要有自己的認知, 哪些地方能使用 HTML, 秀出來的 HTML 要做過哪些處理? 允許哪些 HTML Tag? 要怎麼過濾? 這些一般 Framework 並沒辦法幫你做決定, 處理上也沒那麼容易.

PHP 本身已經提供預防各類安全問題的處理方法, 下述就簡單列出來, 不過隨時代演進, 會跟著改變, 就看當下的狀況來處理囉~

PHP 設定檔(php.ini)
  • 轉載 LAMP 攻防簡報裡的內容, 不過 magic_quotes_gpc 做個修改
  • register_global = off (全域變數)
  • magic_quotes_gpc = off (' => \' , " => \" , %00 => \ 0) (建議 magic_quotes_gpc = off 自己處理)
  • display_error = off (在網頁上顯示錯誤訊息)
  • log_error = on (紀錄錯誤訊息)
  • allow_url_fopen = off (可開啟遠端網頁)
  • expose_php = off (顯示PHP 版本資訊)
  • open_basedir = (允許開啟的目錄)
  • safe_mode = on (安全模式)
  • disable_function = (禁止使用的函數)
  • safe_mode_include_dir = (允許include的目錄)
PHP 接收參數 GET/POST/REQUEST/COOKIE/SERVER/ENV.

PHP Filter Functions(要安裝 Pecl filter)

沒有使用此 Filter 也無所謂, 重點是要做嚴謹的檢查.(ex: integer, 年月日.. 等)

PHP 於寫入 DB 階段:(SQL Injection)
PHP 於 HTML 頁面的呈現(無法讓 User 使用 HTML 情況)
PHP 於 HTML 頁面的呈現(讓 User 使用 HTML 情況)
  • HTML Purifier: HTML Purifier is a standards-compliant HTML filter library written in PHP.
  • PHP HTML Sanitizer: Remove unsafe tags and attributes from HTML code
  • htmLawed: PHP code to purify & filter HTML
PHP 於 Shell script command(呼叫外部程式帶入參數, ex: system, exec)
瀏覽器 URL列 GET 的參數傳送

urlencode: 將要傳的參數值都要經過 urlencode, 這主要是符合標準 (RFC 1738).

PHP Source code 加密(Encrypt), 某些商業用途採用
SQL Injection/XSS(Cross-site scripting attacks) 偵測程式(白箱/黑箱測試)

註: 這些工具請不要拿去玩其它網站, 只做自己程式/網站的掃描測試用.

程式本身需要加 mysql_escape_string/htmlspecialchars 等(上述挑其一方法做), 總會有不小心漏掉, 或者那是外來程式 等, 下述的工具可以來做簡單的檢測~ (我目前使用 Wapiti 和 Pixy, 其它就不太熟了.)

PHP 系統上的注意事項

系統上該注意的, 就是本身系統要更新, 然後 PHP 部份, 就是把 Suhosin 裝起來.

安裝方法有下述兩種:

相關文章整理

上述感覺不到危險的, 這幾篇文章可以自己試著測試自己寫的程式看看.(請不要拿來測試非自己的網站/程式)

下述就比較偏向其它相關文章整理

相关日志

发表评论