Odmówił wykonania skryptu JavaScript. Kod źródłowy skryptu znaleziony w żądaniu

82

W WebKit pojawia się następujący błąd w moim JavaScript:

Odmówił wykonania skryptu JavaScript. Kod źródłowy skryptu znaleziony w żądaniu.

Kod jest przeznaczony dla spinner JavaScript, patrz ASCII Art .

Kod działał poprawnie i nadal działa poprawnie w Camino i Firefox. Wydaje się, że błąd pojawia się tylko wtedy, gdy strona jest zapisywana za pomocą POST, a następnie pobierana za pomocą GET. Dzieje się tak zarówno w Chrome / Mac, jak i Safari / Mac.

Czy ktoś wie, co to oznacza i jak to naprawić?

doekman
źródło
Hmm, prawdopodobnie mój WebKit został zaktualizowany. Strona znów działa. Również wszystkie stare wersje strony (zobacz przycisk Stare wersje na dole strony).
doekman
ten błąd występuje w edytorze tryit w w3schools w3schools.com/js/tryit.asp?filename=tryjs_events, skrypt jest wykonywany po raz pierwszy, ale jest blokowany od momentu kliknięcia przycisku „Edytuj i kliknij mnie”.
1
Jeśli naciśniesz przycisk „edytuj i kliknij mnie”, zawartość obszaru tekstowego (z javascript) jest wysyłana na serwer za pośrednictwem POST. Chrome wykrywa, że ​​javascript jest wysyłany na serwer i może być złośliwy. Blokowanie jest środkiem przeciwko atakom XSS.
doekman
Oto link, który pokazuje, jak ustawić nagłówek X-XSS-Protection: stackoverflow.com/questions/4635403/…
hh_s

Odpowiedzi:

68

Jest to środek bezpieczeństwa mający na celu zapobieganie atakom XSS (cross-site scripting) .

Dzieje się tak, gdy jakiś kod JavaScript jest wysyłany do serwera za pośrednictwem żądania HTTP POST i ten sam kod wraca za pośrednictwem odpowiedzi HTTP. Jeśli Chrome wykryje tę sytuację, skrypt nie zostanie uruchomiony i pojawi się komunikat o błędzie Refused to execute a JavaScript script. Source code of script found within request.

Zobacz także ten post na blogu o szczegółach bezpieczeństwa: nowe funkcje zabezpieczeń .

Greg
źródło
5
Byłoby miło zobaczyć jakieś odniesienie.
kangax
ale czy to spowoduje jakieś problemy? czyli czy jest ok, jeśli zignorujemy tę wiadomość?
samach
@Greg Jaki algorytm jest używany przez przeglądarki do „wykrywania sytuacji”? Nie można po prostu szukać w danych ciągu „<script>”, prawda?
Pacerier,
1
Chciałbym zobaczyć dyskusję pomiędzy tą odpowiedzią a odpowiedzią od Kendalla poniżej dotyczącą implikacji użycia poprawki X-XSS-Protection: 0. Czy otwiera witrynę na ataki XSS? Jeśli tak, czy istnieje inny sposób rozwiązania tego błędu?
dansalmo
Odnośnik, który dokładniej to wyjaśnia, blog.chromium.org/2010/01/ ... Zobacz sekcję Odblaskowa ochrona XSS
h - n
132

Tę „funkcję” można wyłączyć, wysyłając niestandardowy nagłówek HTTP X-XSS-Protectionna stronie, której dotyczy problem.

