2010-08-13 64 views
33

有人可以提供一些線索上這兩個函數之間的差異,從PHP手冊mysql_real_escape_string VS和addslashes

和addslashes: 返回與反斜線的字符串需要在數據庫查詢等,這些字符將被引用的字符之前單引號('),雙引號(「),反斜線()和NUL(空字節)

mysql_real_escape_string: mysql_real_escape_string()調用MySQL的庫函數mysql_real_escape_string,其中前添加反斜槓以下字符:\ X00, \ n,\ r,\,',「和\ x1a。

從我收集的主要區別是\ x00,\ n \ r \ x1a哪些addslashes不逃脫,你能告訴我什麼意思是?

感謝

回答

42

你們報了可能是從文檔,但據我知道這未必是真實的。

addslashes爲通常令人不安的字符添加斜槓。 mysql_real_escape_string轉義任何MySQL需要逃脫。這可能比addslashes需要處理的更多或更少的字符。

此外,mysql_real_escape_string不一定會增加斜線以逃避。雖然我認爲它可以工作,但如果你這樣做的話,最近的MySQL版本通過把它們中的兩個放在一起而不是通過在它之前放置斜線來避免引號。

我相信你應該總是使用你的數據提供者的轉義函數而不是addslashes,因爲addslashes可能會做太多或沒有足夠的工作來達到你使用它的目的。另一方面,mysql_real_escape_string知道如何準備將字符串嵌入到查詢中。即使規格改變了如何逃避東西,突然它不是反斜槓,你應該使用了,你的代碼仍然可以工作,因爲mysql_real_escape_string將意識到它。

+3

ANSI SQL指定單引號可以用一行中的兩個單引號表示,但mysql_real_escape_string()不會這樣做 - 就我所見,它總是使用反斜線轉義。如果你有一個通過加倍引號字符來逃脫MySQL版本的例子,我會對看到這個例子感興趣。 – 2014-01-15 20:04:26

+1

@BillKarwin,PHP的'mysql_real_escape_string'調用MySQL的['mysql_real_escape_string'](http://dev.mysql.com/doc/refman/4.1/en/mysql-real-escape-string.html),它可以做任何事情逃避絃樂。 PHP文檔現在說它使用黑色斜線,但MySQL文檔沒有提到這一點。我記得在某些時候它會用''''而不是'\''來轉義,也許情況不再是這樣,或者它可能需要特定的連接設置('mysql_real_escape_string'需要一個連接參數,以便它可以在檢查之後檢查它們所有)。 – zneak 2014-01-15 20:18:51

+1

啊哈,我測試並發現,如果你設置了'SQL_MODE = NO_BACKSLASH_ESCAPES',它的行爲就像你描述的那樣。我的困惑是因爲'mysqldump'仍然不會做雙引號字符,即使你有這個sql模式集。這意味着您可以創建一個無法在生成它的服務器上重新導入的轉儲文件! – 2014-01-15 20:27:54

0

忽略這兩者並僅使用參數化查詢。當然,除非你喜歡注射攻擊。

+0

爲了完整起見,您可以引用要切換到的函數/類嗎?我來自Postgres的背景,所以我知道使用ps_函數或PDO,但我不知道什麼支持MySQL用戶的參數化查詢。 – Tom 2010-08-13 00:50:13

+6

「mysql_real_escape_string」的一致使用將防止注入攻擊。 – 2010-08-13 00:50:48

+2

模糊概括不是很有幫助。 – cbednarski 2010-08-13 00:53:17

13

mysql_real_escape_string()還考慮到當前連接到數據庫使用的字符集。

PHP函數mysql_real_escape_string()使用相同的名稱的MySQL的C API函數:http://dev.mysql.com/doc/refman/5.1/en/mysql-real-escape-string.html

由著名的PHP安全專家克里斯·夏夫利特又看了addslashes() Versus mysql_real_escape_string(),爲示範,你可以得到SQL注入的攻擊,即使你使用addslashes()。


其他人推薦使用查詢參數,然後你不必做任何轉義的動態值。我也推薦這樣做,但在PHP中,您必須切換到PDO或ext/mysqli,因爲純粹的ext/mysql API不支持查詢參數。

此外,可能會出現一些不能使用動態字符串值的查詢參數的情況,例如全文搜索中的搜索模式。

+1

+1閱讀材料。瞭解這些主題是很好的。 – cbednarski 2010-08-13 00:45:33

+0

「必須打開PDO」聽起來對我有益! – Tom 2010-08-13 00:48:26

+0

@湯姆:是的,我更喜歡PDO,我推薦它。但是如果一個項目已經有很多使用ext/mysql的代碼,那麼很難說明重寫所有的時間。 – 2010-08-13 01:06:12

1

有一堆歷史記錄mysql_escape_stringmysql_real_escape_string。他們都試圖提供一個「通用」轉義機制,以儘量減少sql注入攻擊的可能性。

mysql_real_escape_stringaddslashes沒問題,如果他們是你真正需要的 - 但他們可能不是。

由於@afrazier說,你應該 「使用PDO,而你的應用程序使用的MySQLi您可以使用此IES(當心! 」用prepared statements

1

而不是準備QUER我「 MySQL的和」)

$nick = $connect->real_escape_string($nick); 
$nick= addcslashes($nick, '%_'); 

$pass = $connect->real_escape_string($pass); 
$pass = addcslashes($pass, '%_'); 
相關問題