-
博文分类专栏
- Jquery基础教程
-
- 文章:(15)篇
- 阅读:46549
- shell命令
-
- 文章:(42)篇
- 阅读:154226
- Git教程
-
- 文章:(36)篇
- 阅读:234842
- leetCode刷题
-
- 文章:(76)篇
- 阅读:131787
-
htmlspecialchars遇上json_decode引发的坑2018-02-08 12:36 阅读(6130) 评论(0)
一、问题描述
在php的项目里面,上次为了防止sql注入使用了htmlspecialchars函数,没想到对该函数了解不够深入,导致后来传递哦json格式的数据时候,使用json_decode就会报错。案例如下:
$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 处理代码。 于是,我们可以限制不对单/双引号转换,程序改为如下:
$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"; }