2011-04-29 46 views
3

可能重複:
Best way to prevent SQL injection?這是否有點過分,還是我做正確的事情?

對於登錄:

$username = mysql_real_escape_string(htmlspecialchars(strip_tags(trim($_POST['username'])), ENT_QUOTES)); 
$password = mysql_real_escape_string(htmlspecialchars(strip_tags(trim($_POST['password'])), ENT_QUOTES)); 

將數據插入我重新使用相同的mysql_real_escape_string(htmlspecialchars(strip_tags(trim(...

我覺得這是不好的做法,因爲我是使用這麼多的功能...這是防止mysql注入的正確方法&防止xss注入?還是完全過度?一切工作正常,沒有什麼是壞的 - 我的問題確實是,我是否在配對時使用過時的東西?是否只有一個功能可以用來完成這項工作?

謝謝。

+2

切勿將密碼進入你的數據庫以純文本...哈希它和鹽它...然後你並不需要所有那些花哨的htmlspecialchars和striptags它要麼 – 2011-04-29 10:20:41

+0

'mysql_real_escape_string() '這裏唯一必要的電話是 – 2011-04-29 10:23:08

回答

2

如果我使用<mysecretpassword>作爲密碼該怎麼辦?

它會被剝離,任何人都可以登錄爲我。

我認爲你應該保存用戶名和密碼原樣,並且只有在顯示它們時才執行htmlspecialchars

strip_tags似乎是不必要的,在這裏所有的,除非你真的不喜歡的用戶名像BlaBla aka Yada-Yada <C00lHax0r>

+0

我不討厭那些:我只是用strip_tags從用戶名中刪除html。特殊專家應該修復這個問題嗎? – Kyle 2011-04-29 10:32:13

+0

@凱爾:當然。 – Quassnoi 2011-04-29 10:36:00

2

mysql_real_escape_string應該是足夠了...你應該檢查其他的東西當用戶註冊自己

1

你沒從MySQL注入保護,但你存儲的字符串是遙遠從原來的格式。 當您拉動字符串OUT並回應時,應使用strip_tags,htmlspecialchars和trim等函數。

原因在於,有時您可能希望將字符串設置爲其原始格式,例如,您可以剝去一些標籤,而不是所有標籤 - 或者您可能希望僅使用htmlspecialchars而不剝離任何標籤。關鍵在於能夠輕鬆地將字符串轉換爲顯示時所需的字符串。 這意味着,您需要保持原始格式的字符串。爲了做到這一點 - 你不要strip_tags或htmlspecialchars它。

另一件事是,每個人和他們的祖父母都在使用PDO,您可能想要開始使用它,因爲它確實使您免受SQL注入的影響。

+0

什麼是PDO?我從來沒有聽說過這個。我知道有mysqli,但我還沒有真正玩過它。 – Kyle 2011-04-29 10:22:29

+2

PDO或Php數據對象 - www.php.net/PDO - 這是一個輕量級的對象接口,用於與各種數據庫系統進行通信。它提供了各種功能,最好的一點是它與PHP捆綁在一起,並且可以像PHP中其他任何類一樣擴展它。 – 2011-04-29 10:26:13

1

strip_tags的事情是沒有必要的。

對於編碼舒適,你可能要創建一個函數來此爲您提供:

function escape_everything($something) 
{ 
    return mysql_real_escape_string(htmlspecialchars(strip_gpc(trim($something)), ENT_QUOTES)); 
} 

function strip_gpc($something) 
{ 
    return get_magic_quotes_gpc() ? stripslashes($something) : $something; 
} 

這種方法有一些問題雖然。它只適用於發送到數據庫的數據,更重要的是,您正在保存數據html編碼的數據。如果將來您想從保存在數據庫中的數據中生成PDF,那麼首先需要htmlspecialchars_decode(),所以它可能有點不方便(但很容易解決)。

1

以下是大多數答案的建議。

$username = mysql_real_escape_string(trim($_POST['username'])); 

$password = md5("mysalt".mysql_real_escape_string(trim($_POST['password']))); 
+0

鹽必須**不**爲固定值。它必須隨着每一篇文章而改變。時間戳會產生極好的鹽。例如'$ password = md5(date(「m-d」))trim($ _ POST ['password']));'(無論如何,無需轉義密碼,因爲密碼無法識別。請記住將該日期存儲在密碼錶中,以便在重新轉換輸入的密碼時可以調用它。 – Johan 2011-04-29 11:13:31

+0

@Johan,我想你完全沒有意識到這一點。如果應用程序無法以某種方式知道鹽,那麼下次他/她登錄時如何驗證用戶?根據您的建議,時間戳也需要存儲,而將用戶存儲在數據庫中,否則您將無法驗證用戶身份。 – Starx 2011-04-29 11:18:27

+0

對不起,但你是誰完全不知道。 @Johan也說過,鹽應該和密碼一起保存在明文中,你注意到了。通常在數據庫的密碼字段中存儲的是'$ random_salt。哈希($ random_salt。$ user_password)',用已知長度的鹽或鹽和密碼之間的分隔符。 – 2011-04-29 13:20:40

相關問題