对比一
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 实体。预定义的字符是:
&(和号) 成为&
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 <
> (大于) 成为 >
HTMLSpecialChars的原因:如果不用HTMLSpecialChars,就会导致读取时,要把<script>
之类的HTML标签“原本”的输出,而这一输出就有漏洞了,
万一那个插入数据库的人是黑客,插入的不是一般的字符串,而是 <script> <b> <body>
等等之类的东西,读取后,
就是一个HTML文档之类的东西,这样,他可以利用这个漏洞欺骗其他人,或者借这个漏洞攻击别人等等,搞个框架跳转到某一网站等等操作。
htmlentities
htmlentities()
函数主要是会对一些特殊符号进行HTML实体编码。
htmlentities()
并不能转换所有的特殊字符,是转换除了空格之外的特殊字符,且单引号和双引号需要单独控制(通过第二个参数)。
第2个参数取值有3种,分别如下:
ENT_COMPAT(默认值):只转换双引号。
ENT_QUOTES:两种引号都转换。
ENT_NOQUOTES:两种引号都不转换。
HTML 中有用的字符实体:
显示结果 描述 实体名称 实体编号
空格  
< 小于号 < <
> 大于号 > >
& 和号 & &
" 引号 " "
' 撇号 ' (IE不支持) '
¢ 分(cent) ¢ ¢
£ 镑(pound) £ £
¥ 元(yen) ¥ ¥
€ 欧元(euro) € €
§ 小节 § §
© 版权(copyright) © ©
® 注册商标 ® ®
™ 商标 ™ ™
× 乘号 × ×
÷ 除号 ÷ ÷
完整的实体符号参考https://www.w3school.com.cn/charsets/ref_html_8859.asp
案例阅读,误用htmlentities函数引发的漏洞 https://zhuanlan.zhihu.com/p/47353814
对比二
$_POST
、file_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_DATA
与 file_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 作为编码方式的远程调用规范。