Bir JavaScript komut dosyası yürütmeyi reddetti. Komut dosyasının kaynak kodu istek içinde bulundu


82

WebKit'te JavaScript'imde aşağıdaki hatayı alıyorum:

Bir JavaScript komut dosyası yürütmeyi reddetti. Komut dosyasının kaynak kodu istek içinde bulundu.

Kod bir JavaScript döndürücüsü içindir, bkz. ASCII Art .

Kullanılan kod sorunsuz çalışıyor ve Camino ve Firefox'ta hala düzgün çalışıyor. Hata, yalnızca sayfa bir POST aracılığıyla kaydedildiğinde ve ardından bir GET aracılığıyla alındığında atılıyor gibi görünüyor. Hem Chrome / Mac hem de Safari / Mac'te olur.

Bunun ne anlama geldiğini ve bunu nasıl düzelteceğini bilen var mı?


Hmm, muhtemelen WebKit'im güncellendi. Sayfa tekrar çalışıyor. Ayrıca sayfanın tüm eski revizyonları (sayfanın altındaki Eski Revizyonlar düğmesine bakın).
doekman

Bu hata W3Schools ait tryit editörü oluşur w3schools.com/js/tryit.asp?filename=tryjs_events komut ilk kez çalıştırıldığında, ancak bu tıklayıp "düzenlemek ve bana tıkla" butonuna andan itibaren bloke oldu.

1
"Düzenle ve tıkla" düğmesine basarsanız, metin alanının içeriği (javascript ile) bir POST yoluyla sunucuya gönderilir. Chrome, javascript'in sunucuya gönderildiğini algılar ve kötü amaçlı olabilir. Engelleme, XSS saldırılarına karşı önlemdir.
doekman

X-XSS-Protection başlığının nasıl ayarlanacağını gösteren bağlantı: stackoverflow.com/questions/4635403/…
hh_s

Yanıtlar:


68

XSS (siteler arası komut dosyası oluşturma) saldırılarını önlemek için bir güvenlik önlemidir .

Bu, sunucuya bir HTTP POST isteği aracılığıyla bazı JavaScript kodu gönderildiğinde ve aynı kod HTTP yanıtı aracılığıyla geri geldiğinde gerçekleşir. Chrome bu durumu tespit ederse, komut dosyasının çalışması reddedilir ve hata mesajını alırsınız Refused to execute a JavaScript script. Source code of script found within request.

Ayrıca Güvenlik Derinlikli: Yeni Güvenlik Özellikleri hakkındaki bu blog yayınına bakın .


5
Bir çeşit referans görmek güzel olurdu.
kangax

ama bu gona herhangi bir soruna neden olur mu? Yani bu mesajı görmezden gelirsek sorun olur mu?
samach

@Greg Tarayıcılar tarafından "durumu tespit etmek" için hangi algoritma kullanılır? Verilerdeki "<script>" dizesini aramak olamaz, değil mi?
Pacerier

1
Bu cevap arasında, X-XSS-Protection: 0 düzeltmesinin kullanılmasıyla ilgili aşağıdaki Kendall'ın cevabı arasında bir tartışma görmek istiyorum. Siteyi XSS saldırılarına kadar açar mı? Eğer öyleyse, bu hatayı çözmenin başka bir yolu var mı?
dansalmo

Bunu daha ayrıntılı açıklayan referans, blog.chromium.org/2010/01/… Bkz. Yansıtıcı XSS ​​Koruması bölümü
h - n

132

Bu "özellik" X-XSS-Protection, etkilenen sayfada standart olmayan HTTP başlığı gönderilerek devre dışı bırakılabilir .

X-XSS-Protection: 0

2
Bu hatayı tetikleyen sayfanın, sayfa gönderimi ile değil, bu başlık ile gönderildiğinden emin olun.
Kendall Hopkins

@KendallHopkins .... Bunu Javascript / Java ile nasıl kullanabileceğimi söyler misiniz?
SRy

+1 Bu, kabul edilen yanıttan farklı olarak soruyu tamamen yanıtlar, ancak uyarır ancak herhangi bir çözüm sağlamaz.
JohnnyQ

