Çifte Çıkış Kaçınılması Etkin mi?


136

/ Search / <searchterm> yoluyla şeyler arama sağlayan bir yol ile bir ASP.NET MVC uygulaması var.

"Arama / abc" sağladığımda iyi çalışıyor, ancak "/ search / a + b + c" (doğru url kodlamalı) sağladığımda IIS7, isteği 404.11 HTTP Hatası ile reddediyor ( İstek filtreleme modülü, çift ​​kaçış dizisi içeren istek ). Her şeyden önce, bunu neden yapıyor? Hatayı yalnızca URL'nin bir parçasıysa, ancak bir sorgu dizesinin parçası olarak atmıyor gibi görünüyor (/ transmit? Q = a + b + c iyi çalışıyor).

Şimdi web.config dosyamın güvenlik bölümünde çift kaçış isteklerini etkinleştirebilirim ama bunun anlamlarını anlamadığım için bunu yapmakta tereddüt etmiyorum ve sunucu neden "a + b + c" URL'sinin bir bölümüdür ancak bir sorgu dizesinin parçası olarak kabul edin.

Birisi ne yapacağını açıklayabilir ve tavsiyede bulunabilir mi?


7
Ayrıca Server.Url Yol Kodlama çağıran daha doğru seçeneği denedim ve /search/a%2520b%2520cgüzel bir "Potansiyel olarak tehlikeli bir Request.Path değeri istemciden (%) algılandı" hataya yol açtı. Kazanamazsın gibi görünüyor.
Zhaph - Ben Duguid

Yanıtlar:


158

Düzenleme: İlgili bölümlere vurgu eklendi.

