真是寒啊~
如果不是 Babyken 的提醒,這個錯誤我想我還會一直犯下去。
事情起因,幫 Babyken 做了一個 0day 查詢的腳本,腳本很簡單,就是簡單的取用戶輸入的值做 LIKE 操作查詢數據庫。做好後經測試一直運行很好。可是今天 Babyken 告訴我說有個BUG,輸入 "___" 或 ".__" 等類似的關鍵字時,會把數據庫中的所有記錄都取出來。
偶又試了以前寫過的幾個應用,寒,都有這個問題。。。
看起來是SQL本身對LIKE的處理問題。問了幾個朋友也都沒有注意過。後來在MySQL手冊上找到答案:
Pattern matching using SQL simple regular expression comparison. Returns 1 (TRUE) or 0 (FALSE). With LIKE you can use the following two wildcard characters in the pattern:
Char Description
% Matches any number of characters, even zero characters
_ Matches exactly one character
當時感覺就是汗啊~~ 以前怎麼自己就沒有注意過呢?
解決辦法是把用戶的輸入中的 _ 和 % 轉義。
不知道是只是MySQL有這個問題,還是其它數據也有。希望熟悉其它數據庫應用的朋友試一下。
相關Mysql說明頁面:http://www.MySQL.com/doc/en/String_comparison_functions.Html
2004年1月16日22時25分補記:
與xdanger探討後發現,目前網上大部分的PHP+MySQL程序都存在此BUG,IPB和PHPBB也不例外,VBB中被過濾掉了。看起來這應該是一個值得引起重視的問題了。