2013-11-22 436 views
2

我正在使用以下代碼行以保護通過PHP腳本進行登錄或類似登錄。請讓我知道是否足以抵禦攻擊,或者我需要添加更多的行以使代碼更安全。安全PHP登錄腳本

// To protect MySQL injection (more detail about MySQL injection) 
$username = stripslashes($username); 
$password = stripslashes($password); 
$username = mysql_real_escape_string($username); 
$password = mysql_real_escape_string($password); 
+3

根本不使用'mysql_ *'是一個開始。 –

+1

PDO:http://php.net/manual/en/book.pdo.php。教程:http://net.tutsplus.com/tutorials/php/php-database-access-are-you-doing-it-correctly/ – ashley

+0

像@BenFortune說,沒有'mysql_ *'功能。另外,你是否保存簡單的密碼? –

回答

1

從理論上講,應該是足夠安全的,但是仍然有一些問題吧。

  1. mysql_real_escape_string已被棄用 - 你不應該使用它們,而是事先準備好的聲明。

  2. 您不是散列密碼 - 存儲純文本密碼並不是一個好主意,就好像數據庫被泄露一樣,它們都會立即知道。 PHP有一個專用的password_hash函數,您可以使用它。

  3. 你爲什麼要剝斜線?如果您希望輸入的用戶名可能包含斜線,那麼您在其他地方缺少驗證步驟。一般來說,最好使用白名單而不是黑名單 - 即不是試圖去除不好的字符,而是要有一個好字符的列表並且只允許這些字符。這樣,你可以用一些簡單的保護您的用戶名/密碼,像preg_replace('#[^a-bA-B0-9]#', '', $username)

3

使用任何mysql_*功能不完全是安全的。現在這個功能家族已經被棄用了。

你應該看看使用MySQLiPDO與絕對的安全準備好的發言...

+0

感謝您的快速響應我使用MySQLi,並在將變量發送到我的php SQL查詢之前,我使用上面提到的代碼行。那麼在這種情況下就足夠了嗎? – user2304394

+1

這裏的最佳實踐是使用準備好的語句,正如我上面所說的,並且完全避免過時的函數。 – BenM

0

如果你知道你在做什麼,mysql_ *功能仍然很好用,雖然他們已被棄用。只要確保你不會陷入注入漏洞。 mysql_ *函數被刪除,因爲這樣的漏洞太容易了。其他函數庫(如mysqli_ *和PDO_ *)允許參數化查詢,這使得編寫安全代碼變得更加容易。

注意當然,您絕對不能保證不推薦使用的函數在新版本的PHP中仍然存在。

你說的那些行太多了。只需要mysql_real_escape_string()。您可以刪除strip_slashes()

+0

**不建議在新代碼中使用棄用的函數**即使有人知道他們在做什麼 - 這就是棄用的定義。 – BenM

+0

爲什麼你說不使用'mysql_ *'函數並且說'mysql_real_escape_string'確定? –

+0

咦?我沒有這麼說? – BenM