2012-03-31 52 views
0

我有這樣的代碼,以及由於某種原因,提出準確的數值(包括mysql_real ...)PHP的SQL注入逃生繩

mysql_query("INSERT INTO members (username) VALUES ('mysql_real_escape_string($uname)')"); 

我怎麼重寫這個,所以我沒有這個問題?

回答

2

mysql_real_escape_string是一個PHP函數,不是MySQL函數。

$value = mysql_real_escape_string($uname); 

mysql_query("INSERT INTO members (username) VALUES ('$value')"); 

UPDATE:內嵌mysql_real_escape_string

mysql_query("INSERT INTO members (username) VALUES ('".mysql_real_escape_string($uname)."')");

+0

是不是有一些方法,我可以將它綁定到SQL,所以我不必讓他們分開?我以爲我看到有人這樣做...... – droidus 2012-03-31 20:52:13

+0

是的,但爲什麼? 'mysql_query(「INSERT INTO members(username)VALUES('」.mysql_real_escape_string($ uname)。「')」);' – David 2012-03-31 20:53:00

+0

idk,只是好奇。謝謝! – droidus 2012-03-31 20:53:57

2

你也可以使用一個prepared statement,其中PDO採取逃避的任何數據庫它(不僅僅是MySQL的)工作的護理:

$stmt = $dbh->prepare("INSERT INTO members (username) VALUES (:username)"); 

// either: 
$stmt->bindParam(':username', $uname); 
$stmt->execute(); 

// or as Corbin pointed out in the comments: 
$stmt->execute(array('username' => $uname)) 
+0

除非我以前從未見過這種語法,否則您錯過了()周圍的用戶名。另外值得注意的是,在這個例子中,他可以執行$ stmt-> execute(array('username'=> $ uname))。 – Corbin 2012-03-31 20:55:38

+0

你是對的,修復它。感謝:) – 2012-03-31 20:56:29

+0

PDO有一個問題,當你正在做錯誤報告時,它會吐出密碼。另外,我認爲對於新來的人來說可能很難。 – David 2012-03-31 21:00:37