PHP解析文件存入数据库时,到某一行突然程序就终止,也不报任何错误。根据经验,可能是文件中某一行存在引号,果然文件中存在如下行:
致数据库查询时出现如下形式的语句:
一、首先来介绍addslashes函数,根据图示英文文档,它会在单引号(‘),双引号(“),反斜线(\)和空字符(null)前加上”\”进行转义。
接下来使用代码进行测试:
运行之后,并没有报错,但数据库也没有存入相应数据,接下来我们echo出$query来看看:
所以很明显,数据库不能识别要插入到数据库中的值。接下来我们修改一行代码
将上面的第四行加上addslashes函数,再来看结果并同样echo $query:
那么$query中的引号就已经被转义,且能顺利存入到数据库中,所以遇到引号不能存入到数据库中的时候,addslashes是一个很好的选择。
二、magic_quotes_gpc。
从这看以看出,这个是自动对COOKIE,POST,GET中的‘ , “,\ ,null进行转义。get_magic_quotes_gpc只是获取目前magic_quotes_gpc的功能是否开启的状态,首先我到自己的php.ini文件里查看配置:
说明此功能在我的php是开启的,我们可以echo这个函数的结果来验证:
说明此功能的确已经在我的php里开启。接下来就是非常重要的一点,网上很多人都有包含类似信息的文章:
但是通过我自己的测试,这显然是错误的。大家还记得第一步,我没用addslashes函数之前,我的magic_quotes_gpc=on,通过上面的验证大家也能够看到。但是如果不用addslashes函数处理,是存不进去的。根据上面提供的英文文档,也没提到过除POST,GET,COOKIE之外的其他内容能实现自动转义,所以magic_quotes_gpc对于要存入数据库转义的字符串是无效的。
接下来我开始验证这个功能对magic_quotes_gpc对上述三种方法是否有效:
1.首先验证POST:
然后到test3.php中去接收:
然后来看输出结果:
从这里可以看出的确自动转义了POST中的内容。
2.接下来测试GET:
所以对于GET同样是有效的。
3.接下来就是COOKIE:
说明COOKIE同样有效
三、接下来magic_quotes_runtime
此信息为为从文件和数据库来的外部数据都能进行自动转义。
下面依然进行测试:
接下来把magic_quotes_runtime功能打开:
所以可以看出,此功能开启后的确能够对外部文件和数据进行自动转义。
总结:
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等。
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 image001.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/0057298z8jqt5zm1z15xwy.png)
接下来使用代码进行测试:
![image003.png image003.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005730k9fndvqtsvjd1k6i.png)
运行之后,并没有报错,但数据库也没有存入相应数据,接下来我们echo出$query来看看:
![image004.png image004.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/00573030bx0z1ed0dmwh07.png)
所以很明显,数据库不能识别要插入到数据库中的值。接下来我们修改一行代码
![image005.png image005.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005730khmtn5my6anram2b.png)
将上面的第四行加上addslashes函数,再来看结果并同样echo $query:
![image006.png image006.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005730wm2d2doewe7qdwnd.png)
![image007.png image007.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005730rbnfrudufg3hoof7.png)
那么$query中的引号就已经被转义,且能顺利存入到数据库中,所以遇到引号不能存入到数据库中的时候,addslashes是一个很好的选择。
二、magic_quotes_gpc。
![image008.png image008.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005730lxmf3x3mucgc5tiz.png)
从这看以看出,这个是自动对COOKIE,POST,GET中的‘ , “,\ ,null进行转义。get_magic_quotes_gpc只是获取目前magic_quotes_gpc的功能是否开启的状态,首先我到自己的php.ini文件里查看配置:
![image010.png image010.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/0057313hisjhxbahwd9zx8.png)
说明此功能在我的php是开启的,我们可以echo这个函数的结果来验证:
![image011.png image011.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005731vsuowtfumu2uktrf.png)
![image012.png image012.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005731r0q3t3e35vryqou0.png)
说明此功能的确已经在我的php里开启。接下来就是非常重要的一点,网上很多人都有包含类似信息的文章:
![image013.png image013.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005731yhiodjicjtd5qob5.png)
但是通过我自己的测试,这显然是错误的。大家还记得第一步,我没用addslashes函数之前,我的magic_quotes_gpc=on,通过上面的验证大家也能够看到。但是如果不用addslashes函数处理,是存不进去的。根据上面提供的英文文档,也没提到过除POST,GET,COOKIE之外的其他内容能实现自动转义,所以magic_quotes_gpc对于要存入数据库转义的字符串是无效的。
接下来我开始验证这个功能对magic_quotes_gpc对上述三种方法是否有效:
1.首先验证POST:
![image014.png image014.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005731zaj8bdkdoboeoj54.png)
然后到test3.php中去接收:
![image015.png image015.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005732e5zjvtzdghtzgdqv.png)
然后来看输出结果:
![image016.png image016.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005732a03f3tfaaoyaymoz.png)
![image017.png image017.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/00573208c0rzlrd0r5p7lx.png)
从这里可以看出的确自动转义了POST中的内容。
2.接下来测试GET:
![image018.png image018.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005732aoaz3x4reer9nn6o.png)
![image019.png image019.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/0057323oszsnhpxhujjnhh.png)
![image020.png image020.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005732ypqqp8zqu7ppppux.png)
![image021.png image021.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005733gxc4i47xlgx4dhc4.png)
所以对于GET同样是有效的。
3.接下来就是COOKIE:
![image022.png image022.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005733teie88tvxfetqvqo.png)
![image023.png image023.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/0057334jbq3b5nne54nri7.png)
![image024.png image024.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/0057330u3tuzuu4k4mz9ru.png)
说明COOKIE同样有效
三、接下来magic_quotes_runtime
![image025.png image025.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005733llqwdw3nuqg7beec.png)
此信息为为从文件和数据库来的外部数据都能进行自动转义。
下面依然进行测试:
1. 由于存入数据库中的数据都是必须转义好才能存进去的,所以从数据库里把数据取出来的时候,magic_quotes_runtime基本上都不需要使用。
2. 接下来,对文件传入数据测试此功能:
![image027.png image027.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005734k0h0jw9woigiot3u.png)
![image028.png image028.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005734gcllk2g8zo8dgagc.png)
![image029.png image029.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005734h5ad5zp95s0posz9.png)
接下来把magic_quotes_runtime功能打开:
![image030.png image030.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005734ty2z7f617867u80o.png)
![image031.png image031.png](http://bbs.bingyan.net/data/attachment/forum/201110/31/005734qsudssz6qtdhddu8.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等。