Отказался выполнять скрипт JavaScript. Исходный код скрипта найден в запросе - PullRequest
81 голосов
/ 10 октября 2009

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

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

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

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

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

Ответы [ 5 ]

131 голосов
/ 02 марта 2012

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

X-XSS-Protection: 0
67 голосов
/ 10 октября 2009

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

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

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

15 голосов
/ 17 октября 2012

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

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

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

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

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

1 голос
/ 07 июля 2015

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

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

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

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

0 голосов
/ 08 февраля 2013

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

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

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

...