php实现处理输入转义字符的代码
/** *Addslashestoastringorarrayofstrings. * *ThisshouldbeusedwhenpreparingdataforcoreAPIthatexpectsslasheddata. *ThisshouldnotbeusedtoescapedatagoingdirectlyintoanSQLquery. * *@since3.6.0 * *@paramstring|array$valueStringorarrayofstringstoslash. *@returnstring|arraySlashed$value */ functionwp_slash($value){ if(is_array($value)){ foreach($valueas$k=>$v){ if(is_array($v)){ $value[$k]=wp_slash($v); }else{ $value[$k]=addslashes($v); } } }else{ $value=addslashes($value); } return$value; }
先说明1个PHP内置函数:get_magic_quotes_gpc()
这个函数的作用就是得到php.ini设置中magic_quotes_gpc选项的值。
而magic_quotes_gpc选项如果值为On,PHP解析器就会自动为post、get、cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的致命的错误。
开启时,单引号(')、双引号(”)、反斜线(\)与NUL(NULL字符)等字符都会被加上反斜线,否则需要手动处理,就用到了addslashes()
magic_quotes_gpc值为On时返回1,否则返回0
addslashes()函数在指定的预定义字符前添加反斜杠。也就是上面列出的字符
但在PHP5.4以上取消了get_magic_quotes_gpc()内置函数,为了避免以后出错,所以这样过滤所有输入:
if(!function_exists(get_magic_quotes_gpc)||!get_magic_quotes_gpc())){ foreach(array('_COOKIE','_POST','_GET')as$v){ foreach($$vas$kk=>$vv){ $kk{0}!='_'&&$$v[$kk]=addslashes($vv); } } }
在处理mysql和GET、POST的数据时,常常要对数据的引号进行转义操作。
PHP中有三个设置可以实现自动对'(单引号),”(双引号),\(反斜线)和NULL字符转转。
PHP称之为魔术引号,这三项设置分别是
magic_quotes_gpc
影响到HTTP请求数据(GET,POST和COOKIE)。不能在运行时改变。在PHP中默认值为on。
这个开启时,通过GET,POST,COOKIE传递的数据会自动被转义。
如test.php?id=abc'de"f
echo$_GET['id']; # 会得到abc\'de\"f
magic_quotes_gpc=On;这个开启了,对写入数据库是没有影响的,比如上面的$_GET['id'] 写到数据库里面,依然是abc'de"f,
相反,如果magic_quotes_gpc=Off;那么字符中要带有引号(不管单引号还是双引号),直接写入mysql都会直接变成空白
但是,如果你将它写入文档,而非mysql。那么它将是abc\'de\"f
magic_quotes_runtime
如果打开的话,大部份从外部来源取得数据并返回的函数,包括从数据库和文本文件,所返回的数据都会被反斜线转义。该选项可在运行的时改变,在PHP中的默认值为off。
magic_quotes_sybase
如果打开的话,将会使用单引号对单引号进行转义而非反斜线。此选项会完全覆盖magic_quotes_gpc。如果同时打开两个选项的话,单引号将会被转义成”。而双引号、反斜线和NULL字符将不会进行转义。
我表单内容本来是:<imgalt=”"width=”400″height=”300″src=”/Upfiles/201105/images/1306657040.jpg”/>
<imgalt=\”\”width=\”400\”height=\”300\”src=\”/Upfiles/201105/images/1306657040.jpg\”/>
对策一:修改php.ini文件(修改php.ini这个方法就不说了,大家可以google下)
对策二:把转义的给取消了
第一步:找到你提交的数据比如$_POST['content'],将其改成$content=stripslashes($_POST['content']);
第二步:以后在使用$POST['content']的地方都换成$content
第三步:提交到数据库,数据库储存还是正常的:<imgalt=”"width=”400″height=”300″src=”/Upfiles/201105/images/1306657040.jpg”/>读出来又成了
<imgalt=\”\”width=\”400\”height=\”300\”src=\”/Upfiles/201105/images/1306657040.jpg\”/>(这个应该知道怎么解决了吧?要不我再罗嗦下吧)
第四步:将数据库读取的内容再用stripslashes()过滤一下。
stripslashes() 这个函数,删除由addslashes()函数添加的反斜杠。用于清理从数据库或HTML表单中取回的数据
(
PHP页面中如果不希望出现以下情况:
单引号被转义为\'
双引号被转义为\"
那么可以进行如下设置以防止:
在php.ini中设置:magic_quotes_gpc=Off)
总结如下:
1.对于magic_quotes_gpc=on的情况,
我们可以不对输入和输出数据库的字符串数据作
addslashes()和stripslashes()的操作,数据也会正常显示。
如果此时你对输入的数据作了addslashes()处理,
那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。
2.对于magic_quotes_gpc=off的情况
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。