htmlspecialchars打破了json_decode

时间:2016-10-06 09:39:52

标签: php json htmlspecialchars

为防止XSS攻击,我使用了以下代码。

/* To prevent XSS Attack */
    public function __construct($id,$module=null) {
        $_GET = $this->clean($_GET);
        $_POST = $this->clean($_POST);
        $_REQUEST = $this->clean($_REQUEST);

        //Call parent constuct
        parent::__construct($id,$module=null);
    }

    /* To prevent XSS Attack */
    protected function clean($data) {
        if (is_array($data)) {
             foreach ($data as $key => $value) {
                unset($data[$key]);
                $data[$this->clean($key)] = $this->clean($value);
            }
        } else {
            $data = htmlspecialchars($data, ENT_COMPAT, 'UTF-8');
        }
        return $data;
   }

它将清除每个获取,发布请求。它工作正常。

但是现在它产生了问题,在代码中有很多我使用json_decode的地方 例如:在一个地方我有一个json_encoded的post变量,为了解码它我必须使用下面的代码:

 $objclass->fields = json_decode(html_entity_decode($_POST['fields'], ENT_QUOTES, 'UTF-8'),true);

如果我只是使用json_decode($_POST['fields'],true);,那么它将会失败,因为$_POST['fields']数据是使用htmlspecialchars加密的。

那么有没有办法让json_decode直接工作而不必实施html_entity_decode

1 个答案:

答案 0 :(得分:0)

不,没有办法。如果您将htmlspecialchars()应用于所有请求数据,则必须使用html_entity_decode()将其恢复为原始格式。

这种技术很糟糕magic quotes很糟糕。我建议不要使用它。相反,使用模板引擎并在需要时转义各个变量。