2012-04-26 4 views
0

Я получаю некоторые данные в формате JSON через jQuery, а затем мне нужно отображать его для пользователей, однако он уязвим для атаки XSS. Каковы мои варианты здесь, следует ли мне линять символы перед тем, как поместить данные в базу данных? Рамки, которые я использую (Kohana), имеют отличную функцию HTML::Chars();, но поскольку я показываю данные с помощью javascript, я не могу ее использовать.XSS при отображении json для пользователей

Один из вариантов заключается в том, чтобы пройти через каждый элемент, который кодируется json и применяет HTML::Chars(); к нему. Это единственный вариант, и если да, то каким будет оптимальный способ сделать это?

Пример:

  1. Пользователь вводит некоторые данные: title, body
  2. данные хранятся в базе данных
  3. Затем какой-либо другой пользователь вводит сайт, массив данных берется из базы данных и экспортируются в формате JSON
  4. Сценарий jQuery берет json и добавляющий новый элемент к телу моей страницы.

Код:

$(document).ready(function(){ 
    $.ajax({ 
     url: '/timeline/latest/1', 
     dataType: 'json', 
     success: function(data){ 
      $.each(data, function(key, val) { 
       switch (val.type){ 
        case 'post': // I have only made post so far 
         addPost(val); 
         break; 
       } 
      }); 
     } 
    }); 
}) 
function addPost(val){ 
    $('.content .timeline').prepend(val.title + '<br />' + val.body); // xss vulnerable 
} 

Получение данных из базы данных

<?php 

class Controller_Timeline extends Controller{ 
    public function Action_Latest(){ 
     $parentID = $this->request->param('id'); 
     $modelTimeline = new Model_Timeline(); 

     // Here I get latest entries, big array 
     $latest = $modelTimeline->Latest($parentID); 

     // Response it and encode with JSON 
     $this->response->body(json_encode($latest)); 
    } 
} 

Мое решение до сих пор это, прежде чем я эхо из за $ последней я пройти через массив и применять анти-XSS Однако я не знаю, насколько это оптимально:

array_walk($latest, function(&$latest){ 
    foreach ($latest as &$key){ 
     $key = HTML::chars($key); 
    } 
}); 
+0

Как это уязвимо для атаки XSS? –

+0

Если я набираю javascript, он выполняет его. Пример: я набираю это в поле body '

0

Вы должны вызвать mysql_real_escape_string перед сохранением в базе данных, htmlspecialchars не является обязательным. Ваша проблема заключается в том, что вы не хотите просто отображать html для пользователя, поэтому htmlspecialchars не будет работать, поскольку он кодирует такие вещи, как <a>, до &lt;a&gt;, поэтому не подходит, если вы планируете использовать html на странице пользователей (вам придется снова включить его в полезный html, чтобы он был избыточным).

В этом случае нет простого ответа - это зависит от того, с каким html вы имеете дело? Если это чисто презентация, например, <em><p><strong>, вы должны строго разбираться со стороной html-сервера и проверять ее только на наличие таких вещей, а также отклонять или удалять любые опасные вещи, такие как <script>.Это сложнее, потому что вам также придется утомлять javascript в атрибутах элементов, таких как onClick = "do something bad".

В общем, дезинфицировать ваш HTML перед отправкой JSON с PHP, это имеет лучшую репутацию: http://htmlpurifier.org/

+0

Нет необходимости в mysql_real_escape_string(); 'поскольку он будет защищать от SQLInjection, поскольку я использую NoSQL, на моем сайте невозможно выполнить SQL-инъекцию. – sed

Смежные вопросы