Чтобы предотвратить атаку XSS, я использовал ниже код.htmlspecialchars breaks json_decode
/* 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 переменного поста, чтобы расшифровать его я должен использовать ниже код:
$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
?
Вы по какой-то причине отправляете данные JSON, обернутые в HTML-теги? Если нет, то не отключайте его при отправке. Кроме того, нет необходимости «чистить» данные по пути. –
Да, я сделал расширение в yii, которое возвращает html. – DS9
Вы не должны автоматически запускать «htmlspecialchars» для всех входящих запросов. Это будет только «очищать» данные в конкретном случае (при печати HTML), но это будет испорчено для других случаев. Вы должны избегать данных в тот момент, когда это релевантно (перед печатью как HTML, перед SQL-запросом и т. Д.). –