2009-04-23 165 views
2

在PHP這個sql查詢有什麼問題?

$username; 
$password; 

好吧,我有兩個變量,被初始化爲從$ _POST變量:)

檢索到的我有這樣的SQL查詢

$sql = "SELECT * FROM users WHERE username = '" . $username . "' AND password = '" . $password . "')"; 

但這並不數據工作,並返回我什麼都沒有:(

你可以指示我進入正確的方向嗎?

+8

請注意,這將邀請SQL注入。 – 2009-04-23 16:24:42

回答

12

查詢對年底沒有一個右括號原因,它不會工作。

+0

我沒有看到。看到這樣的安全風險仍然令人震驚。但是,這可能是最好的答案。刪除括號應使代碼正常工作,但請*不要在生產中使用它。 – 2009-04-23 16:30:39

7

這有什麼錯呢?

一切,不幸的是。特別是對SQL注入攻擊開放。

如果這是一個逐字刪減&粘貼,那麼它實際上並不工作的原因是尾隨的右括號。當你打電話給你時,大概你沒有檢查錯誤?

使用MySQL的基礎API應該是:

$sth = $db->prepare("SELECT COUNT(*) FROM users WHERE username = ? AND password = ?"); 
$sth->execute($username, $password); 
list($count) = $sth->fetchrow(); 
$authorized = ($count > 0); 

或類似的(未測試的代碼,E & OE等)

2

爲什麼在查詢結束時會出現一個雜散)?它不應該在那裏。

哦,並且在SQL注入方面進行了推測。壞。

1

您似乎在查詢字符串的末尾有一個多餘的右括號。

[編輯] - 對於那些尖叫的SQL注入攻擊:我們不知道用戶在查詢中使用它們之前用變量做了什麼。如何懷疑的好處? ;-)

+0

安全比對不起,等 – 2009-04-23 16:28:10

+0

更好地告訴他,發現他已經想過,而不是*如果他沒有告訴他。 – 2009-04-23 16:29:52

1

首先,從來沒有,有史以來這樣做。請閱讀關於SQL injection的內容,並且不要編寫任何SQL,除非你已經理解它所說的內容。對不起,但這是非常重要的。

也就是說,您的查詢包含一個右括號。這看起來像一個語法錯誤。執行它時會出錯嗎?

1

在查詢的右側有一個額外的括號。

另外,如果你不清理你的代碼正確你會很容易受到SQL注入。你應該真的使用參數化查詢,但是至少在$username$password上使用mysql_real_escape_string()

而且,有點鬼調試,這是非常有可能是您的密碼MD5加密的數據庫,因爲你永遠不應該將它們存儲在純文本。

嘗試:

$username = mysql_real_escape_string($_POST["username"]); 
$password = md5($_POST["password"]); 

$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; 
0

除了所有其他的問題指出。 Users表中的密碼以加密方式存儲。除非您通過MySQL密碼加密器運行密碼,否則您將永遠不會看到來自此查詢的任何數據,因爲密碼不匹配。