X-XSS-Protection: 0
Kendall Hopkins
źródło
2
Upewnij się, że strona, która powoduje ten błąd, jest wysyłana z tym nagłówkiem, a nie przesyłaniem strony.
Kendall Hopkins
@KendallHopkins .... Czy możesz mi powiedzieć, jak mogę tego używać za pomocą Javascript / Java?
SRy,
+1 To dokładnie odpowiada na pytanie w przeciwieństwie do zaakceptowanej odpowiedzi, jednak ostrzega, ale nie daje żadnego rozwiązania.
JohnnyQ,
2
-1 To może „naprawić” problem w przeglądarce Chrome, ale nie rozwiązuje prawdziwego problemu - Twoja witryna jest nadal podatna na ataki typu cross-site scripting (w rzeczywistości bardziej podatna), jeśli to zrobisz. Prawdziwym rozwiązaniem, do którego nawiązywał @Greg, ale nie powiedział tego wprost, jest niewysłanie HTML / JS z powrotem w odpowiedzi przesłanej w żądaniu. Przeczytanie podanych przez niego linków powinno było to wyjaśnić.
sfarbota
@sfarbota Jest wiele przypadków, w których ta ochrona jest zła. Na przykład psuje wiele systemów CMS, w których zwrot JS z powrotem, który edytujesz, jest całkowicie akceptowalny. Ale do twojego punktu nie radziłbym ogólnie dodawać tego do każdej strony w witrynie i prawdopodobnie jest to potrzebne tylko w przypadkach, gdy programista napotka ten błąd.
Kendall Hopkins
15

Krótka odpowiedź : odśwież stronę po przesłaniu kodu javascript lub kliknij adres URL, który wyświetli stronę, którą edytujesz.

Długa odpowiedź : ponieważ tekst, który wypełniłeś w formularzu, zawiera javascript, a przeglądarka niekoniecznie wie, że jesteś źródłem javascript, bezpieczniej jest, aby przeglądarka założyła, że ​​nie jesteś źródłem tego JS oraz nie uruchamiaj go.

Przykład : załóżmy, że podałem ci link do twojego e-maila lub facebooka z jakimś javascriptem. I wyobraź sobie, że javascript przesłałby wszystkim twoim znajomym mój fajny link. Tak więc gra polegająca na uzyskaniu tego linku do wywołania staje się po prostu znalezieniem miejsca do wysłania kodu javascript w taki sposób, aby znalazł się na stronie.

Chrome i inne przeglądarki WebKit próbują zminimalizować to ryzyko, nie wykonując żadnego kodu JavaScript znajdującego się w odpowiedzi, jeśli był obecny w żądaniu. Mój nikczemny atak zostałby udaremniony, ponieważ Twoja przeglądarka nigdy nie uruchomiłaby tego JS.

W twoim przypadku przesyłasz go do pola formularza. Opublikowanie pola formularza spowoduje renderowanie strony, na której zostanie wyświetlony kod JavaScript, powodując zaniepokojenie przeglądarki. Jeśli jednak Twój skrypt javascript jest naprawdę zapisany, kliknięcie tej samej strony bez przesłania formularza pozwoli na jego wykonanie.

Koos Kleven
źródło
1

Jak powiedzieli inni, dzieje się tak, gdy odpowiedź HTTP zawiera ciąg JavaScript i / lub HTML, który również był w żądaniu. Zwykle jest to spowodowane wprowadzeniem kodu JS lub HTML do pola formularza, ale może również zostać wywołane innymi sposobami, na przykład ręcznym dostosowaniem parametrów adresu URL.

Problem polega na tym, że ktoś ze złymi intencjami może umieścić dowolny kod JS jako wartość, połączyć się z tym adresem URL ze złośliwą wartością JS i sprawić użytkownikom kłopoty.

W prawie każdym przypadku można to naprawić, kodując odpowiedź w formacie HTML , chociaż są wyjątki. Na przykład nie będzie to bezpieczne dla treści wewnątrz <script>tagu. Inne konkretne przypadki można traktować inaczej - na przykład wprowadzenie danych wejściowych do adresu URL jest lepiej obsługiwane przez kodowanie adresu URL.

Jak wspomniał Kendall Hopkins, może być kilka przypadków, w których faktycznie chcesz, aby JavaScript z danych wejściowych formularza był wykonywany, na przykład tworzenie aplikacji takiej jak JSFiddle . W takich przypadkach radzę przynajmniej przejrzeć dane wejściowe w kodzie zaplecza przed ślepym zapisaniem go z powrotem. Następnie możesz użyć wspomnianej przez niego metody, aby zapobiec blokowaniu XSS (przynajmniej w Chrome), ale pamiętaj, że otwiera cię to na atakujących.

sfarbota
źródło
0

Użyłem tej hakerskiej sztuczki PHP tuż po zatwierdzeniu do bazy danych, ale przed renderowaniem skryptu z mojego _GETżądania .:

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

To było dla mnie najtańsze rozwiązanie.

gabrielcrowe
źródło