網頁系統的使用者驗證與 MySQL 的 “SELECT … LIMIT m,n”

幾個小時前,PTTDatabase 板 又有人問到 MySQL 的 “SELECT … LIMIT m,n” 相關問題。
其實,在大多數的網頁系統中,”SELECT … LIMIT m,n” 應該是一定要用的語法,尤其是在使用者驗證時。

簡單舉例,MySQL 的 “SELECT …” 語法運作可說是拿著籃子去裝東西,若以 LIMIT 語法限制籃子裝東西的數量,MySQL 會在籃子裝滿後就停止動作,並傳回結果。
在網頁系統中,因為使用者帳號都是獨立的,所以,進行使用者登入驗證時,只需要抓出一筆資料來進行比對。

因此,在網頁系統中,我時常用這種語法來進行使用者登入的驗證:

SELECT `使用者身份` FROM `users` WHERE `username`='使用者名稱' AND `password`='雜湊後的密碼' LIMIT 1;

如果找不到資料,代表使用者的帳號/密碼錯誤。
而直接把密碼加入 WHERE 子句,不挑出來用程式比對則是為了杜絕 SQL Injection 導致的密碼外洩。

另外,這樣作也不錯:

SELECT `使用者身份` FROM `users` WHERE `username`='使用者名稱' AND `password`=PASSWORD( '雜湊前或雜湊後的密碼' ) LIMIT 1;

:-P