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