2011-12-08 25 views
0

我試圖防止sql注入。
爲此,我使用mysql_real_escape_string()。mysql_real_escape_string()與單引號不同的行爲

在我的本地服務器(phpversion 5.3.2):

$string="a'b" 
$newstring=mysql_real_escape_string($string); 

query("INSERT INTO .. ..field1='$newstring'");

插入$ newstring到表提出 「A'B」。
在另一臺服務器上(phpversion 5.2.10),它將「a \'b」放入表中。

我該如何允許插入「a'b」並避免注射?
我不想對INI文件和magic_quotes進行更改,因爲它會影響其他查詢。
我不能使用add_slashes,因爲我將不得不尋找所有使用值來刪除斜槓的用法。

+0

但magic_quotes在服務器上關閉而另一個關閉? –

回答

0

如果啓用了magic_quotes_gpc,則首先將stripslashes()應用於數據。對已經被轉義的數據使用這個函數會將數據轉移兩次。

if(get_magic_quotes_gpc()) { 
    $newstring = stripslashes($newstring); 
} 
+0

然而,*最好*的事情是完全關閉魔術引號。這是過去的事情。 –

+0

如果他沒有權利更改服務器的php配置,該怎麼辦? –

+0

對我很好,現在的問題是:「使用this和mysql_real_escape_string是否安全?」 – lvil

0

最有可能的問題是,您在一臺服務器上啓用了magic_quotes,但沒有啓用另一臺服務器上的magic_quotes。 或者禁用magic_quotes的或變化的代碼:如果你有2個連接2個不同的數據庫服務器

mysql_real_escape_string根據已打開的連接工程不同,可能會出現

$example = stripslashes($_POST['example']);  //undoes the magic_quotes 
$escaped_string = mysql_real_escape_string($example); //escapes it properly. 

一個不太可能的情況。
如果您有多個服務器並因此有多個連接,則每個連接需要運行一次轉義功能。

$example = "a'b"; 
$connectionA = mysql_connect('localhost', 'mysql_user', 'mysql_password'); 
$connectionB = mysql_connect('remotehost', 'mysql_user', 'mysql_password'); 
$escapedstringA = mysql_real_escape_string($example, $connectionA); 
$escapedstringB = mysql_real_escape_string($example, $connectionB); 

如果你離開了連接參數在調用mysql_real_escape_string兩個escapedstrings會使用遠程主機的默認編碼,這是不正確轉義。

此代碼可能不正確工作:

$example = "a'b"; 
$connectionA = mysql_connect('localhost', 'mysql_user', 'mysql_password'); 
$connectionB = mysql_connect('remotehost', 'mysql_user', 'mysql_password'); 
$escapedstringA = mysql_real_escape_string($example); //uses remotehost's encoding 
$escapedstringB = mysql_real_escape_string($example); 
+0

Wut?如果'a'b'在表中變成'a \'b',那與'mysql_real_escape_string()'無關。 –

+0

@Pekka,我相信它可以**如果**你正在一個錯誤的編碼在一個錯誤的編碼重新使用一個錯誤的編碼,重新編碼的問題,我同意它很可能是一個糟糕的' magic_quotes' – Johan

0

這確實是神奇的引號,這就是問題所在。你唯一能做的就是檢測魔法字符串並去掉斜槓。那裏有你能把到位幾個劇本,將在這裏工作全局

檢查的意見

http://php.net/manual/en/security.magicquotes.disabling.php

如果你不希望它在全球範圍,,使用,如果條件和條上,僅僅斜槓變量