2012-03-23 189 views
1

來清理用戶輸入我們通常使用mysql_real_escape_string,但例如如果我想逃跑:O'Brian它會返回O \'布萊恩,我不太喜歡這個,因爲如果我想要打印這個名字,我不得不去掉所有的時間。 所以我想使用此功能:避免MySQL注入替換單引號和雙引號

$search = array("'", '"'); 
$replace = array("´", "「"); 
$str_clean = str_replace($search, $replace, "O'Brian"); 

這是簡單的功能,保護我從MySQL-注入? 非常感謝,併爲我的糟糕英語感到遺憾。

+0

Chk this它會幫你起來:http://stackoverflow.com/questions/139199/can-i-protect-against-sql-injection-by-escaping-single-quote-and-surrounding-use – 2012-03-23 10:03:04

回答

1

是的,很顯然它是從SQL Injection攻擊

它避開了特殊字符在unescaped_string,考慮到當前的保護連接的字符集,以便安全地放入一個mysql_query()

+1

我總是使用UTF-8 ,所以我也受到像0x27等十六進制字符串的保護? – 2012-03-23 10:18:22

2

mysql_real_escape_string確實只爲字符串轉義添加\並且不會將它們添加到數據庫,因此您不必在顯示內容時使用stripslashes。

如果你真的獲得存儲在數據庫中的\,做offmagic_quote

+0

magic_quote是關閉的;)所以我必須使用mysql_real_escape_string只用於SELECT查詢,而不是UPDATE或INSERT,對不對? – 2012-03-23 10:10:42

+0

@SimoneVerzino:你需要它,你需要爲mysql轉義字符串。 – 2012-03-23 10:18:21

2

你應該總是使用mysql_real_escape_string逃脫輸入。這是爲什麼當你寫入值到你的數據庫,而不是當你讀取值從你的數據庫。當你將「O \'Brian」寫到你的數據庫中時,它會被存儲爲「O'Brian」,當你讀出它時,你還應該得到「O'Brian」(並且不需要去掉斜槓,因爲它們不存在)。

+0

好的,但是如果我必須做一個SELECT FROM USERS WHERE name ='O'Brian'我必須逃避它,並且用我的功能我會解決問題嗎? – 2012-03-23 10:14:58

+0

是的,你也必須逃避變量。所以像'$ user = mysql_real_escape_string($ user); mysql_query(「SELECT * FROM USERS WHERE name ='$ user'」);' – 2012-03-23 10:30:40