2
-1 Bu, Chrome'daki sorunu "düzeltebilir", ancak gerçek sorunu çözmez - bunu yaparsanız, siteniz yine de siteler arası komut dosyası çalıştırma saldırılarına karşı savunmasızdır (aslında daha savunmasızdır). @Greg'in ima ettiği ancak açıkça söylemediği gibi gerçek çözüm, istekte gönderilen yanıta HTML / JS'yi geri göndermemektir. Sağladığı bağlantıları okumak bunu netleştirmiş olmalıydı.
sfarbota

@sfarbota Bu korumanın kötü olduğu birçok durum var. Örneğin, düzenlemekte olduğunuz JS'yi geri döndürmenin tamamen kabul edilebilir olduğu birçok CMS sistemini bozar. Ancak sizin açınızdan, bunu bir sitedeki her sayfaya kapsamlı bir şekilde eklemenizi tavsiye etmem ve muhtemelen yalnızca bir geliştiricinin bu hatayı bulduğu durumlarda gereklidir.
Kendall Hopkins

15

Kısa cevap : JavaScript’i ilk kez gönderdikten sonra sayfayı yenileyin veya düzenlemekte olduğunuz sayfayı görüntüleyecek URL’yi tıklayın.

Uzun cevap : Forma doldurduğunuz metin javascript içerdiğinden ve tarayıcının javascript kaynağı olduğunuzu bilmesine gerek olmadığından, tarayıcının bu JS'nin kaynağı olmadığınızı varsayması daha güvenlidir ve çalıştırmayın.

Bir örnek : Size e-postanıza veya facebook'a içinde javascript içeren bir bağlantı verdiğimi varsayalım. Ve javascript'in tüm arkadaşlarınıza benim harika bağlantıma mesaj göndereceğini hayal edin. Dolayısıyla, bu bağlantının çağrılmasını sağlama oyunu basitleşir, javascript'i sayfaya dahil edilecek şekilde göndermek için bir yer bulun.

Chrome ve diğer WebKit tarayıcıları, istekte mevcutsa yanıtta bulunan herhangi bir javascript'i çalıştırmayarak bu riski azaltmaya çalışır. Hain saldırım, tarayıcınız bu JS'yi asla çalıştırmayacağı için engellenirdi.

Sizin durumunuzda, bir form alanına gönderiyorsunuz. Form alanının Postası, Javascript'i görüntüleyecek sayfanın görüntülenmesine ve tarayıcının endişelenmesine neden olacaktır. Ancak, javascript'iniz gerçekten kaydedilmişse, formu göndermeden aynı sayfaya tıklamak, çalışmasına izin verecektir.


1

Başkalarının da söylediği gibi, bu, bir HTTP yanıtı istekte bulunan bir JavaScript ve / veya HTML dizesi içerdiğinde gerçekleşir. Bu genellikle bir form alanına JS veya HTML girilmesinden kaynaklanır, ancak URL'nin parametrelerini manuel olarak ayarlamak gibi başka yollarla da tetiklenebilir.

Bununla ilgili sorun, kötü niyetli birinin istediği JS'yi değer olarak koyması, kötü niyetli JS değeri ile bu URL'ye bağlanması ve kullanıcılarınıza sorun çıkarmasıdır.

Hemen hemen her durumda, bu , istisnalar olsa da yanıtı HTML kodlayarak düzeltilebilir . Örneğin bu, bir <script>etiketin içindeki içerik için güvenli olmayacaktır . Diğer özel durumlar farklı şekilde ele alınabilir - örneğin, bir URL'ye girdi enjekte etmek, URL kodlamasıyla daha iyi sunulur.

Kendall Hopkins'in bahsettiği gibi, JSFiddle gibi bir uygulama oluşturmak gibi, JavaScript'in form girdilerinden yürütülmesini istediğiniz birkaç durum olabilir . Bu durumlarda, körü körüne geri yazmadan önce en azından arka uç kodunuzdaki girişi gözden geçirmenizi tavsiye ederim. Bundan sonra, XSS tıkanmasını önlemek için bahsettiği yöntemi kullanabilirsiniz (en azından Chrome'da), ancak bunun sizi saldırganlara açtığını unutmayın.


0

Bu hileli PHP numarasını veritabanına kaydettikten hemen sonra, ancak komut dosyası isteğimden oluşturulmadan önce kullandım . _GET:

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

Bu benim için en ucuz çözümdü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.