, поскольку использование заголовка 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;