php中的“魔术引号”- magic quotes

PHP解析文件存入数据库时,到某一行突然程序就终止,也不报任何错误。根据经验,可能是文件中某一行存在引号,果然文件中存在如下行:

 

Co-localization.Huh-O'Shea-2003.txt

 


致数据库查询时出现如下形式的语句:

INSERTINTO TABLE xxx (xxx,xxx,xxx) VALUES (‘dgdgd’,’fgh’fgh’,’hfhf’);

这样存入数据库时,数据库系统无法判断引号的配对情况,导致数据存储不进去。然后在网上查找资料发现get_magic_quotes_gpc,get_magic_quotes_runtime,addslashes这三个函数被广泛提到,下面一一介绍。
       一、首先来介绍addslashes函数,根据图示英文文档,它会在单引号(‘),双引号(“),反斜线(\)和空字符(null)前加上”\”进行转义。
image001.png  
接下来使用代码进行测试:
    image003.png  
运行之后,并没有报错,但数据库也没有存入相应数据,接下来我们echo出$query来看看:
        image004.png  
所以很明显,数据库不能识别要插入到数据库中的值。接下来我们修改一行代码
        image005.png  
将上面的第四行加上addslashes函数,再来看结果并同样echo $query:
image006.png  
image007.png  
那么$query中的引号就已经被转义,且能顺利存入到数据库中,所以遇到引号不能存入到数据库中的时候,addslashes是一个很好的选择。
       二、magic_quotes_gpc。
image008.png  
从这看以看出,这个是自动对COOKIE,POST,GET中的‘ , “,\ ,null进行转义。get_magic_quotes_gpc只是获取目前magic_quotes_gpc的功能是否开启的状态,首先我到自己的php.ini文件里查看配置:
image010.png  
说明此功能在我的php是开启的,我们可以echo这个函数的结果来验证:
     image011.png   image012.png  
说明此功能的确已经在我的php里开启。接下来就是非常重要的一点,网上很多人都有包含类似信息的文章:
image013.png  
但是通过我自己的测试,这显然是错误的。大家还记得第一步,我没用addslashes函数之前,我的magic_quotes_gpc=on,通过上面的验证大家也能够看到。但是如果不用addslashes函数处理,是存不进去的。根据上面提供的英文文档,也没提到过除POST,GET,COOKIE之外的其他内容能实现自动转义,所以magic_quotes_gpc对于要存入数据库转义的字符串是无效的。
接下来我开始验证这个功能对magic_quotes_gpc对上述三种方法是否有效:
       1.首先验证POST:
image014.png  
然后到test3.php中去接收:
image015.png  
然后来看输出结果:
image016.png  
image017.png  
从这里可以看出的确自动转义了POST中的内容。
       2.接下来测试GET:
image018.png  
image019.png  
image020.png  
image021.png  
所以对于GET同样是有效的。
       3.接下来就是COOKIE:
image022.png  
image023.png   image024.png  
说明COOKIE同样有效
       三、接下来magic_quotes_runtime
image025.png  
此信息为为从文件和数据库来的外部数据都能进行自动转义。
下面依然进行测试:

1.   由于存入数据库中的数据都是必须转义好才能存进去的,所以从数据库里把数据取出来的时候,magic_quotes_runtime基本上都不需要使用。

2.   接下来,对文件传入数据测试此功能:


image027.png  
image028.png  
image029.png  
接下来把magic_quotes_runtime功能打开:
image030.png  
image031.png  
所以可以看出,此功能开启后的确能够对外部文件和数据进行自动转义。
总结:
       1.以下是两个功能的区别:
      如果数据源是外部文件和数据库数据的时候,为避免给每行加addslashes,可以直接开启magic_quotes_runtime功能。
      如果是内部POST,GET,COOKIE的时候,只能用magic_quotes_gpc功能,且该功能不能适用于其他形式。
       2.应该注意的地方:
magic_quotes_gpc对POST和GET传递的内容已经行转义,所以后续操作切勿再转义,否则会造成双重转义,反而数据出现错误。
       3.建议:
上述功能的转义都只能针对那么几个符号,对于其他的如脚本注入等的防御几乎没有,所以建议关闭magic_quotes_gpc功能,对于用户输入的信息采用其他方式进行转义,如mysqli_real_escape_string,htmlentities等。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值