Будет ли это хорошей идеей против XSS? - PullRequest
4 голосов
/ 28 апреля 2011

, поскольку использование заголовка http Origin / X-Frame-Options не очень популярно, и я не думаю, что новый CSP в Firefox будет лучше (накладные расходы, усложнение и т. Д.) новая версия JavaScript / ECMA.

Но сначала я опубликую идею, чтобы вы могли сказать, если это плохо. Я называю это просто jsPolicy :

Каждый, кто использует JavaScript, поместил скрипты в свою HTML-голову. Так почему бы нам не использовать их для добавления наших политик для управления всеми следующими сценариями. Пример:

<html>
<head>
<title>Example</title>
<script>
window.policy.inner = ["\nfunction foo(bar) {\n  return bar;\n}\n", "foo(this);"];
</script>
</head>
<body>
<script>
function foo(bar) {
  return bar;
}
</script>
<a href="#" onclick="foo(this);">Click Me</a>
<script>
alert('XSS');
</script>
</body>
</html>

Теперь браузер сравнивает .innerHTML и onclick.value с значениями в политике, поэтому последний блок элемента скрипта не выполняется (игнорируется).

Конечно, бесполезно удваивать весь встроенный код, поэтому вместо этого мы используем контрольные суммы. Пример:

crc32("\nfunction foo(bar) {\n  return bar;\n}\n");

результаты "1077388790"

А теперь полный пример:

if (typeof window.policy != 'undefined') {
  window.policy.inner = ["1077388790", "2501246156"];
  window.policy.url = ["http://code.jquery.com/jquery*.js","http://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit"];
  window.policy.relative = ["js/*.js"];
  window.policy.report = ["api/xssreport.php"];
}

Браузер должен сравнивать, только если контрольная сумма встроенного скрипта установлена ​​в policy.inner или URL-адрес script.src соответствует policy.url.

Примечание. Основная идея policy.relative - разрешать только локальные сценарии:

window.policy.url = false;
window.policy.relative = ["js/*.js"];

Примечание: policy.report должен быть почти таким же, как и в случае с CSP (отправляет заблокированные скрипты и URL-адреса в API):
https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-unofficial-draft-20110315.html#violation-report-syntax

Важно:

  • Политика не может быть установлена ​​дважды (иначе она выдает предупреждение) = константа
  • Думать о: Политика может быть установлена ​​только в голове (иначе она выдает предупреждение)
  • Политика используется только для проверки сценариев, являющихся частью HTML-источника, а не тех, которые размещаются на лету. пример:
    document.write (' ');
    Вам не нужно определение policy.url для "http://code.jquery.com. ..", так как контрольная сумма policy.inner проверила полный источник скрипта. Это означает, что источник загружается, даже если для policy.url задано значение false (да, он по-прежнему безопасен!). Это гарантирует простое использование политики.
  • если одна из политик отсутствует, ограничений нет. Это означает, что пустой policy.relative приводит к тому, что все локальные файлы разрешены. Это гарантирует обратную совместимость
  • если для одной из политик установлено значение "false", использование запрещено (по умолчанию установлено значение true). пример:
    policy.inner = false;
    Это запрещает любые встроенные сценарии
  • Политика игнорирует только запрещенные сценарии и выдает предупреждение на консоль (ошибка остановит выполнение разрешенных сценариев, а это не нужно)

Я думаю, что это сделает XSS невозможным, и вместо CSP он также позволит избежать постоянного XSS (поскольку никто не перезаписывает Политику), и его будет намного проще обновлять.

Что вы думаете?

РЕДАКТИРОВАТЬ:
Вот пример, сделанный в Javascript:
http://www.programmierer -forum.de / PHP / JS-политики против-xss.php

Конечно, мы не можем контролировать выполнение скрипта, но он показывает, как он мог бы работать, если бы jsPolicy-совместимый браузер работал.

РЕДАКТИРОВАТЬ2:
Не думайте, что я говорю о кодировании небольшой функции javascript для обнаружения xss !! Моя идея jsPolicy должна быть частью нового движка JavaScript. Вы можете сравнить его с настройкой php, помещенной в файл .htaccess. Вы не можете изменить этот параметр во время выполнения. Те же требования применяются к jsPolicy. Вы можете назвать это global setting.

jsPolicy короткими словами:
Анализатор HTML -> отправлять скрипты в JavaScript Engine -> сравнивать с jsPolicy -> разрешено?
А) да, выполнение через JavaScript Engine
Б) нет, игнорируется и отправляется отчет вебмастеру

EDIT3 :
Ссылка на комментарий Майка это также будет возможная настройка:

window.policy.eval = false;

Ответы [ 4 ]

4 голосов
/ 30 апреля 2011

Межсайтовый скриптинг происходит на стороне клиента.Ваши политики определены на стороне клиента.Видите проблему?

Мне нравится Политика безопасности контента, и я использую ее во всех своих проектах.На самом деле, я работаю над платформой JavaScript, которая имеет одно из требований «быть CSP-friendly».

CSP> crossdomain.xml> ваша политика.

1 голос
/ 01 мая 2011

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

Как уже упоминалось в некоторых других ответах, проблема в том, что ваше решение не решает проблему - доверять или не доверять тому, что поступает в браузер, поскольку на стороне клиента вы не можете знатьчто такое код и что такое данныеДаже ваше решение не мешает этому.

См., Например, этот вопрос на ITsec.SE , чтобы узнать некоторые практические вопросы, связанные с его реализацией.(Ваш вопрос является своего рода дубликатом этого, более или менее ...)

Кстати, о CSP - проверьте этот другой вопрос на ITsec.SE .

1 голос
/ 30 апреля 2011

Подавляющее большинство XSS-атак происходит из «доверенных» источников, по крайней мере, в том, что касается браузера.Они обычно являются результатом повторного ввода данных пользователем, например, на форуме, и неправильного экранирования ввода.Вы никогда не получите XSS от ссылки на jquery, и это крайне редко, что вы получите из любого другого связанного источника.

В случае, когдавы пытаетесь выполнить междоменный сценарий, но вы не можете получить контрольную сумму для удаленного сценария.

Так что, хотя ваша идея кажется хорошей, я не вижу в этом смысла.

0 голосов
/ 01 мая 2011

Политика используется только для проверки сценариев, являющихся частью HTML-источника, а не тех, которые размещаются на лету.пример: document.write ('');Вам не нужно определение policy.url для "http://code.jquery.com. ..", так как контрольная сумма policy.inner проверила полный источник скрипта.Это означает, что источник загружается, даже если для policy.url задано значение false (да, он по-прежнему безопасен!).Это гарантирует простое использование политики.

Похоже, что вы раздали всю игру здесь.* а кто-то обманывает пользователей, чтобы они заходили на мой сайт с помощью строки запроса ?eval=alert%28%22pwned%22%29, тогда они были XSSed, и ваша политика ничего не сделала, чтобы остановить это.

...