Отказался выполнить сценарий JavaScript. Исходный код скрипта найден в запросе

82

В WebKit я получаю следующую ошибку в моем JavaScript:

Отказался выполнить сценарий JavaScript. Исходный код скрипта, найденный в запросе.

Код предназначен для счетчика JavaScript, см. ASCII Art .

Код раньше работал нормально и все еще правильно работает в Camino и Firefox. Ошибка возникает только тогда, когда страница сохраняется с помощью POST, а затем извлекается с помощью GET. Это происходит как в Chrome / Mac, так и в Safari / Mac.

Кто-нибудь знает, что это значит и как это исправить?

докман
источник
Хм, наверное мой WebKit обновился. Страница снова работает. Также все старые версии страницы (см. Кнопку «Старые версии» внизу страницы).
doekman
эта ошибка возникает в редакторе tryit w3schools.com/js/tryit.asp?filename=tryjs_events скрипт выполняется в первый раз, но он блокируется с того момента, как вы нажимаете кнопку «редактировать и нажимать меня».
1
Если вы нажмете кнопку «редактировать и щелкнуть меня», содержимое текстовой области (с javascript) будет отправлено на сервер через POST. Chrome обнаруживает, что javascript отправляется на сервер и может быть вредоносным. Блокировка - это мера против XSS-атак.
doekman
Вот ссылка, которая показывает, как установить заголовок X-XSS-Protection: stackoverflow.com/questions/4635403/…
hh_s 02

Ответы:

68

Это мера безопасности для предотвращения атак XSS (межсайтовый скриптинг) .

Это происходит, когда некоторый код JavaScript отправляется на сервер через запрос HTTP POST, а тот же код возвращается через ответ HTTP. Если Chrome обнаруживает эту ситуацию, скрипту отказывают в запуске, и вы получаете сообщение об ошибке Refused to execute a JavaScript script. Source code of script found within request.

Также см. Этот пост о безопасности: новые функции безопасности .

Грег
источник
5
Было бы неплохо увидеть какую-нибудь справку.
kangax
но вызывает ли это гона какие-нибудь проблемы? это нормально, если мы проигнорируем это сообщение?
Samach
@Greg Какой алгоритм используют браузеры для «определения ситуации»? Это не может быть просто поиск строки «<script>» в данных, верно?
Pacerier
1
Я хотел бы увидеть некоторое обсуждение между этим ответом и ответом Кендалла ниже относительно последствий использования исправления X-XSS-Protection: 0. Открывает ли он сайт для XSS-атак? Если да, то есть ли другой способ устранить эту ошибку?
dansalmo 06
Ссылка, которая дополнительно объясняет это, blog.chromium.org/2010/01/… См. Раздел «Отражающая защита XSS»
ч-п
132

Эту «функцию» можно отключить, отправив нестандартный HTTP-заголовок X-XSS-Protectionна затронутую страницу.

X-XSS-Protection: 0
Кендалл Хопкинс
источник
2
Убедитесь, что страница, вызывающая эту ошибку, отправляется с этим заголовком, а не отправляет страницу.
Кендалл Хопкинс,
@KendallHopkins .... Подскажите, пожалуйста, как я могу использовать это через Javascript / Java?
SRy
+1 Это полностью отвечает на вопрос, в отличие от принятого ответа, однако предупреждает, но не дает никакого решения.
JohnnyQ
2
-1 Это может «исправить» проблему в Chrome, но не решает реальной проблемы - ваш сайт по-прежнему уязвим для атак межсайтового скриптинга (фактически, более уязвим), если вы это сделаете. Реальное решение, на которое @Greg ссылался, но не сказал явно, состоит в том, чтобы не отправлять HTML / JS обратно в ответ, который был отправлен в запросе. Прочитав предоставленные им ссылки, вы должны были это прояснить.
sfarbota
@sfarbota Очень много случаев, когда эта защита плохая. Например, он ломает многие системы CMS, где вполне допустимо возвращать обратно JS, который вы редактируете. Но, к вашему мнению, я бы не советовал добавлять это на каждую страницу сайта, и это, вероятно, необходимо только в тех случаях, когда разработчик обнаруживает эту ошибку.
Кендалл Хопкинс,
15

Краткий ответ : обновите страницу после первоначальной отправки javascript или нажмите URL-адрес, который отобразит страницу, которую вы редактируете.

Длинный ответ : поскольку текст, который вы заполнили в форме, включает javascript, и браузер не обязательно знает, что вы являетесь источником javascript, для браузера безопаснее предположить, что вы не являетесь источником этого JS, и не запускай это.

Пример : предположим, я дал вам ссылку на ваш адрес электронной почты или facebook с каким-то javascript в ней. И представьте, что javascript отправит всем вашим друзьям мою классную ссылку. Таким образом, игра по вызову этой ссылки становится простой: найдите место для отправки javascript, чтобы он был включен на страницу.

Chrome и другие браузеры WebKit пытаются снизить этот риск, не выполняя какой-либо javascript, который присутствует в ответе, если он присутствует в запросе. Моя гнусная атака будет предотвращена, потому что ваш браузер никогда не запустит этот JS.

В вашем случае вы отправляете его в поле формы. Публикация поля формы вызовет рендеринг страницы, на которой будет отображаться Javascript, что заставит браузер беспокоиться. Однако, если ваш javascript действительно сохранен, нажатие на ту же страницу без отправки формы позволит ему выполнить.

Коос Клевен
источник
1

Как говорили другие, это происходит, когда ответ HTTP содержит строку JavaScript и / или HTML, которая также была в запросе. Обычно это вызвано вводом JS или HTML в поле формы, но также может быть вызвано другими способами, такими как ручная настройка параметров URL.

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

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

Как упомянул Кендалл Хопкинс, может быть несколько случаев, когда вы действительно хотите, чтобы выполнялся JavaScript из входных данных формы, например, создание приложения, такого как JSFiddle . В таких случаях я бы порекомендовал вам, по крайней мере, просмотреть ввод в вашем бэкэнд-коде, прежде чем вслепую записывать его обратно. После этого вы можете использовать упомянутый метод для предотвращения блокировки XSS (по крайней мере, в Chrome), но имейте в виду, что он открывает вас для злоумышленников.

сфарбота
источник
0

Я использовал этот хитрый PHP-трюк сразу после фиксации в базе данных, но до того, как скрипт будет отображен из моего _GETзапроса:

if(!empty($_POST['contains_script'])) { 
    echo "<script>document.location='template.php';</script>";
}

Для меня это было самое дешевое решение.

габриэлькроу
источник