星期三, 八月 27, 2008

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

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

此文章加上年份的資料, 主要是因為安全性會隨著時間演變, 原本安全的程式也會變的不安全(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 情況)
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 裝起來.

安裝方法有下述兩種:

相關文章整理

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

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

延伸閱讀

相關標籤

this is comment icon 路過 [回覆]

咦 好眼熟的東西 ... :p
Comment by OuTian (08/27/2008 20:06)

this is comment icon 回 OuTian [回覆]

因為 php.ini 和 PHP Source code 加密(Encrypt) 這兩段都有參考大大的 PowerPoint 呀~ Orz..

Comment by Tsung (08/27/2008 23:30)

this is comment icon [回覆]

哈哈,原來你們認識呀...^^

Comment by Neo (08/28/2008 20:57)

this is comment icon 回 Neo [回覆]

哈, 不認識耶, 只是看到名字和網站是 ppt 的作者~ :P

Comment by Tsung (08/29/2008 01:42)

this is comment icon 谢谢 [回覆]

不错啊。

Comment by netxiong (05/21/2009 17:06)

this is comment icon 感恩哦 [回覆]

很實用…剛好在找html的過濾器..
Comment by mlwmlw (06/14/2009 22:21)

this is comment icon wapiti 不懂怎用呀 [回覆]

請問能多說一點有關wapiti 的用法嗎? 我下載了wapiti, 也安裝了python 2.6, 但當我用"edit with IDLE" 開啟wapiti.py , 然後 打上apt-get install libtidy-0.99-0 python-ctypes python-utidylib, 它說invalid syntax呀. 我真的不明白應該怎做呀
Comment by Saxon (04/10/2010 11:17)

this is comment icon 回 Saxon [回覆]

呃, 因為 apt-get 是在 Debian / Ubuntu 上的, 在其它系統需要另外裝這些套件起來唷~

Comment by Tsung (04/11/2010 23:54)
Add this page to del.icio.us

發表迴響

標題

內容 (限制 1000 字)

暱稱

電子郵件

個人網頁


 authimage


PS: 若無法留言, 請先確認是否有打開 JavaScript, 造成您的困擾, 實在萬分對不起 Orz...(如果無法留言, 勞煩可以發信給我好嗎? 謝謝.)
PS2: 若您的留言被誤判, 我都會再自行看過, 不需要一直重覆張貼~