Temel olarak: IIS aşırı paranoyak oluyor. Uri kodu çözülmüş verilerle (özellikle dize birleştirme yoluyla yerel dosya sistemi URI'leri oluşturmak gibi) özellikle mantıksız bir şey yapmıyorsanız bu kontrolü güvenle devre dışı bırakabilirsiniz.

Denetimi devre dışı bırakmak için aşağıdakileri yapın ( buradan ): (çift kaçmanın neyi gerektirdiğine ilişkin aşağıdaki yorumuma bakın).

<system.webServer>
    <security>
        <requestFiltering allowDoubleEscaping="true"/>
    </security>
</system.webServer>

Artı simgesi bir arama girişinde geçerli bir karakterse, IIS'nin URI yolundan bu girdiyi işlemesine izin vermek için "allowDoubleEscaping" seçeneğini etkinleştirmeniz gerekir .

Son olarak, çok basit, eğer sınırlı bir çözüm basitçe '+' kullanmaktan kaçınmak ve '% 20' kullanmaktır. Her durumda, bir alanı kodlamak için '+' sembolünün kullanılması geçerli bir url kodlaması değildir , ancak sınırlı bir protokol setine özgüdür ve muhtemelen geriye dönük uyumluluk nedeniyle geniş çapta desteklenir. Yalnızca standartlaştırma amaçlıysa, boşlukları zaten '% 20' olarak kodlamanız daha iyi olur; ve bu da IIS7 sorununu güzel bir şekilde azaltır (% 25ab gibi diğer diziler için de kırpılabilir).


3
Çeki devre dışı bırakırdım. Bu bir güçlüktür ve çoğu uygulama için ekstra güvenlik sağlamaz.
Eamon Nerbonne

3
Çift kaçmayı devre dışı bırakmanın oldukça güvenli olduğuna dair bir bağlantınız / referansınız var mı? Ayrıca, bu güvenlik önlemi tam olarak ne önler?
Alex

15
Bir uri çift kaçarsa, kaçmayan uri bileşenleri kendileri ayrılmış karakterler içerebilir ve bu nedenle kaçmayan uri'nin kendisi geçerli bir uri olabilir. Kısacası, yeni uri'leri (özellikle dosya sistemi yollarını) oluşturmak için çıkışsız uri dizesini kullanırsanız ve yeni yoldan doğru şekilde kaçamazsanız, yol enjeksiyonuna izin verebilirsiniz. Yol enjeksiyonu, bir saldırganın programınızı yapmaması gereken verileri işlemesi için kandırmasına veya iki uri'nin aslında aynı olduklarında farklı olduklarını ancak basitçe farklı şekilde kodlandıklarını düşünmelerine karıştırmasına izin verebilir.
Eamon Nerbonne


4
@Stijn: Evet: bu güvenli . Tüm bu kontrol, buggy kodu tarafından yanlış yorumlanabilecek istekleri filtrelemektir. Herhangi bir işlem yapmıyorsunuz, bu sizin açınızdan otomatik olarak güvenli. Herhangi bir hata, IIS'nin temel dosya sunum kodunda olması gerekir ve bunun şimdiye kadar çok, çok iyice savaş test edildiğini varsayabiliriz. Yine, bu kontrol fantezi bir şey değil, sadece kodu çözülebilecek şeyleri kurtarıyor ve sonra kodlanmış bir uri gibi görünüyor .
Eamon Nerbonne

2

Sadece Eamon Nerbonne'un sorunuzun " ne yapmalı " kısmı ile ilgili cevabına biraz bilgi eklemek istiyorum (nedenleri açıklamamak). Belirli bir uygulamanın ayarlarını aşağıdakilerle de kolayca değiştirebilirsiniz:

  1. konsolun yönetici haklarıyla açılması (Başlat - cmd - sağ tıklama, Yönetici olarak çalıştır)
  2. aşağıdakileri yazarak (buradan alınır: http://blogs.iis.net/thomad/archive/2007/12/17/iis7-rejecting-urls-containing.aspx ):

    %windir%\system32\inetsrv\appcmd set config "YOURSITENAME" -section:system.webServer/security/requestfiltering -allowDoubleEscaping:true

    (örneğin YOURSITENAME, Default Web Sitebu kuralı varsayılan web sitesine uygulamak için bununla değiştirebilirsiniz )

  3. Gir, hazır.

Bir örnek:

  1. öncelikle aynı sorunu yaşadım: HTTP Hatası 404.11 - İstek filtreleme modülü, çift çıkış dizisi içeren bir isteği reddedecek şekilde yapılandırıldı.
  2. Yukarıda belirtilen metni yazmak: Drupal7-Başka HTTP Hatası 404.11 için Çözüm - İstek filtreleme modülü, çift çıkış dizisi içeren bir isteği reddedecek şekilde yapılandırıldı.
  3. Şimdi beklendiği gibi çalışıyor: HTTP Hatası 404.11 için Çözüm - İstek filtreleme modülü, çift çıkış dizisi içeren bir isteği reddedecek şekilde yapılandırıldı.

1

Arama URL'sinin '/ search / a / b / c' gibi olmasını düşündünüz mü?

Gibi bir rota ayarlamanız gerekir

search/{*path}

Ardından, arama değerlerini eylemdeki yol dizenizden çıkarın.

HTHs
Charles


Sorun, URL kodlu diğer karakterlerin ('/' dahil) aramanın bir parçası olabilmesidir.
Alex

Aramanın bir parçası olan tüm '/' kodlarını '% 2F' olarak kodlayamadınız mı?
Charlino

0

Bir uygulamada bir Server.TransferRequest () yaparak IIS 7.5 altında bu koştu.

Dosya adının kodlanması çift kaçış sorununa neden oldu, ancak kodlamadıysam "potansiyel olarak tehlikeli Request.Path" hatasıyla karşılaşırdım.

URL'ye herhangi bir protokol, hatta boş bir protokol koymak Server.TranferRequest () iletmek sorunu düzeltti.

Çalışmıyor:

context.Server.TransferRequest("/application_name/folder/bar%20bar.jpg");

İşler:

context.Server.TransferRequest("://folder/bar%20bar.jpg");
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.