2009-07-20 56 views
9

我正在写一组PHP脚本,这些脚本将在一些不同的设置中运行,其中一些共享主机上带有(恐怖)魔术引号。如果没有控制PHP或Apache配置的能力,我可以在脚本中执行任何操作来禁用运行时的PHP引号吗?如何在运行时禁用PHP魔术引号?

它会更好,如果代码不承担魔术引号是,所以我可以使用,可能会或可能不会有魔术引号不同的主机相同的脚本。

回答

15

只有magic_quoted_runtime可以在运行时被禁用。但magic_quotes_gpc不能在运行时禁用(PHP_INI_ALL可变更到PHP 4.2.3,从那时起PHP_INI_PERDIR);您只能删除它们:

if (get_magic_quotes_gpc()) { 
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); 
    while (list($key, $val) = each($process)) { 
     foreach ($val as $k => $v) { 
      unset($process[$key][$k]); 
      if (is_array($v)) { 
       $process[$key][stripslashes($k)] = $v; 
       $process[] = &$process[$key][stripslashes($k)]; 
      } else { 
       $process[$key][stripslashes($k)] = stripslashes($v); 
      } 
     } 
    } 
    unset($process); 
} 

欲了解更多信息,请参阅Disabling Magic Quotes

+0

这看起来不错,谢谢! – 2009-07-20 14:05:36

+2

我真的认为这个代码也应该`ini_set('magic_quotes_gpc',false);`为了防止另一个也关心条带化输入值的库再次删除它们。 – gnarf 2010-12-16 22:21:22

+1

@gnarf:这将是甜蜜的,但不幸的是它不是这样的,如果你尝试'的ini_set(“magic_quotes_gpc的”,0)`你会因为这是只有在`PHP_INI_PERDIR`可行得到`FALSE`每次。 – 2011-04-21 19:50:48

5

魔术引号不能在运行时被禁用,但是你可以使用.htaccess文件在目录中禁用它。

php_flag magic_quotes_gpc off 

唯一真正好处这已经是你可以把它曾经在目录中,如果你需要这个应用程序,你没写,需要得到它没有魔术引号工作,它适用于整个目录和子目录。真的很好。

2

我有一个类似于胶的脚本薄熙来的(但当然我喜欢我的更好:):

if(function_exists('get_magic_quotes_runtime') && get_magic_quotes_runtime()) 
    set_magic_quotes_runtime(false); 

if(get_magic_quotes_gpc()) { 
    array_stripslashes($_POST); 
    array_stripslashes($_GET); 
    array_stripslashes($_COOKIES); 
} 

function array_stripslashes(&$array) { 
    if(is_array($array)) 
     while(list($key) = each($array)) 
      if(is_array($array[$key])) 
       array_stripslashes($array[$key]); 
      else 
       $array[$key] = stripslashes($array[$key]); 
} 
1

为PHP 5.3+另一种解决方案:

if (get_magic_quotes_gpc() === 1) 
{ 
    $_GET = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_GET, JSON_HEX_APOS | JSON_HEX_QUOT))), true); 
    $_POST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_POST, JSON_HEX_APOS | JSON_HEX_QUOT))), true); 
    $_COOKIE = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_COOKIE, JSON_HEX_APOS | JSON_HEX_QUOT))), true); 
    $_REQUEST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_REQUEST, JSON_HEX_APOS | JSON_HEX_QUOT))), true); 
} 

手柄键,值和多维数组。