PHP中字符安全过滤函数使用小结


Posted in PHP onFebruary 25, 2015

在WEB开发过程中,我们经常要获取来自于世界各地的用户输入的数据。但是,我们“永远都不能相信那些用户输入的数据”。所以在各种的Web开发语言中,都会提供保证用户输入数据安全的函数。在PHP中,有些非常有用并且方便的函数,它们可以帮助你防止出现像SQL注入攻击,XSS攻击等问题。

1. mysql_real_escape_string()

这个函数曾经对于在PHP中防止SQL注入攻击提供了很大的帮助,它对特殊的字符,像单引号和双引号,加上了“反斜杠”,确保用户的输入在用它去查询之前已经是安全的了。但你要注意你是在连接着数据库的情况下使用这个函数。
但现在mysql_real_escape_string()这个函数基本不用了,所有新的应用开发都应该使用像PDO这样的库对数据库进行操作,也就是说,我们可以使用现成的语句防止SQL注入攻击。

2. addslashes()

这个函数和上面的mysql_real_escape_string()很相似,同样是为特殊字符加上反斜杠,但要注意当设置文件php.ini中的 magic_quotes_gpc 的值为“on”时,不要使用这个函数。magic_quotes_gpc = on时,对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串 使用 addslashes(),因为这样会导致双层转义。你可以通过PHP中get_magic_quotes_gpc()函数检查这个变量的值。

3. htmlentities()

这个函数对过滤用户输入数据非常有用,它可以把字符转换为 HTML 实体。比如,当用户输入字符“<”时,就会被该函数转化为HTML实体 “<”(查看源代码是将会看到“<”),因此防止了XSS和SQL注入攻击,对于无法被识别的字符集将被忽略,并由 ISO-8859-1 代替

4. htmlspecialchars()

这个函数跟上面的很相似,HTML中的一些字符有着特殊的含义,如果要体现这样的含义,就要被转换为HTML实体,这个函数会返回转换后的字符串。

5. strip_tags()

这个函数可以去除字符串中所有的HTML,JavaScript和PHP标签,当然你也可以通过设置该函数的第二个参数,忽略过滤一些特定的标签。

6. intval()

intval其实不属于过滤的函数,它的作用是将变量转成整数类型。在我们需要得到一个整数的参数时非常有用,你可以用这个函数让你的PHP代码更安全,特别是当你在解析id,年龄这样的整数形数据时。

PHP关于表单提交特殊字符的处理方法做个汇总,主要涉及htmlspecialchars/addslashes/stripslashes/strip_tags/mysql_real_escape_string等几个函数联合使用,与大家共同交流。
一、几个与特殊字符处理有关的PHP函数

函数名 释义 介绍
htmlspecialchars 将与、单双引号、大于和小于号化成HTML格式 &转成& "转成" ' 转成' 转成>
htmlentities() 所有字符都转成HTML格式 除上面htmlspecialchars字符外,还包括双字节字符显示成编码等。
addslashes 单双引号、反斜线及NULL加上反斜线转义 被改的字符包括单引号(')、双引号(")、反斜线backslash (\) 以及空字符NULL。
stripslashes 去掉反斜线字符 去掉字符串中的反斜线字符。若是连续二个反斜线,则去掉一个,留下一个。若只有一个反斜线,就直接去掉。
quotemeta 加入引用符号 将字符串中含有. \\ + * ? [ ^ ] ( $ ) 等字符的前面加入反斜线"\" 符号。
nl2br() 将换行字符转成
strip_tags 去掉HTML及PHP标记 去掉字符串中任何HTML标记和PHP标记,包括标记封堵之间的内容。注意如果字符串HTML及PHP标签存在错误,也会返回错误。
mysql_real_escape_string 转义SQL字符串中的特殊字符 转义\x00 \n \r 空格 \ ' " \x1a,针对多字节字符处理很有效。mysql_real_escape_string会判断字符集,mysql_escape_string则不用考虑。

这些都是PHP内置的字符串过滤函数,十分简单实用,希望小伙伴们能用好他们。

PHP 相关文章推荐
认识并使用PHP超级全局变量
Jan 26 PHP
php Smarty 字符比较代码
Feb 27 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
Nov 21 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
Jan 12 PHP
如何解决PHP无法实现多线程的问题
Sep 25 PHP
Symfony2在Nginx下的配置方法图文教程
Feb 04 PHP
orm获取关联表里的属性值
Apr 17 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
Apr 23 PHP
php fseek函数读取大文件两种方法
Oct 12 PHP
php面向对象基础详解【星际争霸游戏案例】
Jan 23 PHP
PHP查找一列有序数组是否包含某值的方法
Feb 07 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
Apr 05 PHP
PHP 魔术变量和魔术函数详解
Feb 25 #PHP
PDO防注入原理分析以及注意事项
Feb 25 #PHP
php短址转换实现方法
Feb 25 #PHP
php中mysql连接方式PDO使用详解
Feb 25 #PHP
php中数据库连接方式pdo和mysqli对比分析
Feb 25 #PHP
Mac OS下配置PHP+MySql环境
Feb 25 #PHP
php禁止某ip或ip地址段访问的方法
Feb 25 #PHP
You might like
PHP生成静态页
2006/11/25 PHP
PHP中使用gettext来支持多语言的方法
2011/05/02 PHP
PHP生成随机用户名和密码的实现代码
2013/02/27 PHP
设置php页面编码的两种方法示例介绍
2014/03/03 PHP
CI框架中site_url()和base_url()的区别
2015/01/07 PHP
再谈IE中Flash控件的自动激活 ObjectWrap
2007/03/09 Javascript
JS 时间显示效果代码
2009/08/23 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
面向切面编程(AOP)的理解
2015/05/01 Javascript
IE10中flexigrid无法显示数据的解决方法
2015/07/26 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
2015/12/01 Javascript
Struts2+jquery.form.js实现图片与文件上传的方法
2016/05/05 Javascript
解析JavaScript面向对象概念中的Object类型与作用域
2016/05/10 Javascript
深入理解jQuery3.0的domManip函数
2016/09/01 Javascript
js Element Traversal规范中的元素遍历方法
2018/04/19 Javascript
Taro集成Redux快速上手的方法示例
2018/06/21 Javascript
浅谈从React渲染流程分析Diff算法
2018/09/08 Javascript
vue从零实现一个消息通知组件的方法详解
2020/03/16 Javascript
JavaScript实现拖拽效果
2020/03/16 Javascript
Python类的动态修改的实例方法
2017/03/24 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
Django中自定义查询对象的具体使用
2019/10/13 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
python接入支付宝的实例操作
2020/07/20 Python
一款利用纯css3实现的win8加载动画的实例分析
2014/12/11 HTML / CSS
加拿大领先家居家具网上购物:Aosom.ca
2020/05/27 全球购物
电子专业推荐信范文
2013/11/18 职场文书
外贸销售员求职的自我评价
2013/11/23 职场文书
幼儿教师研修感言
2014/02/12 职场文书
Spark SQL 2.4.8 操作 Dataframe的两种方式
2021/10/16 SQL Server
公历12个月名称的由来
2022/04/12 杂记
python实现学员管理系统(面向对象版)
2022/06/05 Python