为防止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
?
答案 0 :(得分:0)
不,没有办法。如果您将htmlspecialchars()
应用于所有请求数据,则必须使用html_entity_decode()
将其恢复为原始格式。
这种技术很糟糕magic quotes很糟糕。我建议不要使用它。相反,使用模板引擎并在需要时转义各个变量。