PHP字符串--编码与转义

PHP字符串——编码与转义

因为PHP程序经常与HTML页、Web地址(URL)以及数据库交互,所以PHP提供一些函数来帮助你处理这些类型的数据。HTML、Web页地址和数据库命令都是字符串,但是它们每个都要求不同的字符以不同的方法来转义。例如,在Web地址中一个空格被写成%20,而直接量小于符号(<)在HTML文档中必须写作&lt。PHP有许多内置函数来转换和取得这些编码。
HTML:在HTML中特殊的字符以实体(entity)表示,如&amp;和&lt;。这里有两个PHP函数来把字符串中的特殊字符转换为实体,一个用于删除HTML标签,一个仅用于提取meta标签。
对所有特殊字符进行实体引用:函数htmlentities()将HTML字符转换为对应的实体(除了空格符)。包括小于符号(<)、大于符号(>)、与号(&)和重音字符。(entity实体)
只对HTML语法字符进行实体引用:函数htmlspacialchars()转换最小的实体集来生成合法的HTML。下面的实体被转换:
与符号(&)被转换成&amp;
双引号(")被转换成&quot;
单引号(')被转换成&#039;(就像调用htmlentities()时使用ENT_QUOTES的效果)
小于号(<)被转换成&lt;
大于号(>)被转换成&gt;
如果有一个应用程序来显示用户填入表单的数据,则要在显示和保存数据之前通过htmlspecialchars()处理数据。如果没有处理的话,一旦用户提交了像"angle<30"或"sturm & drang"这样的字符串,浏览器会人为这些特殊的字符是HTML,从而得到一个混乱的页面。

删除HTML标签
函数strip_tags()从字符串中删除HTML标签:
$input='<p>Howdy,&quot;Cowboy&quot;</p>;
$output=strip_tags($input);//$output是'Howdy,&quot;Cowboy&quot;'
函数可以有第二个参数来指定在字符串中留下的标签。之列出标签的开始形式,在第二个参数中列出的标签结束形式也将被保留:
$input='The <b>bold</b> tags will<i>stay</i><p>';
$output=strip_tags($input,'<b>');//$output是'The <b>bold</b> 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=<<<The_end
"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的数据库值,就存在查询结果),但是最重要的是,单引号在这里是以值的形式传递的,这才是最最根本的本质。

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字段,所以照样可以注入。


---                                                                                                                                       -----转自博客园

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
选择正确建站软件——从此就像技术型的网站,不再担心自己网站缺乏内容一样。很多站长建站都向sina学习,希望通过大量的内容来吸引流量。其实这样通过内容建设来建站,就是太辛苦。到哪里去弄那么多原创内容去?看到网络上四处可见的征求原创内容的帖子。我们不禁要感叹,建内容站真是不容易。还有一种建站方法是建立技术型的网站。例如搜索引擎自己没什么内容,但是它通过搜索技术获得了巨大的内容。现在“美加新闻聚合系统”,站长已经可以免费获得并使用。利用这种软件建立技术型网站就非常容易了。就像搜索引擎从不担心自己缺乏内容一样,该系统会自动聚合大量的新闻内容。并且通过若干种变换方式,生成原创内容。由于 Elite RssPortal v3.x 已经可以完美的解决搜索引擎收录问题。现在Elite RssPortal v4.x 更添加了长尾关键词智能SEO功能,帮助站长轻松解决网站流量问题。6大全自动技术——支持模板定制。你所要做的就是找到信息源,添加到后台即可。自动识别语种:支持英语、日语、俄语、法语等多种语言的自动识别。 自动识别编码:支持ANSI、EUC_JP、UTF-8、Big5等多种字符集编码的自动识别。 自动抽取新闻:无需分析来源的网页编写特点,支持自动分析来源网页,自动抽取新闻正文。 自动翻译:全自动将外文翻译成中文,从而实现与原文不同,具有原创性。 自动后台更新:全自动后台刷新信息源,不影响访问速度,提供用户感受。 自动SEO优化:全自动寻找SEO关键词的长尾相关词,通过自动替换、自动强化来提升搜索排名。任意模板定制:支持模板的任意定制,可以修改布局、风格、图片等各种信息。 特点介绍——免费软件,自动生成原创内容,针对SEO特别优化支持自动获取原创新闻内容(通过机器翻译或者自动伪原创来实现和原文不同),支持网站动态更新。支持自定义的RSS信息来源,全自动网页模式识别,可以添加任意多的RSS信息源。 支持网址静态化。 本系统完全免费,没有任何功能限制,是站长们的解决原创内容匮乏的理想选择。功能介绍——可以自行扩展,支持自由定制使用简单:自带PHP安装向导,使用极其简单。软件体积极小,很少占用服务器空间。模板定制:开放模板,轻松修改,可以随时修改网页布局。可以轻松添加各种广告,具体演示参见演示网站。原创内容:丰富的原创新闻内容,独家技术翻译成中文,或者进行词语替换(自动伪原创),其它地方无此内容,特别适合网站内容匮乏的网站。动态更新:内容不断的动态更新,时刻保持网站获活力。长期有效:所有页面存入数据库,故此内容长期存在,故此不用担心网页被搜索引擎收录后会出现无法访问的现象。静态网址:支持网址静态化,促进搜索引擎收录网页。自由扩展:通过管理后台,可以对该系统实现进行频道管理、RSS管理、模板定制等。软件免费:本软件完全免费使用,无任何功能、时间限制。如果你需要定制服务,则请联系北京精英达康科技有限公司。系统需求——升级简单,只需覆盖全部PHP文件即可。新增修改、删除文章功能,新增长尾词智能SEO功能。(v4.0)由于Google翻译引擎改版,紧急升级版本以支持最新的Google翻译引擎。(v3.7)兼容BBC的语言编码不规范问题。(v3.6)更换微软翻译引擎为2.0版本、修订了微软翻译引擎1.0版本不能自动识别中文的bug和2.0版输出格式兼容性问题。(v3.2, v3.3)支持免费PHP空间的有限存储空间、和修订了一个同义词替换变换的bug。(v3.1)内置大量RSS资源、和适应多种不同服务器配置。(v3.0)支持Mysql服务器和Web服务器不是同一台服务器的配置情况。(v2.6)。 新增双翻译引擎,支持重新变换,支持在线帮助信息、修订缺省模板以显示广告图片。(v2.5)。新增在线帮助、支持显示刷新时间、支持中文标题的完整截取(v2.2)。修订了IE6乱码问题和修改了缺省CSS模板设置(v2.1)。系统需求——PHP即可必须是支持PHP4以上的WEB服务器。需要MySQL 5.0 数据库支持。PHP站长的理想选择。使用方便——解压缩即可解压缩到任意网页目录下就可以使用,敲入网址,按照向导安装即可。定制简单——支持网页定制你可以通过管理后台,可以对该系统实现进行频道管理、RSS管理、模板定制等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值