如何closures共享主机上的魔术引号?

我想closuresPHP的魔术引号。 我没有访问php.ini。

当我尝试将php_flag magic_quotes_gpc off添加到我的.htaccess文件时,出现500内部服务器错误。 这就是我的.htaccess文件的样子:

 AddType x-mapp-php5 .php php_flag magic_quotes_gpc off 

然后我尝试使用ini_set('magic_quotes_gpc', 'O') ,但是没有任何效果。

如何closures魔术报价?

根据手册,你可以经常在共享主机上安装一个自定义的php.ini,其中不使用mod_php,因此php_value指令会导致错误。 对于suexec / FastCGI设置,在任何情况下都有一个per-webspace php.ini是很常见的。

我不认为O(大写字母o)是设置ini标志的有效值。 您需要使用true / false,1/0或“on”/“off”值。

 ini_set( 'magic_quotes_gpc', 0 ); // doesn't work 

编辑

检查ini设置列表后 ,我发现magic_quotes_gpc是一个PHP_INI_PERDIR设置(在4.2.3之后),这意味着你不能用ini_set()修改它(只能使用ini_set()修改PHP_INI_ALL设置)

这意味着你必须使用一个.htaccess文件来做到这一点 – 或者 – 实现一个脚本来扭转魔术引号的效果。 像这样的东西

 if ( in_array( strtolower( ini_get( 'magic_quotes_gpc' ) ), array( '1', 'on' ) ) ) { $_POST = array_map( 'stripslashes', $_POST ); $_GET = array_map( 'stripslashes', $_GET ); $_COOKIE = array_map( 'stripslashes', $_COOKIE ); } 

虽然我不能说为什么php_flag给你500 Internal Server Error ,我会指出, PHP手册有一个例子,检测魔术引号是否在运行时,并从超级全局剥离它。 不像其他人发布,这是recursion的,将正确地从数组中删除引号:

更新:我今天注意到在PHP手册上有下面的代码的新版本,而是使用对超全局variables的引用。

旧版:

 <?php if (get_magic_quotes_gpc()) { function stripslashes_deep($value) { $value = is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value); return $value; } $_POST = array_map('stripslashes_deep', $_POST); $_GET = array_map('stripslashes_deep', $_GET); $_COOKIE = array_map('stripslashes_deep', $_COOKIE); $_REQUEST = array_map('stripslashes_deep', $_REQUEST); } ?> 

新版本:

 <?php 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); } ?> 

这将解决在创build本地php.ini文件时,“Class”PDO“找不到”的问题。

如果你不能使用htaccess文件closures魔术引号(因为Pete Bailey已经给出的理由),只需要:

  1. 创build一个文本文件
  2. 重命名为'php.ini'
  3. 添加行

    magic_quotes_gpc =关
    magic_quotes_runtime =关
    magic_quotes_sybase =关
    延长= pdo.so
    延长= pdo_mysql.so

  4. 将其保存到您的脚本正在执行的目录中。

更新:如果你想只有一个新的php.ini文件的副本,然后将此行添加到您的根.htaccess文件:

 SetEnv PHPRC /path/to/site/root/public_html/php.ini 

很明显,你需要将ini文件移到这个位置,这个位置已经不存在了。

希望能节省2个小时的时间,只是把我带走了!

.htaccess文件中的php_flag和php_value在技术上是正确的,但是PHP仅作为Apache模块安装。 在共享主机上,你几乎永远都找不到这样的设置。 PHP是以CGI的方式运行的,原因是与安全性有关(保持服务器邻居不在文件中),phpsuexec以“你”而不是Apache用户的方式运行脚本。

Apache是​​正确的给你一个服务器错误:它不知道php_flag的含义,除非PHP模块被加载。 CGI二进制文件是Apache的一个外部程序,而不能在Apache中进行configuration。

现在好消息是,您可以设置每个目录的configuration,在那里放置一个名为“ php.ini ”的文件 ,并使用与系统主php.ini中相同的语法设置您的指令。 PHP手册列出了所有可设置的指令:可以设置标记为PHP_INI_PERDIR或PHP_INI_ALL的指令,而只有系统pipe理员可以在服务器范围的php.ini中设置标记为PHP_INI_SYSTEM的指令。

请注意,这样的php.ini指令不会被子目录inheritance,你必须给它们自己的php.ini。

======================== ===============我的解决scheme========= ===================(把你的php.ini重命名为php5.ini)

并在顶部(!),添加这些:

 magic_quotes_gpc = Off magic_quotes_runtime = Off magic_quotes_sybase = Off extension=pdo.so extension=pdo_mysql.so 

然后在.htaccess中,添加这个(在顶部):

 SetEnv PHPRC /home/your_path/to/public_html/php5.ini 

ps更改/home/your_path/to/正确(您可以通过从典型的.php文件执行<?php phpinfo(); ?>命令来查看该path。

如果你运行的是PHP 5.3以上版本,那么就可以把它放在页面的最顶端:

 if (get_magic_quotes_gpc() === 1) { $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true); $_POST = json_decode(stripslashes(json_encode($_POST, JSON_HEX_APOS)), true); $_COOKIE = json_decode(stripslashes(json_encode($_COOKIE, JSON_HEX_APOS)), true); $_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true); } 

处理键,值和multidimensional array。

如果您的托pipe服务提供商使用cPanel,则可以尝试将php.ini复制到您的Web目录中,并使用magic_quotes_gpc = off

我知道我迟到了,但我阅读了大部分答案,而很多答案都很棒,只有djn实际上解释了为什么你得到了500 Internal Server Error

虽然他的解释是100%正确的,但这是一个很好的例子,你为什么总是把它们包装在<IfModule> 。 虽然这不能解决在你的.htaccess中不能设置这些标志的实际问题, 但它至less可以防止500错误

 <IfModule mod_php5.c> # put all of your php_flags here, for example: php_flag magic_quotes_gpc off </IfModule> 

或者对于旧版本,它会是<IfModule mod_php.c>

为了避免这样的500个错误,我总是试图养成一种习惯。 之后,只要应用Peter Bailey说的话 。

不同的托pipe服务提供商有不同的做法,所以我会问他们的论坛或提出支持请求。

如果你不能closures它们,你总是可以使用这样的东西,无论魔术引号是打开还是closures,

 //using mysqli public function escapeString($stringToBeEscaped) { return $this->getConnection()->real_escape_string(stripslashes($stringToBeEscaped)); } 
  1. 它是否工作,如果您删除AddType行? 我不太清楚为什么这与closures魔术报价有关。

  2. 如果PHP不在mod_php下运行,htaccess将无法工作。 它是否可以像CGI一样工作?

这是你的托pipe公司真的。

BaileyP的答案已经很不错了,但我会用这个条件代替:

 if(function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc() === 1){ $_POST = array_map( 'stripslashes', $_POST ); $_GET = array_map( 'stripslashes', $_GET ); $_COOKIE = array_map( 'stripslashes', $_COOKIE ); } 

它更防守。

$_SERVER怎么样?

 if (get_magic_quotes_gpc() === 1) { $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true); $_POST = json_decode(stripslashes(json_encode($_POST, JSON_HEX_APOS)), true); $_COOKIE = json_decode(stripslashes(json_encode($_COOKIE, JSON_HEX_APOS)), true); $_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true); $_SERVER = json_decode( stripslashes(json_encode($_SERVER,JSON_HEX_APOS)), true); } 

如果你不能关掉它,我通常会这样做:

 get_magic_quotes_gpc() ? $_POST['username'] : mysql_real_escape_string($_POST['username']); 

它将以正确的格式放置在数据库中。

Interesting Posts