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

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

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

Код для спиннеров JavaScript, см. ASCII Art.

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

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

Ответ 1

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

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

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

Ответ 2

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

X-XSS-Protection: 0

Ответ 3

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

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

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

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