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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM