php - htmlspecialchars遇上json_decode引发的坑
htmlspecialchars遇上json_decode引发的坑
标签: php函数
2018-02-08 12:36 阅读(531) 评论(0)
一、问题描述
在php的项目里面,上次为了防止sql注入使用了htmlspecialchars函数,没想到对该函数了解不够深入,导致后来传递哦json格式的数据时候,使用json_decode就会报错。案例如下:
1 2 3 4 5 6 7 8 9 |
$str = '["okey","agwneo"]'; $str = htmlspecialchars($str);
$strJson = json_decode($str, true); if (json_last_error() !== JSON_ERROR_NONE) { echo $str."解析为json报错,err:".json_last_error(); } else { echo "ok"; } |
报错信息如:
原来,我传递的["okey","agwneo"]被htmlspecialchars转义为["okey","agwneo"]了
所以对字符串["okey","agwneo"]了进行json_decode也就报错了
二、解决方案
1.方案一
参考官方手册,htmlspecialchars函数提供的参数,我们可以看到该函数可以限制对哪些字符不进行转换,如下:
常量名称 |
描述 |
ENT_COMPAT |
会转换双引号,不转换单引号。 |
ENT_QUOTES |
既转换双引号也转换单引号。 |
ENT_NOQUOTES |
单/双引号都不转换 |
ENT_IGNORE |
静默丢弃无效的代码单元序列,而不是返回空字符串。 不建议使用此标记, 因为它» 可能有安全影响。 |
ENT_SUBSTITUTE |
替换无效的代码单元序列为 Unicode 代替符(Replacement Character), U+FFFD (UTF-8) 或者 � (其他),而不是返回空字符串。 |
ENT_DISALLOWED |
为文档的无效代码点替换为 Unicode 代替符(Replacement Character): U+FFFD (UTF-8),或 �(其他),而不是把它们留在原处。 比如以下情况下就很有用:要保证 XML 文档嵌入额外内容时格式合法。 |
ENT_HTML401 |
以 HTML 4.01 处理代码。 |
ENT_XML1 |
以 XML 1 处理代码。 |
ENT_XHTML |
以 XHTML 处理代码。 |
ENT_HTML5 |
以 HTML 5 处理代码。 |
于是,我们可以限制不对单/双引号转换,程序改为如下:
1 2 3 4 5 6 7 8 |
$str = '["okey","agwneo"]'; $str = htmlspecialchars($str, ENT_NOQUOTES); $strJson = json_decode($str, true); if (json_last_error() !== JSON_ERROR_NONE) { echo $str."解析为json报错,err:".json_last_error(); } else { echo "ok"; } |
本文为原创文章,请尊重辛勤劳动,如需转载,请保留本文地址
http://www.findme.wang/blog/detail/id/365.html