PHP 常用函数对比


PHP 常用函数对比


对比一

urlencode()htmlspecialchars()htmlentities() 的异同比较。

相应解码的函数是 urldecode()htmlspecialchars()htmlentities()

urlencode

urlencode() 是一个函数,可将字符串以URL编码,用于编码处理。 URL编码(URL encoding),也称作百分号编码(Percent-encoding),是特定上下文的统一资源定位符(URL)的编码机制。 适用于统一资源标识符(URI)的编码,也用于为application/x-www-form-urlencoded MIME准备数据, 因为它用于通过HTTP的请求操作(request)提交HTML表单数据。

htmlspecialchars

htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。预定义的字符是:

&(和号) 成为&
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 &lt;
> (大于) 成为 &gt;

HTMLSpecialChars的原因:如果不用HTMLSpecialChars,就会导致读取时,要把<script>之类的HTML标签“原本”的输出,而这一输出就有漏洞了, 万一那个插入数据库的人是黑客,插入的不是一般的字符串,而是 <script> <b> <body>等等之类的东西,读取后, 就是一个HTML文档之类的东西,这样,他可以利用这个漏洞欺骗其他人,或者借这个漏洞攻击别人等等,搞个框架跳转到某一网站等等操作。

htmlentities

htmlentities() 函数主要是会对一些特殊符号进行HTML实体编码。

htmlentities() 并不能转换所有的特殊字符,是转换除了空格之外的特殊字符,且单引号和双引号需要单独控制(通过第二个参数)。 第2个参数取值有3种,分别如下:

 ENT_COMPAT(默认值):只转换双引号。
 ENT_QUOTES:两种引号都转换。
 ENT_NOQUOTES:两种引号都不转换。

HTML 中有用的字符实体:

显示结果     描述     实体名称     实体编号
    空格     &nbsp;     &#160;
<     小于号     &lt;     &#60;
>     大于号     &gt;     &#62;
&     和号     &amp;     &#38;
"     引号     &quot;     &#34;
'     撇号      &apos; (IE不支持)     &#39;
¢     分(cent)     &cent;     &#162;
£     镑(pound)     &pound;     &#163;
¥     元(yen)     &yen;     &#165;
€     欧元(euro)     &euro;     &#8364;
§     小节     &sect;     &#167;
©     版权(copyright)     &copy;     &#169;
®     注册商标     &reg;     &#174;
™     商标     &trade;     &#8482;
×     乘号     &times;     &#215;
÷     除号     &divide;     &#247;

完整的实体符号参考https://www.w3school.com.cn/charsets/ref_html_8859.asp

案例阅读,误用htmlentities函数引发的漏洞 https://zhuanlan.zhihu.com/p/47353814

对比二

$_POSTfile_get_contents("php://input")$HTTP_RAW_POST_DATA 的异同比较。

file_get_contents(“php://input”)

php://input是一个只读信息流,可以用来获取提交的信息流,如上传的图片流等。

当请求方式是post的,并且enctype不等于”multipart/form-data”时,可以使用php://input来获取原始请求的数据。

$HTTP_RAW_POST_DATA

$HTTP_RAW_POST_DATAfile_get_contents("php://input") 的内容是一样的, 不过如果要开启这个变量,需要修改配置文件,找到 always_populate_raw_post_data这个选项,设置为On, 然后重新启动web服务器,就可以了。而使用php://input不需要修改PHP配置文件,另外php://input给内存带来的压力也较小。

$_POST

$_POST 可以用来获取表单提交的数据,当提交类型为application/x-www-form-urlencoded时,$_POST 中的数据是urldecode后的结果。

提交类型有:

Content-Type值                          描述
application/x-www-form-urlencoded     在发送前urlencode编码所有字符(默认)
multipart/form-data                 不对字符编码。在使用包含文件上传控件的表单时,使用该值。
text/plain                             空格转换为 "+" 加号,但不对特殊字符编码。
text/xml                            一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。






参考资料


返回