2009-10-10 4 views
79

В WebKit я получаю следующее сообщение об ошибке на моем JavaScript:Отказано от выполнения сценария JavaScript. Исходный код сценария найден в запросе

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

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

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

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

+0

Хм, возможно, мой WebKit обновлен. Страница снова работает. Также все старые версии страницы (см. «Старые версии» в нижней части страницы). – doekman

+0

эта ошибка возникает в редакторе tryit w3schools http://www.w3schools.com/js/tryit.asp?filename=tryjs_events сценарий выполняется в первый раз, но он блокируется с момента нажатия кнопки «редактировать и нажмите меня ". – 2011-05-10 20:20:52

+1

Если вы нажмете кнопку «изменить и нажмете меня», содержимое текстового поля (с помощью javascript) будет отправлено на сервер через POST. Chrome обнаруживает, что javascript отправлен на сервер, и он может быть вредоносным. Блокировка - это мера против атак XSS. – doekman

ответ

65

Это мера безопасности для предотвращения нападений XSS (cross-site scripting).

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

Также см. Этот блог-сайт о Security in Depth: New Security Features.

+5

Было бы неплохо чтобы увидеть какую-то ссылку. – kangax

+0

, но разве это проблема, вызывающая проблемы? Значит, это нормально, если мы проигнорируем это сообщение? – samach

+0

@Greg Какой алгоритм используется браузерами для «обнаружения ситуации»? Он не может просто искать строку «

129

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

X-XSS-Protection: 0 
+8

Спасибо! Это заслуживает гораздо большего внимания. –

+0

Это не сработало для меня. –

+2

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

14

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

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

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

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

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

0

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

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

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

1

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

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

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

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