php函数set_magic_quotes_runtime()使用方法

本文详细介绍了PHP中magic_quotes_runtime配置项的功能及其在不同场景下的应用,包括其对GPC数据自动转义的作用,以及如何通过get_magic_quotes_runtime()和set_magic_quotes_runtime()函数来检测和设置该配置项。

在php的配置文件中,有个布尔值的设置,就是magic_quotes_runtime,当它打开时,php的大部分函数自动的给从外部引入的(包括数据库或者文件)数据中的溢出字符加上反斜线。

 

 当然如果重复给溢出字符加反斜线,那么字符串中就会有多个反斜线,所以这时就要用set_magic_quotes_runtime()与get_magic_quotes_runtime()设置和检测php.ini文件中magic_quotes_runtime状态。

 

 为了使自己的程序不管服务器是什么设置都能正常执行。可以在程序开始用get_magic_quotes_runtime检测该设置的状态决定是否要手工处理,或者在开始(或不需要自动转义的时候)用set_magic_quotes_runtime(0)关掉该设置。magic_quotes_gpc设置是否自动为GPC(get,post,cookie)传来的数据中的\'\"\\加上反斜线。

 

可以用get_magic_quotes_gpc()检测系统设置。如果没有打开这项设置,可以使用addslashes()函数添加,它的功能就是给数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(\')、双引号(\")、反斜线(\\)与NUL(NULL 字符)。

一般用法如下;
if(!get_magic_quotes_gpc())
{
   addslashes($prot);
}

 

 PHP中set_magic_quotes_runtime()函数的作用:

      此函数用来修改PHP.ini文件中的 magic_quotes_runtime 变量的状态。

      如果想获得magic_quotes_runtime 变量的状态用get_magic_quotes_runtime()这个函数,如果返回0表示本功能被关闭,如果返回1表示本功能已经开启。

      magic_quotes_runtime变量的功能是当它被开启的时候所有外部引入的数据库资料或者文件等等都会自动转为含有反斜线溢出字符的资料。比如: 用户向数据库提交的数据中含有\" '这些符号的时候它就会在这些符号的前面自动加上"\"转义符。
     这个属性在PHP4以前的版本都是默认关闭的,PHP4.0以后的版本如果程序要用到将它关闭的时候直接写成set_magic_quotes_runtime(0)将其关闭。

设置方法如下:


1、可以直接在php.ini里面设置为ON


2、set_magic_quotes_runtime(true)或者set_magic_quotes_runtime(1)


3、用ini_set函数,ini_set(magic_quotes_runtime,1);


get_magic_quotes_gpc函数作用:

      此函数取得 PHP 环境配置的变量 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。返回 0 表示关闭本功能;返回 1 表示本功能打开。当magic_quotes_gpc 打开时,所有的 ' (单引号), " (双引号), \ (反斜线) and 空字符会自动加上转义符\。

      默认情况下,PHP 指令 magic_quotes_gpc 为 on,它主要是对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc转义过的字符串使用 addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数 get_magic_quotes_gpc() 进行检测。

      其实这个函数就是判断PHP有没有自动调用addslashes 这个函数。


### 无法使用 `.htaccess` 修改 `magic_quotes_gpc` 的替代解决方案 在无法使用 `.htaccess` 文件的情况下,可以通过以下方法来更改或绕过 `magic_quotes_gpc` 的设置。 #### 方法一:检测并移除转义字符 如果 `magic_quotes_gpc` 被启用,可以编写一段代码来检测其状态,并通过递归方式移除所有输入数据中的反斜杠。这种方法适用于需要兼容不同服务器环境的场景[^5]。 ```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.ini` 配置文件 如果拥有对服务器的完全控制权限,可以直接编辑 `php.ini` 文件并将 `magic_quotes_gpc` 设置为 `Off`。这种方式是全局生效的,且不需要在每个脚本中手动处理转义字符[^4]。 ```ini magic_quotes_gpc = Off ``` 随后需要重启 Web 服务器以使配置更改生效。 #### 方法三:运行时动态检测与处理 即使无法修改 `php.ini` 或者 `.htaccess` 文件,也可以通过运行时检测 `magic_quotes_gpc` 的状态,并根据结果动态调整代码逻辑。例如,在插入数据库之前统一应用 `addslashes()` 或参数化查询[^3]。 ```php function escape_data($data, $pdo) { if (is_array($data)) { return array_map(function($item) use ($pdo) { return $pdo->quote($item); }, $data); } else { return $pdo->quote($data); } } $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); $data = escape_data($_POST['input'], $pdo); ``` #### 方法四:使用 PHP 自带函数 `set_magic_quotes_runtime` 尽管 `magic_quotes_runtime` 和 `magic_quotes_gpc` 已经被废弃,但在某些旧版本中仍然可以尝试使用 `set_magic_quotes_runtime(0)` 来关闭运行时的自动转义功能[^1]。需要注意的是,此方法仅影响 `fopen()` 等函数的行为,而不会改变 `$_GET`、`$_POST` 和 `$_COOKIE` 中的数据。 --- #### 注意事项 无论采用哪种方法,都应尽量避免依赖 `magic_quotes_gpc` 的行为。推荐的做法是编写兼容性强的代码,即通过检测 `get_magic_quotes_gpc()` 的返回值来决定是否需要调用 `stripslashes()`[^4]。此外,现代开发中更倾向于使用参数化查询或 ORM 框架来确保数据安全性,而不是单纯依靠魔术引号。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值