php实现处理输入转义字符的代码


Posted in PHP onNovember 08, 2015
先来个函数,是最近WordPress 3.6中刚刚引入的

/**
 * Add slashes to a string or array of strings.
 *
 * This should be used when preparing data for core API that expects slashed data.
 * This should not be used to escape data going directly into an SQL query.
 *
 * @since 3.6.0
 *
 * @param string|array $value String or array of strings to slash.
 * @return string|array Slashed $value
 */
function wp_slash( $value ) {
    if ( is_array( $value ) ) {
        foreach ( $value as $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($$v as $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 字符将不会进行转义。

我表单内容本来是:<img alt=”" width=”400″ height=”300″ src=”/Upfiles/201105/images/1306657040.jpg” />

<img alt=\”\” width=\”400\” height=\”300\” src=\”/Upfiles/201105/images/1306657040.jpg\” />

对策一:修改php.ini文件(修改php.ini这个方法就不说了,大家可以google下)

对策二:把转义的给取消了

第一步:找到你提交的数据比如$_POST['content'],将其改成$content=stripslashes($_POST['content']);

第二步:以后在使用$POST['content']的地方都换成$content

第三步:提交到数据库,数据库储存还是正常的:<img alt=”" width=”400″ height=”300″ src=”/Upfiles/201105/images/1306657040.jpg” />读出来又成了

<img alt=\”\” 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语句的执行。

PHP 相关文章推荐
在php MYSQL中插入当前时间
Apr 06 PHP
DEDE采集大师官方留后门的删除办法
Jan 08 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
Jul 04 PHP
php中time()和mktime()方法的区别
Sep 28 PHP
浅析PHP的静态成员函数效率更高的原因
Jun 13 PHP
php输入流php://input使用浅析
Sep 02 PHP
PHP性能分析工具XHProf安装使用教程
May 13 PHP
PHP中把错误日志保存在系统日志中(Windows系统)
Jun 23 PHP
PHP内存使用情况如何获取
Oct 10 PHP
php fread函数使用方法总结
May 28 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
Oct 24 PHP
浅谈PHP7中的一些小技巧
May 29 PHP
修复ShopNC使用QQ 互联时提示100010 错误
Nov 08 #PHP
详解PHP数组赋值方法
Nov 07 #PHP
php实现点击可刷新验证码
Nov 07 #PHP
PHP中SSO Cookie登录分析和实现
Nov 06 #PHP
使用PHP similar text计算两个字符串相似度
Nov 06 #PHP
PHP正则表达式之捕获组与非捕获组
Nov 06 #PHP
php创建无限级树型菜单
Nov 05 #PHP
You might like
全国FM电台频率大全 - 6 辽宁省
2020/03/11 无线电
目录,文件操作详谈―PHP
2006/11/25 PHP
PHP 上传文件的方法(类)
2009/07/30 PHP
php计算当前程序执行时间示例
2014/04/24 PHP
PHP新特性详解之命名空间、性状与生成器
2017/07/18 PHP
laravel 输出最后执行sql 附:whereIn的使用方法
2019/10/10 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
初窥JQuery(二)事件机制(2)
2010/12/06 Javascript
js移除事件 js绑定事件实例应用
2012/11/28 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
如何用JavaScript动态呼叫函数(两种方式)
2013/05/03 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
js实现仿QQ秀换装效果的方法
2015/03/04 Javascript
在JavaScript中如何解决用execCommand(
2015/10/19 Javascript
php利用curl获取远程图片实现方法
2015/10/26 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐)
2016/06/23 Javascript
javascript使用闭包模拟对象的私有属性和方法
2016/10/05 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
2017/06/09 Javascript
微信小程序 POST请求的实例详解
2017/09/29 Javascript
深入了解javascript 数组的sort方法
2018/06/01 Javascript
详解webpack 最简打包结果分析
2019/02/20 Javascript
vuex实现购物车的增加减少移除
2020/06/28 Javascript
[58:37]Serenity vs Fnatic 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
python使用socket远程连接错误处理方法
2015/04/29 Python
详解python中的 is 操作符
2017/12/26 Python
Python实现使用dir获取类的方法列表
2019/12/24 Python
手机配件第一品牌:ZAGG
2017/05/28 全球购物
美国香薰蜡烛品牌:PADDYWAX
2018/10/06 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?用contains来区分是否有重复的对象。还是都不用
2013/07/30 面试题
中海讯通笔试题
2015/09/15 面试题
工厂厂长岗位职责
2013/11/08 职场文书
大众服装店创业计划书范文
2014/01/01 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
2015年学校少先队工作总结
2015/07/20 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
JavaScript 原型与原型链详情
2021/11/02 Javascript