簡體   English   中英

MySQL語句的轉義字符串

[英]Escaping string for MySQL statement

我有以下選擇語句:

$res = mysql_query("select * from Table where Name='{$_REQUEST['name']}'");

但是,由於這種查詢易於進行SQL注入,因此我在選擇時使用了更為安全的方式:

$escaped_name=mysql_real_escape_string($_REQUEST['name']);
$res = mysql_query("select * from Table where Name='{$escaped_name}'");

一切正常,直到我嘗試使用包含字符串Joel's $_REQUEST['name']運行選擇為止。在這種情況下,選擇不起作用。 在調試並將$escaped_name的內容打印到屏幕后,我得到以下信息:

Joel\\\'s

這是什么原因呢? 似乎該字符串已自動轉義,然后又重新轉義了。

數據可能已被PHP(已棄用)的“ 魔術引號 ”功能自動轉義。 禁用.htaccess中的魔術引號:

php_flag magic_quotes_gpc off
php_flag magic_quotes_runtime off

您在PHP中遇到了一個由稱為“魔術引號”的“功能”引起的問題。 當啟用魔術引號時,PHP嘗試轉義字符串,但是由於不同的數據庫具有不同的轉義方案,因此結果可能非常無用,甚至很危險。

有兩種可能的解決方案。 最簡單且推薦的解決方案是僅在php.ini或.htaccess中關閉魔術引號。

第二種方法是使用magic_quotes_gpc測試該功能是否已啟用,然后在輸入上運行反斜杠(如果已啟用)。 然后在結果上運行mysql_real_escape_string。

不知道您所說的“運行選擇”是什么意思,但是從您所說的內容中我猜得出您已經打開了魔引號。

如果您無權訪問php.ini,請檢查phpinfo()或將其添加到文件中:

if(get_magic_quotes_gpc()){
  echo "on";
}else{
  echo "off";
}

如果將它們打開,則可以在各種位置(例如php.ini或.htaccess文件)將其禁用

最安全的方法是使用避免轉義的預准備語句 自動轉義由魔術引號引起,可以使用這些方法禁用。

即時解決方案(假設您啟用了魔語引號)將是:

mysql_real_escape_string(stripslashes($_REQUEST['name']));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM