PHP字符转义相关函数小结(php下的转义字符串)


Posted in PHP onApril 12, 2007

文章中有不正确的或者说辞不清的地方,麻烦大家指出了~~~

与PHP字符串转义相关的配置和函数如下:
1.magic_quotes_runtime
2.magic_quotes_gpc
3.addslashes()和stripslashes()
4.mysql_escape_string()
5.addcslashes()和stripcslashes()
6.htmlentities() 和html_entity_decode()
7.htmlspecialchars()和htmlspecialchars_decode()

当magic_quotes_runtime打开时,php的大部分函数自动的给从外部引入的(包括数据库或者文件)数据中的溢出字符加上反斜线。
可以使用set_magic_quotes_runtime()与get_magic_quotes_runtime()‍设置和检测其状态。
注意:PHP5.3.0以上的版本已将这两个函数废弃,也就说在PHP5.3.0或以上版本时该选项已经为关闭了。

magic_quotes_gpc设置是否自动为GPC(GET,POST,COOKIE)传来的数据中的某些字符进行转义,
可以使用get_magic_quotes_gpc()检测其设置。
如果没有打开这项设置,可以使用addslashes()函数添加给字符串进行转义

addslashes()‍ 在指定的预定义字符前添加反斜杠。
预定义字符包括单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)。
以上是W3SCHOOL.COM.CN给出的解释俺一直觉的不是很准确
因为在magic_quotes_sybase=on时它将单引号(')转换成双引号(") 在magic_quotes_sybase=off时才将单引号(')转换成(\')
stripslashes()函数的功能与addslashes()‍正好相反,它的功能是去除转义的效果。

mysql_escape_string() 转义 SQL语句中使用的字符串中的特殊字符。‍
这里的特殊包括(\x00)、( \n)、( \r )、(\)、( ')、 (")、( \x1a)

addcslashes()‍以C 语言风格使用反斜线转义字符串中的字符,这个函数很少人去用,但是应该注意的是:当选择对字符 0,a,b,f,n,r,t 和 v 进行转义时,它们将被转换成 \0,\a,\b,\f,\n,\r,\t 和 \v。在 PHP 中,只有 \0(NULL),\r(回车符),\n(换行符)和 \t(制表符)是预定义的转义序列, 而在 C 语言中,上述的所有转换后的字符都是预定义的转义序列。同理stripcslashes()的功能就是去除其转义。

htmlentities() 把字符转换为 HTML 实体。(什么是HTML实体?自己GOOGLE吧~~)
具体参数请见这里,其逆反的函数html_entity_decode() -‍把 HTML 实体转换为字符。

htmlspecialchars()函数把一些预定义的字符转换为 HTML 实体。
这些预定义的字符是:
& (和号) 成为 &
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 <
> (大于) 成为 >
‍详细参数请见这里,其逆反函数是htmlspecialchars_decode() 把一些预定义的 HTML 实体转换为字符。

一点自己的体会:
>>多次的单引号转义可能引起数据库的安全问题
>> 不建议使用mysql_escape_string 来进行转义,建议在获取用户输入时候进行转义
>> 由于set_magic_quotes_runtime()‍在PHP5.3.0和以后版本已被废弃了, 所以之前的版本建议统一配置关闭:

if(phpversion() < '5.3.0') { 
set_magic_quotes_runtime(0); 
}

‍>> 无法通过函数来定义magic_quotes_gpc,因此建议在服务器上统一开启,写程序的时候应该在来判断下,避免没开启GPC引起安全问题
通过addslashes对GPC进行时候转义时,应注意当用户提交数组数据时对键值和值的过滤
if(!get_magic_quotes_gpc()) { 
$_GET = daddslashes($_GET); 
$_POST = daddslashes($_POST); 
$_COOKIE = daddslashes($_COOKIE); 
$_FILES = daddslashes($_FILES); 
} 
function daddslashes($string, $force = 1) { 
if(is_array($string)) { 
foreach($string as $key => $val) { 
unset($string[$key]); 
$string[addslashes($key)] = daddslashes($val, $force); 
} 
} else { 
$string = addslashes($string); 
} 
return $string; 
}

‍>> 利用在用户输入或输出时候转义HTML实体以防止XSS漏洞的产生!

今天碰到一个处理文件特殊字符的事情,再次注意到这个问题,在php中:

* 以单引号为定界符的php字符串,支持两个转义\'和\\
* 以双引号为定界符的php字符串,支持下列转义:
    \n 换行(LF 或 ASCII 字符 0x0A(10)) 
    \r 回车(CR 或 ASCII 字符 0x0D(13)) 
    \t 水平制表符(HT 或 ASCII 字符 0x09(9)) 
    \\ 反斜线 
    \$ 美元符号 
    \" 双引号 
    \[0-7]{1,3}               此正则表达式序列匹配一个用八进制符号表示的字符  
    \x[0-9A-Fa-f]{1,2}  此正则表达式序列匹配一个用十六进制符号表示的字符  

举几个例子:

一个包含\0特殊字符的例子:

$str = "ffff\0ffff";
echo(strlen($str));
echo("\n");
for($i=0;$i<strlen($str);$i++)echo("\t".ord($str{$i}));
echo("\n");

输出结果:
----------------------

9
        102     102     102     102     0       102     102     102     102

替换特殊字符的例子

$str = "ffff\0ffff";
$str = str_replace("\x0", "", $str);  
//或者用$str = str_replace("\0", "", $str); 
//或者用$str = str_replace(chr(0), "", $str); 
echo(strlen($str));
echo("\n");
for($i=0;$i<strlen($str);$i++)echo("\t".ord($str{$i}));
echo("\n");
输出结果:
----------------------
8
        102     102     102     102     102     102     102     102

八进制ascii码例子:

//注意,符合正则\[0-7]{1,3}的字符串,表示一个八进制的ascii码。
$str = "\0\01\02\3\7\10\011\08\8";  //这里的\8不符合要求,被修正为"\\8" (ascii为92和56)
echo(strlen($str));
echo("\n");
for($i=0;$i<strlen($str);$i++)echo("\t".ord($str{$i}));
echo("\n");
输出结果:
----------------------
11
        0       1       2       3       7       8       9       0       56      92      56

十六进制ascii码例子:

$str = "\x0\x1\x2\x3\x7\x8\x9\x10\x11\xff";
echo(strlen($str));
echo("\n");
for($i=0;$i<strlen($str);$i++)echo("\t".ord($str{$i}));
echo("\n");
输出结果:
----------------------
10
        0       1       2       3       7       8       9       16      17      255

PHP 相关文章推荐
提升PHP执行速度全攻略(上)
Oct 09 PHP
修改Zend引擎实现PHP源码加密的原理及实践
Apr 14 PHP
php+mysql写的简单留言本实例代码
Jul 25 PHP
php getsiteurl()函数
Sep 05 PHP
php中配置文件操作 如config.php文件的读取修改等操作
Jul 07 PHP
解析PHP中的内存管理,PHP动态分配和释放内存
Jun 28 PHP
PHP生成图片验证码、点击切换实例
Jun 25 PHP
你应该知道PHP浮点数知识
May 13 PHP
PHP使用MPDF类生成PDF的方法
Dec 08 PHP
PHP使用redis消息队列发布微博的方法示例
Jun 22 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
Nov 16 PHP
php两点地理坐标距离的计算方法
Dec 29 PHP
如何提高MYSQL数据库的查询统计速度 select 索引应用
Apr 11 #PHP
相对路径转化成绝对路径
Apr 10 #PHP
PHP实现MVC开发得最简单的方法――模型
Apr 10 #PHP
PHP+Tidy-完美的XHTML纠错+过滤
Apr 10 #PHP
ASP和PHP都是可以删除自身的
Apr 09 #PHP
收藏的一个php小偷的核心程序
Apr 09 #PHP
PHP中文汉字验证码
Apr 08 #PHP
You might like
php中$_GET与$_POST过滤sql注入的方法
2014/11/03 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
JavaScript 异步调用框架 (Part 1 - 问题 &amp; 场景)
2009/08/03 Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
2012/07/17 Javascript
js转义字符介绍
2013/11/05 Javascript
js向上无缝滚动,网站公告效果 具体代码
2013/11/18 Javascript
javascript搜索框效果实现方法
2015/05/14 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
Dojo获取下拉框的文本和值实例代码
2016/05/27 Javascript
servlet+jquery实现文件上传进度条示例代码
2017/01/25 Javascript
vue导出html、word和pdf的实现代码
2018/07/31 Javascript
在AngularJs中设置请求头信息(headers)的方法及不同方法的比较
2018/09/04 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
2019/06/03 Javascript
基于layui实现高级搜索(筛选)功能
2019/07/26 Javascript
微信小程序点击item使之滚动到屏幕中间位置
2020/03/25 Javascript
浅谈Python类里的__init__方法函数,Python类的构造函数
2016/12/10 Python
python 性能优化方法小结
2017/03/31 Python
python中如何使用正则表达式的集合字符示例
2017/10/09 Python
python图像和办公文档处理总结
2019/05/28 Python
python3.6 如何将list存入txt后再读出list的方法
2019/07/02 Python
Django命名URL和反向解析URL实现解析
2019/08/09 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
2019/09/20 Python
Python中关于浮点数的冷知识
2019/09/22 Python
python+Django实现防止SQL注入的办法
2019/10/31 Python
使用python代码进行身份证号校验的实现示例
2019/11/21 Python
Django多进程滚动日志问题解决方案
2019/12/17 Python
Python使用循环神经网络解决文本分类问题的方法详解
2020/01/16 Python
快速查找Python安装路径方法
2020/02/06 Python
python tkinter之 复选、文本、下拉的实现
2020/03/04 Python
Ryderwear美国官网:澳大利亚高端健身训练装备品牌
2018/04/24 全球购物
马耳他航空公司官方网站:Air Malta
2019/05/15 全球购物
意向协议书范本
2014/04/23 职场文书
争当四好少年演讲稿
2014/09/13 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
乡镇干部个人整改措施思想汇报
2014/10/10 职场文书
JavaScript的Set数据结构详解
2022/02/18 Javascript