2012-07-19 26 views
0

我正在編寫一個登錄面板來訪問管理面板。 數據(用戶名和密碼)存儲在MySQL數據庫(類型:InnoDB)中。 查看錶中密碼存儲爲普通和在我有的字段密碼: {純}密碼。數據庫中的{plain}密碼和登錄錯誤

修改我已有的代碼,我遇到了一些問題,因爲{plain}事情讓我困惑了一下。

我的舊代碼是:

// Construct SQL statement for query & execute 
$sql = "SELECT * FROM table WHERE user = '" . $username . "' AND password = '" . md5($password) . "'"; 
$result = $mysqli->query($sql) or die(mysql_error()); 

所以,如果我取代從外地「{普通}密碼」中與MD5密碼數據庫,代碼的偉大工程,但如果我修改我的代碼如下:

// Construct SQL statement for query & execute 
$sql = "SELECT * FROM table WHERE user = '" . $username . "' AND password = '" . $password . "'"; 
$result = $mysqli->query($sql) or die(mysql_error()); 

我無法登錄,因爲密碼錯誤!

任何想法如何解決這個問題?

+0

您是否嘗試將「{plain}」連接到密碼? – Nico 2012-07-19 14:34:39

+2

請參閱http://xkcd.com/327/ – 2012-07-19 14:36:30

+1

另請參閱:http://bobby-tables.com/ – NullUserException 2012-07-19 14:39:09

回答

1

如果在真實密碼前有前綴「{plain}」,則必須調整查詢以包含該前綴。

$sql = "SELECT * FROM table WHERE user = '" . $username . "' AND password = '{plain}" . $password . "'"; 
$result = $mysqli->query($sql) or die($mysqli->error()); 

還要注意的是,你應該在die()命令使用mysqli功能以及(因此使用$mysqli->error)改變mysql_error()

PS:你應該看看如何存儲密碼時下。以純文本存儲它們不是以任何方式安全的。

編輯

這裏提起由@BrianRasmussen註釋以及: 確保$username$password在查詢中直接使用(使用字符串連接)之前已經sanitzed!否則,您的代碼將打開各種SQL注入。

+0

都沒有直接從用戶輸入構建查詢 – 2012-07-19 14:38:45

+0

@BrianRasmussen你在哪裏看到建設查詢直接來自用戶輸入?'$ username'和'$ password'可能(也應該有)之前已經過清理。 – Sirko 2012-07-19 14:40:44

+0

也許,但是有什麼機會... – 2012-07-19 14:42:40

1

我不知道{plain}是什麼意思,我想它表示密碼是純文本的 - 而且這個字符串實際上是存在的。因此,你的第二個SQL應包括它:

$sql = "SELECT * FROM table WHERE user = '" . mysql_real_escape_string($username) . "' AND password = '{plain}" . mysql_real_escape_string($password) . "'"; 

請注意,我沒有啓動有關存儲管理員密碼以純文本格式,純回答技術問題的討論。但我必須說存儲純文本密碼是一個非常糟糕的主意。

另請注意,我添加了mysql_real_escape_string來清理您的輸入。

+0

謝謝你的回答,不幸的是,我只是在問這個{plain}事是特別的還是特殊的。同時也要感謝您提供有關如何在數據庫中存儲密碼的建議,但不幸的是,我正在處理其他人的代碼,並且我無法修改任何內容。 我知道這是一個壞的東西,在數據庫中存儲普通密碼,但我是一個初級編碼器,無法修改什麼高級: – Mark 2012-07-19 14:57:50