0

0

PHP字符串编码与转义

php中文网

php中文网

发布时间:2016-06-06 16:04:21

|

1628人浏览过

|

来源于php中文网

原创

因为php程序经常与html页、web地址(url)以及数据库交互,所以php提供一些函数来帮助你处理这些类型的数据。html、web页地址和数据库命令都是字符串,但是它们每个都要求不同的字符以不同的方法来转义。例如,在web地址中一个空格被写成%20,而直接量小于符号(html:在html中特殊的字符以实体(entity)表示,如&和对所有特殊字符进行实体引用:函数htmlentities()将html字符转换为对应的实体(除了空格符)。包括小于符号()、与号(&)和重音字符。(entity实体)
只对html语法字符进行实体引用:函数htmlspacialchars()转换最小的实体集来生成合法的html。下面的实体被转换:
与符号(&)被转换成&
双引号(")被转换成"
单引号(')被转换成'(就像调用htmlentities()时使用ent_quotes的效果)
小于号(大于号(>)被转换成>
如果有一个应用程序来显示用户填入表单的数据,则要在显示和保存数据之前通过htmlspecialchars()处理数据。如果没有处理的话,一旦用户提交了像"angle
删除html标签
函数strip_tags()从字符串中删除html标签:
$input='

Howdy,"Cowboy"

;
$output=strip_tags($input);//$output是'Howdy,"Cowboy"'
函数可以有第二个参数来指定在字符串中留下的标签。之列出标签的开始形式,在第二个参数中列出的标签结束形式也将被保留:
$input='The bold tags willstay

';
$output=strip_tags($input,'');//$output是'The bold tags will stay'
在保留标签中的属性不会被strip_tags()改变。由于HTML标签属性(例如style和onmouseover)可以影响Web页面的外观和行为,所以用strip_tags()保留一些标签可能会导致无法删除所有潜在的冗余内容。

提取元标签
如果你把Web页面的HTML存在一个字符串中,函数get_meta_tags()可返回包含该页面中元标签(meta tag)内容的数组。元标签的名字(keywords、author、escription等)成为数组的键,而元标签的内容则成为对应的值:
$meta_tags=get_meta_tags('http://www.example.com/');
echo "Web page made by {$meta_tags[author]}";
函数一般的形式是:
$array=get_meta_tags(filename[,use_include_path]);
可以指定参数use_include_path为true,这样可使PHP尝试用标准包含路径打开文件。

URL:PHP提供了一些函数用于对URL进行编码和解码。有两种方法对URL编码,其区别在于如何处理空格。第一种(根据RFC1738规范)把空格当做URL中的另一个非法字符并把它编码为%20。第二种(执行application/x-www-form-urlencoded系统)把空格编码为一个+并且把它用于建立查询的字符串中。
注意并不需要对一个完整的URL使用这些函数,例如http://www.example.com/hello,因为它们会转义冒号和反斜杠:
http%3A%2F%2Fwww.example.com%2Fhello
应该只编码部分URL(在http://www.example.com/后面的部分),随后再加上协议和域名。

RFC1738编码和解码
要把字符串依照URL约定编码,可以使用rawurlencode():
$output=rawurlencode(input);
该函数接收一个字符串并返回对该字符串的拷贝,该拷贝中把非法URL字符按%dd约定编码。
如果你要为一个页面里的链接动态生成超级链接地址,则需要用rawurlencode()转换它们:
$name="Programming PHP";
$output=rawurlencode($name);
echo "http://localhost/$output";
http://localhost/Programming%20PHP
函数rawurldecode()用于解码被编码过的URL字符串:
$encoded='Programming%20PHP';
echo rawurldecode($encoded);
Programming PHP

查询字符串编码
urlencode()和urldecode()函数和它们原始版本(即rawurlencode()和rawurldecode())的不同仅在于它们把空格编码为加号(+),而不是%20。这是用于创建查询字符串(query string)和cookie值的格式,但是因为这些值在通过表单或cookie传送时会自动解码,所以你不需要使用这些函数来处理当前页的查询字符串或cookie。这两个函数对于生成查询字符串是很有用的:
$base_url='http://www.google.com/q=';
$query='PHP sessions -cookies';
$url=$base_url.urlencode($query);
echo $url;
http://www.google.com/q=PHP+sessions+cookies

SQL:绝大多数数据库系统都要求将SQL查询字符串进行转义。SQL的转义方法相当简单——在单引号、双引号、空字节和反斜杠前面加上一个反斜杠()。addslashes()函数可添加这些反斜杠,stripslashes()函数则删除它们:
$string="It's never going to work," she cried,
as she hit the backslash()key.
The_End;
echo addslashes($string);
"It's never going to work,"she cried,
as she hit the backslash (\) key.
echo stripslashes($string);
"It's never going to work," she cried,
as she hit the backslash () key.
提示:一些数据库(如SYBASE)用另一个单引号为单引号转义,而不是一个反斜杠。对于这些数据库,可以在php.ini文件中打开magic_quotes_sybase。

数据错误的以代码形式执行是漏洞的根本原因,那么修复方法当然是让数据只能以数据的形式被SQL层认识并带入查询。
如果没有用加反斜杠转义,那么id=111'类似的查询条件就会直接带入查询语句:select * from table where id='$id'就变成了select * from table where id='111'';查询语句有未闭合的单引号报错
而如果我们使用了函数addslashes()进行反斜杠转义,那么SQL查询语句会变成:select * from table where id='111'',所以id=111'中的单引号由于被以'的形式传递,所以会以值的形式执行,SQL就会认为id=111'中的单引号是id变量值的一部分,那么查询结果有可能存在也有可能不存在,(例如,如果存在id为王二小's的数据库值,就存在查询结果),但是最重要的是,单引号在这里是以值的形式传递的,这才是最最根本的本质。

立即学习PHP免费学习笔记(深入)”;

1. 对于PHP magic_quotes_gpc=on的情况,

我们可以不对输入和输出数据库的字符串数据作,addslashes()和stripslashes()的操作,数据也会正常显示。

如果此时你对输入的数据作了addslashes()处理,那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。

2. 对于PHP magic_quotes_gpc=off 的情况,必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出。因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。

有的网站,外面是可以设置标签为“编程's”等这种格式的,但是一点击保存,就报错了,特别搞。然后不管哪个访问对应标签的文章,都会看到这个报错。这就是由于从用户输入到PHP代码再到SQL层,其中PHP整合SQL查询语句时的错误编写造成的。
知识的积累过程,总是起先你不懂,而后学了一点,就颠儿颠儿的以为“儿得矣”,当有一天你突然迷茫了,觉得哪儿似乎没那么形而上的通畅,然后你会不自主的想到底哪儿还有问题呢?你会迷茫很久,直到有一天终于找到了那个缺角,然后它是那么美好因为当你找到的时候就差不多已经有能力填充了。一切便豁然开朗。

有的时候,会略显无奈,因为人们越来越浮躁,而安全环境刚建立,安全问题刚得到更多的重视,所以大多数人在“颠儿颠儿”的阶段时,已经被业内大致认可,所以会特别盲目的自信,而有不少人,却是玩了好久,也没想到过还有哪儿值得迷茫。眼高手低,永远是一个让人崩溃的事实。

有的时候,id数据值会被设置为intval($id),这种情况下,如果变量只能是数字,就不会产生注入了,因为不管输入什么都会以数字——及值的形式带入数据库查询。然而,如果是字符型id值,而且还用到了addslashes(),是不是就安全了呢?,还真没有,因为如果sql语句形式是select * from table where id="'$_POST[id]'",这种情况,id值被单引号包含,我们要想构造能以代码执行的恶意值需要闭合前面的单引号,而addslashes会将我们输入的单引号转移为正常的值形式带入查询。这种情况就呵呵了。好在有的sql语句中参数值没有用单引号包含,例如:select * from table where id="$_POST[id]",虽然开启了addslashes转义单引号等特殊字符,但是我们根本就不需要单引号闭合sql查询语句中的id字段,所以照样可以注入。

 

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

616

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

194

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

91

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

54

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

598

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

56

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.1万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号