2014-04-24 45 views
2

我對PHP相當陌生,但已經熟悉了一段時間的StackOverflow。什麼時候應該跳過在MySQL中使用的字符串

我最近一直在閱讀關於使用mysql_real_escape_string的適當時間,並希望以下任何建議。

是否在初始$ _POST變量上使用了mysql_real_escape_string一次,足以通過腳本保護字符串?

例如:

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

我跑了一堆的if語句之前聲明這些值終於一旦if語句完成我做一個INSERT到mysql數據庫:

mysql_query("INSERT INTO users (username, password, email, signup_date) VALUES ('$username', '$password', '$email', CURDATE())") or die(mysql_error()); 

mysql_real_escape_string在整個if語句的其他地方都沒有使用 - 對於菜鳥來說這是否足夠安全,同時仍然保持一些注入保護?

+0

'mysql_real_escape_string'用於轉義文本字符串 –

+0

您應該切換到pdo – OptimusCrime

+0

hmm。我的印象是,我對它做了什麼有一個體面的想法 - 我想我需要繼續學習! – Daniel

回答

1

不,這不安全。您應該切換到prepared statements

+1

儘管我同意準備好的陳述更好,但您能否舉例說明他的示例可能會失敗? – mpen

+1

除了mysqli/pdo認可之外,@ user3570991不應以純文本形式存儲密碼。 – dcclassics

+2

@Mark:http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string – CanSpice

0

嘗試一份準備好的聲明:

$stmt = $con->prepare("INSERT INTO users (`username`, `password`, `email`, `signup_date`) VALUES (?, ?, ?, ?)"); 
$stmt->bind_param($username,$password,$email,CURDATE()); 
$stmt->execute(); 
$stmt->close(); 
+0

注意$ con需要是連接到你的mysql服務器的字符串。 – dcclassics

1

雖然mysql_real_escape_string()可能(目前)保護您免受SQL注入其棄用所以你應該不是你的mysql_ *函數,無論如何,在PHP的未來版本它會被刪除,使你的代碼無用。

爲什麼要駕駛一輛舊款福特嘉年華,當你擁有一輛閃亮的新蘭博基尼鑰匙?

Don't use mysql_* functions in new code。他們不再維護and are officially deprecated。請參閱red box?請改爲了解prepared statements,並使用PDOMySQLi - this article將幫助您決定哪個。如果您選擇PDO,here is a good tutorial

+0

謝謝 - 我會看看你的鏈接 – Daniel

+0

注意:爲了受益於它提供的保護,你需要非常小心地正確使用mysql_real_escape_string()。有可能被誤解爲虛假的安全感。請參閱[獲取mysql_real_escape_string()]的SQL注入(http://stackoverflow.com/q/5741187/623041)。 – eggyal

相關問題