Я получаю некоторые данные в формате JSON через jQuery, а затем мне нужно отображать его для пользователей, однако он уязвим для атаки XSS. Каковы мои варианты здесь, следует ли мне линять символы перед тем, как поместить данные в базу данных? Рамки, которые я использую (Kohana), имеют отличную функцию HTML::Chars();
, но поскольку я показываю данные с помощью javascript, я не могу ее использовать.XSS при отображении json для пользователей
Один из вариантов заключается в том, чтобы пройти через каждый элемент, который кодируется json и применяет HTML::Chars();
к нему. Это единственный вариант, и если да, то каким будет оптимальный способ сделать это?
Пример:
- Пользователь вводит некоторые данные:
title, body
- данные хранятся в базе данных
- Затем какой-либо другой пользователь вводит сайт, массив данных берется из базы данных и экспортируются в формате JSON
- Сценарий 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);
}
});
Как это уязвимо для атаки XSS? –
Если я набираю javascript, он выполняет его. Пример: я набираю это в поле body '
Вы должны вызвать mysql_real_escape_string перед сохранением в базе данных, htmlspecialchars не является обязательным. Ваша проблема заключается в том, что вы не хотите просто отображать html для пользователя, поэтому htmlspecialchars не будет работать, поскольку он кодирует такие вещи, как
<a>
, до<a>
, поэтому не подходит, если вы планируете использовать html на странице пользователей (вам придется снова включить его в полезный html, чтобы он был избыточным).В этом случае нет простого ответа - это зависит от того, с каким html вы имеете дело? Если это чисто презентация, например,
<em>
<p>
<strong>
, вы должны строго разбираться со стороной html-сервера и проверять ее только на наличие таких вещей, а также отклонять или удалять любые опасные вещи, такие как<script>
.Это сложнее, потому что вам также придется утомлять javascript в атрибутах элементов, таких как onClick = "do something bad".В общем, дезинфицировать ваш HTML перед отправкой JSON с PHP, это имеет лучшую репутацию: http://htmlpurifier.org/
источник
2012-04-26 11:10:39
Нет необходимости в mysql_real_escape_string(); 'поскольку он будет защищать от SQLInjection, поскольку я использую NoSQL, на моем сайте невозможно выполнить SQL-инъекцию. – sed