php.ini中Magic_Quotes_Gpc开关设置

  1. Magic_Quotes_Gpc 解释php

    magic_quotes_gpc做用范围是:WEB客户服务端;做用时间:请求开始时。mysql

    magic_quotes_runtime 做用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中获得的;做用时间:每次当脚本访问运行状态中产生的数据
    sql

  2. 开关区别数据库

    2.1    对于PHP magic_quotes_gpc=on的状况, 咱们能够不对输入和输出数据库的字符串数据做addslashes()和stripslashes()的操做,数据也会正常显示。数组

        若是此时你对输入的数据做了addslashes()处理,那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠安全

    例如:函数

    1)条件: PHP magic_quotes_gpc=onspa

    写入数据库的字符串未通过任何处理。从数据库读出的字符串未做任何处理。code

    数据:  $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).htm

    操做: 将字符串:”snow”’’sun” 写入数据库,

    结果: sql语句顺利执行,数据成功写入数据库

    数据库保存格式:snow”’’sun (和输入同样)

    输出数据格式:snow”’’sun (和输入同样)

    说明: PHP magic_quotes_gpc=on 将单引号转换为\’的转义字符使sql语句成功执行,

    但\’并未做为数据入数据库,数据库保存的是snow”’’sun而并非咱们想象的snow\’\’\’\’sun。

    2) 条件: PHP magic_quotes_gpc=on

    写入数据库的字符串通过函数addlashes()处理。从数据库读出的字符串未做任何处理。

    数据:  $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).

    操做: 将字符串:”snow”’’sun” 写入数据库,

    结果: sql语句顺利执行,数据成功写入数据库

    数据库保存格式:snow\’\’\’\’sun (添加了转义字符)

    输出数据格式:snow\’\’\’\’sun (添加了转义字符)

    说明: PHP magic_quotes_gpc=on 将单引号转换为\’的转义字符使sql语句成功执行,

    addslashes又将即将写入数据库的单引号转换为\’,后者的转换被做为数据写入

    数据库,数据库保存的是snow\’\’\’\’sun

    2.2    对于PHP magic_quotes_gpc=off 的状况

    必须使用addslashes()对输入数据进行处理,但并不须要使用stripslashes()格式化输出,由于addslashes()并未将反斜杠一块儿写入数据库,只是帮助mysql完成了sql语句的执行。

例如:

    1)条件: PHP magic_quotes_gpc=off

    写入数据库的字符串未通过任何过滤处理。从数据库读出的字符串也未做任何处理。

    数据:  $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).

    操做: 将字符串:”snow”’’sun” 写入数据库,

    结果: 出现sql语句错误,mysql不能顺利完成sql语句,写入数据库失败。

    数据库保存格式:无数据。

    输出数据格式:无数据。

    说明: 对于未经处理的单引号在写入数据库时会使sql语句发生错误。

    2)条件: PHP magic_quotes_gpc=off

    写入数据库的字符串通过函数addslashes()处理。从数据库读出的字符串未做任何处理。

    数据:  $data=”snow”’’sun” ; (snow和sun之间是四个连续的单引号).

    操做: 将字符串:”snow”’’sun” 写入数据库,

    结果: sql语句顺利执行,数据成功写入数据库

    数据库保存格式:snow”’’sun (和输入同样)

    输出数据格式:snow”’’sun (和输入同样)

    说明: addslashes()函数将单引号转换为\’的转义字符使sql语句成功执行,

    但\’并未做为数据存入数据库,数据库保存的是snow”’’sun 而并非咱们想象的snow\’\’\’\’sun

    3. 产生的问题及解决方法

    1)若是发现php.ini配置为不给GPC变量自动添加转义斜线,则PHP自动为GPC添加转义斜线。可是事实上,这是错误的,由于它改变了GPC变量原来的值。有这个遗留习惯的缘由是PHP程序使用每每配合mysql, 而mysql对特殊字符的转义,采起的是添加转义斜线,但若是使用其它类型数据库,如mssql,oci,sybase 那么,给GPC添加转义斜线,更是个错误;进一步,若是GPC数据不须要存入数据库,而保存到文件系统,或转发给其它程序呢?更是很严重的错误逻辑。

正确的作法是:
1.PHP程序入口去掉转义斜线(若php.ini配置为自动添加转义斜线)
2.在写入mysql时,使用mysql_real_escape_string而不是addcslashes来转义变量
由于前者比后者更为安全(字符集相关的)

3. 经过get_magic_quotes_gpc()函数获取magic_quotes_gpc参数配置状况,根据配置进行操做。

//若是magic_quotes_gpc=Off,那就为提单提交的$_POST['message']里的敏感字符加反斜杠
//magic_quotes_gpc=On的状况下,则不加
if (!get_magic_quotes_gpc()) {
$_POST['message'] = addslashes($_POST['message']);
} else {}

4.扩展该方法

function quotes($content)
{
//若是magic_quotes_gpc=Off,那么就开始处理
if (!get_magic_quotes_gpc()) {
//判断$content是否为数组
if (is_array($content)) {
//若是$content是数组,那么就处理它的每个单无
foreach ($content as $key=>$value) {
$content[$key] = addslashes($value);
}
} else {
//若是$content不是数组,那么就仅处理一次
addslashes($content);
}
} else {
//若是magic_quotes_gpc=On,那么就不处理
}
//返回$content
return $content;
}

综述一下:
1.针对系统管理员,应该配置php.ini
magic_quotes_gpc=Off
magic_quotes_runtime=Off
magic_quotes_sybase=Off
针对php开发人员,更准确的逻辑:
1.检查php环境是否配置为自动添加转义斜线,如果,应该调用stripslashes去掉$_REQUEST, $_GET,$_POST,$_COOKIE的转义斜线
2.查询/写入/修改数据至mysql时,再使用mysql_real_escape_string转义之

注意:

这个特性在PHP5.3.0中已经废弃而且在5.4.0中已经移除了(This feature has been DEPRECATED as of PHP 5.3.0 and REMOVED as of PHP 5.4.0.)。因此没有理由再使用魔术引号,由于它再也不是 PHP 支持的一部分。 不过它帮助了新手在不知不觉中写出了更好(更安全)的代码。 可是在处理代码的时候,最好是更改你的代码而不是依赖于魔术引号的开启。

相关文章
相关标签/搜索