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

 

posted @ 2018-11-21 11:40  德丽莎·阿波卡利斯  阅读(2161)  评论(0编辑  收藏  举报