Пользовательский менеджер для фильтрации объектов на сайте, но не в администраторе?

Я последовал этому примеру , и он прекрасно работает, но мне интересно, могу ли я сделать исключение, чтобы, когда я в админке, все объекты отображаются (активные и неактивные). Это может быть просто, но я не могу найти, как это сделать в документации.

Здесь '

 

"};



Тот же текст, когда возвращается JSON через ajax api, работает так, как ожидалось. Однако при рендеринге in-line возникают базовые проблемы XSS.

Учитывая произвольную правильную строку JSON, что мне нужно сделать на стороне сервера, чтобы сделать ее безопасной для рендеринга в строке?

РЕДАКТИРОВАТЬ В идеале мне бы хотелось, чтобы исправление также работало со следующей строкой:

json = {test: "

То есть я понятия не имею, как моя базовая библиотека кодирует символ / , возможно, она решила кодировать его, а может и нет. (так что, скорее всего, исправление регулярных выражений более надежно)

13
задан Sam Saffron 23 August 2010 в 01:20
поделиться

5 ответов

Для начала, это вообще не JSON, это объект Javascript. JSON - это текстовый формат, основанный на синтаксисе Javascript.

Вы можете убедиться, что код не содержит комбинацию символов :

var obj = { test: "<"+"/script><script>alert(\"hello\");<"+"/script>" };

Или, если вы используете XHTML, вы можете убедиться, что содержимое в теге скрипта интерпретируется как простые данные:

<script type="text/javascript">
//<![CDATA[
var obj = { test: "</script><script>alert(\"hello\");</script>" };
//]]>
</script>
4
ответ дан 2 December 2019 в 00:30
поделиться

Я нашел этот список символов, которые нужно экранировать для строк JSON:

\b  Backspace (ascii code 08)
\f  Form feed (ascii code 0C)
\n  New line
\r  Carriage return
\t  Tab
\v  Vertical tab
\'  Apostrophe or single quote
\"  Double quote
\\  Backslash character

Используете PHP? Если это так: json_encode

 echo json_encode("<\/script><script>alert(\"hello\");<\/script>");

Вывод:

 "<\\\/script><script>alert(\"hello\");<\\\/script>"

Другой пример:

 echo json_encode("</script><script>alert(\"hello\");</script>");

Вывод:

 "<\/script><script>alert(\"hello\");<\/script>"
1
ответ дан 2 December 2019 в 00:30
поделиться

См. Руководство OWASP по предотвращению XSS (См. Правило № 3) -

За исключением буквенно-цифровых символов, экранировать все символы меньше 256 с форматом \ xHH, чтобы предотвратить переключение значения данных на контекст скрипта или в другой атрибут. Не используйте экранирование ярлыки вроде \ "потому что цитата символ может совпадать с HTML парсер атрибутов, который запускается первым.

Предположим, так выглядит ваш объект -


var log = {
trace: function(m1, m2, m3){},
debug: function(m1, m2, m3){},
currentLogValue : "trace {].a23-%\/^&",
someOtherObject : {someKey:"somevalue", someOtherKey:"someothervalue"}
};

Это должно закончиться так -


var log = {
trace : "function\x28m1,\x20m2,\x20m3\x29\x7B\x7D",
debug : "function\x28m1,\x20m2,\x20m3\x29\x7B\x7D",
currentLogValue : "trace\x20\x7B\x5D.a23\x2D\x25\x5C\x2F\x5E\x26",
someOtherObject : {someKey : "somevalue", someOtherKey:"someothervalue"}
};

Правила просты -

  1. Ненадежные данные разрешены только в паре кавычек
  2. Все, что находится в кавычках экранируется следующим образом: «За исключением буквенно-цифровых символов, все остальное следует экранировать в формате \ xHH»

. Это гарантирует, что ненадежные данные всегда интерпретируются как строка, а не как функция / объект / что-либо еще.

5
ответ дан 2 December 2019 в 00:30
поделиться

В литеральных строках помещайте обратную косую черту ( \ ) перед всеми «небезопасными» символами, включая косую черту, которая встречается в « »( / \ / ).

Это изменит ваш пример на:

json = {test: "<\/script><script>alert(\"hello\");<\/script>"};

, и он по-прежнему будет действительным JSON.

Конечно, вам также нужно избегать двойных кавычек ( " \" ) и самой обратной косой черты ( \ \\ ), но вам все равно придется это сделать. Вам также следует подумать о том, чтобы избежать одинарных кавычек ( ' \' ) на всякий случай.

2
ответ дан 2 December 2019 в 00:30
поделиться

Одна из проблем, с которой вы можете столкнуться, заключается в том, что интерпретаторы HTML и javascript в браузере работают с чередованием.

<html> 
<body>
<script>
 json = {test: "</script><script>alert('hello');</script>"};
</script>
</body>
</html>

В вашем примере интерпретатор HTML передаст json = {test: " интерпретатору js, а затем найдет следующий блок javascript (разделенный ) и передать alert ('hello'); интерпретатору js. Неважно, что тег находится в строке javascript, потому что интерпретатор HTML ищет блоки кода js и не понимает строки js.

Первый раздел вызовет синтаксическую ошибку js, а второй раздел создаст предупреждение. Я понимаю это не отвечает на ваш вопрос о том, что делать, но, возможно, прольет больше света на то, что происходит под капотом.

2
ответ дан 2 December 2019 в 00:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: