PHP網頁大作戰
架站工具愈來愈多, 技巧與撇步各不相同, 有時候遇到問題, 好不容易找到一些解方, 不記下來以後都忘光光, 既然要記下來, 為什麼不放出來讓大家共享呢? 不過內容比較專業, 對一般讀者就要說聲抱歉了! 
很久以前系管師就提醒我網站的登入設計有漏洞, 鍵入特別的字串就可以避開會員資格的檢查, 而修正的方式很簡單. 我本來是想反正網站登入後也沒有什麼東西好外洩, 就一直沒管; 最近想到不對, 我的討論區管理者和作業上傳區任課教師的登入也是利用同一個介面檢查, 萬一真有人進去動了資料庫... 後果不堪設想! 嚇出一身冷汗的我連忙找了本書來研究一下, 原來是這樣的.

我的登入介面是用PHP寫的, 結合MySQL資料庫作會員資格檢查, 邏輯很簡單, 取得使用者鍵入的帳號密碼之後, 就去資料庫比對, 比對到了就讓他登入.

SQL敘述是這樣寫的:

select * from table_name where user_name='input_name' and password='input_pass'

結果呢, 你只要帳號密碼都填: ' or ''=' (全部都是單引號而沒有雙引號), 就可以登入了!!!

因為, 這樣的帳號密碼代入SQL敘述會變成:

select * from table_name where user_name='' or ''='' and password='' or ''=''

1. user_name='' 是說 user_name 欄位值等於空字串, 同理, password='' 是說 password 欄位值等於空字串, 這當然都不成立;
2. ''='' 是說空字串等於空字串, 這是一定成立的;
3. 以上2項用 or 運算, 只要其中有一個條件成立, 運算出來就成立-> 結果不需帳號密碼即可通過檢查!!!

是不是很恐怖? 解決方法卻很簡單, 只要在取得使用者鍵入的帳號密碼之後, 先將帳號密碼以 addslashes 函數處理, 就會在單引號之前加上反斜線, 結果會變成這樣:

select * from table_name where user_name='\' or \'\'=\'' and password='\' or \'\'=\''

由於MySQL看不懂反斜線, 所以檢查就不會通過了.

小小動作大大防範, 單是學會了這一招半式, 買這本書就很值得了. 當然不用試這一招來駭我的網站, 敢寫出來就代表已經修正好了.
arrow
arrow
    全站熱搜

    AstroDuck 發表在 痞客邦 留言(0) 人氣()