Відмовлено виконувати скрипт JavaScript. Вихідний код сценарію знайдено в запиті


82

У WebKit я отримую таку помилку у своєму JavaScript:

Відмовлено виконувати скрипт JavaScript. Вихідний код сценарію знайдений у запиті.

Код призначений для обертання JavaScript, див. ASCII Art .

Код працював нормально, і все ще працює коректно в Camino та Firefox. Помилка видається лише тоді, коли сторінку зберігають через POST, а потім отримують за допомогою GET. Це трапляється як у Chrome / Mac, так і в Safari / Mac.

Хтось знає, що це означає, і як це виправити?


Хм, напевно мій WebKit оновлений. Сторінка знову працює. Також усі старі версії сторінки (див. Кнопку Старі версії внизу сторінки).
доекман

ця помилка виникає в редакторі tryit веб-сайту w3schools w3schools.com/js/tryit.asp?filename=tryjs_events сценарій виконується вперше, але блокується з моменту натискання кнопки "редагувати та натиснути мене".

1
Якщо натиснути кнопку «редагувати та натиснути мене», вміст текстової області (з javascript) надсилається на сервер через POST. Chrome виявляє, що javascript розміщується на сервері, і він може бути зловмисним. Блокування є мірою проти XSS-атак.
доекман

Ось посилання , яка показує , як встановити заголовок X-XSS-Protection: stackoverflow.com/questions/4635403 / ...
hh_s

Відповіді:


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

Посилання, яке додатково пояснює це, blog.chromium.org/2010/01/… Див. Розділ «Захист відбиває XSS»
h - п

132

Цю "функцію" можна вимкнути, надіславши нестандартний заголовок HTTP X-XSS-Protectionна відповідну сторінку.

X-XSS-Protection: 0

2
Переконайтеся, що сторінка, яка ініціює цю помилку, надсилається із цим заголовком, а не надсилає сторінку.
Кендалл Хопкінс,

@KendallHopkins .... Чи можете ви сказати мені, як я можу використовувати це через Javascript / Java?
СР

+1 Це відповідає на запитання на відміну від прийнятої відповіді, однак попереджає, але не дає жодного рішення.
JohnnyQ

2
-1 Це може "вирішити" проблему в Chrome, але це не вирішить справжню проблему - ваш сайт все ще вразливий до міжсайтових атак сценаріїв (насправді більш вразливий), якщо ви це зробите. Реальним рішенням, як @Greg натякнув, але не сказав прямо, є не надсилання HTML / JS назад у відповідь, яка була подана у запиті. Читання посилань, які він надав, повинно було це чітко пояснити.
sfarbota

@sfarbota Є багато випадків, коли цей захист поганий. Наприклад, це ламає багато систем управління вмістом, де цілком прийнятно повернути JS, який ви редагуєте. Але на вашу думку, я б не радив бланкетно додавати це на кожну сторінку сайту, і це, мабуть, потрібно лише у випадках, коли розробник потрапляє на цю помилку.
Кендалл Хопкінс

15

Коротка відповідь : оновіть сторінку після первинного подання JavaScript або натисніть URL-адресу, яка відображатиме сторінку, яку ви редагуєте.

Довга відповідь : оскільки текст, який ви заповнили у формі, включає javascript, і браузер не обов’язково знає, що ви є джерелом javascript, браузеру безпечніше вважати, що ви не є джерелом цього JS, і не запускати його.

Приклад : Припустимо, я дав вам посилання на вашу електронну пошту або facebook з яваскриптом. І уявіть, що 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>";
}

Це було найдешевше рішення для мене.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.