2016-10-06 2 views
-1

Чтобы предотвратить атаку 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?

+1

Вы по какой-то причине отправляете данные JSON, обернутые в HTML-теги? Если нет, то не отключайте его при отправке. Кроме того, нет необходимости «чистить» данные по пути. –

+0

Да, я сделал расширение в yii, которое возвращает html. – DS9

+0

Вы не должны автоматически запускать «htmlspecialchars» для всех входящих запросов. Это будет только «очищать» данные в конкретном случае (при печати HTML), но это будет испорчено для других случаев. Вы должны избегать данных в тот момент, когда это релевантно (перед печатью как HTML, перед SQL-запросом и т. Д.). –

ответ

0

Нет, нет способа. Если вы примените htmlspecialchars() ко всем запросам, вам нужно будет использовать html_entity_decode(), чтобы вернуть его в необработанном виде.

Эта методика плохая тем же способом magic quotes были плохими. Я рекомендую не использовать его. Вместо этого используйте механизм шаблонов и, если необходимо, избегайте отдельных переменных.

+0

На самом деле проект огромен, мы не можем войти и добавить это для каждой переменной. поэтому мы добавили, что для всех данных запроса. – DS9

+0

Используйте шаблонный двигатель, и эта проблема исчезает. Нет необходимости в ручном экранировании или хранении HTML в базе данных, потому что вы выполняете его без экранирования. Если вы не можете по какой-то причине их бояться, вы застряли с вашим неуклюжим кодом. – ShiraNai7

+0

Что делать, если я переопределяю встроенную функцию json_decode? – DS9