İki nokta üst üste `:` dostu URL kullanımı için güvenli midir?


109

Uygulama bölümlerini eğik çizgilerle ayrılmış kelimeler olarak belirleyecek bir URL sistemi tasarlıyoruz. Spesifik olarak, bu GWT'de olduğundan, URL'nin ilgili bölümleri karma içinde olacaktır (bu, istemci tarafındaki bir denetleyici katmanı tarafından yorumlanacaktır):

http://site/gwturl#section1/section2

Bazı bölümler, bir ile belirtmek istediğimiz ek özniteliklere ihtiyaç duyabilir :, böylelikle URL'nin bölüm kısımları açık ve net olur. Kod önce /, sonra şu şekilde bölünür ::

http://site/gwturl#user:45/comments

Elbette, bunu url dostu olması için yapıyoruz, bu nedenle özel bir anlam taşıyacak bu karakterlerin hiçbirinin tarayıcılar veya başka bir sistem tarafından url kodlamasına tabi tutulmayacağından ve böyle bir URL ile sonuçlanmayacağından emin olmak istiyoruz. bu:

http://site/gwturl#user%3A45/comments <--- BAD

İki nokta üst üste kullanmak tarayıcılar, yer imi sistemleri, hatta Javascript veya Java kodu için güvenli mi (yani otomatik olarak kodlanmayacaktır)?


Belki de URL'leri yalnızca istemci tarafında kullandığınızı (daha açık bir şekilde) belirtmek iyi bir fikirdir? Çoğu yanıt (benimki gibi) URL'yi HTTP kullanarak bir sunucuya göndereceğinizi varsayıyor gibi görünüyor.
Veger

Müşteri tarafında parçanın kullanıldığına dair açıklama eklemek için düzenlendi.
Nicole

Merak ediyorum: 10 ay sonra bu url şeması sizin için çalıştı mı? Aynı düzeni kullanmayı düşünüyorum.
Jonathan Swinney

1
@Jonathan Swinney, Maalesef bu projeden (ve şirketten) ayrıldım, ancak buradaki cevaplar beni tatmin edici bir yol olduğu konusunda tatmin etti. Yeni bir projeye başlayacak olsaydım, bu şemayı kullanırdım, ancak #!sayfaların durum bilgili olduğunu belirtmek için de kullanacağımdan emin olurdum - bkz. Googlewebmastercentral.blogspot.com/2009/10/… (Bu öneriye bağlı kalınmıştır. Facebook gibi yoğun AJAX kullanıcıları tarafından)
Nicole

WhatsApp'ın ilk iki nokta üst üste bir URL'yi keseceğini öğrendim, bu nedenle örneğin bir google maps URL'sini işe yaramaz hale getirdi. Yani evet, ondan kaçmak önemli.
Petruza

Yanıtlar:


84

Yakın zamanda bir URL kodlayıcı yazdım , bu yüzden bu aklımda oldukça yeni.

http://site/gwturl#user:45/comments

Parça kısmındaki ( user:45/comments) tüm karakterler, RFC 3986 URI'leri için tamamen yasaldır .

ABNF'nin ilgili bölümleri :

fragment      = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
                 / "*" / "+" / "," / ";" / "="

Bu kısıtlamaların dışında, parça parçasının uygulamanızın verdiğinin ötesinde tanımlanmış bir yapısı yoktur. Http şeması yalnızca bu bölümü sunucuya göndermediğinizi söylüyor.


DÜZENLE:

D'oh!

URI spesifikasyonuyla ilgili iddialarıma rağmen, reddedilemez , işaret ettiğinde doğru cevabı veriyor o HTML 4 Spec kısıtlar eleman adları / tanımlayıcılar .

HTML 5'te tanımlayıcı kurallarının değiştiğini unutmayın . URI kısıtlamaları yine de geçerli olacaktır (yazım sırasında, HTML 5'in URI kullanımıyla ilgili bazı çözülmemiş sorunlar vardır).


Sanırım bir şeyin peşindesin, bunu biraz daha açıklayabilir misin? GWT kullandığımız için bunu sunucuya göndermemek sorun değil. Alıntı yaptığınız bölümde belirtilen sözdiziminden emin değilim.
Nicole

Ancak :bir alt sınırlandırmadır, bir genel sınırlamadır.
bobince

1
Noktalı virgül bir pchar için yasaldır, bu nedenle alt
sınırlamada

@bobince - :içindedir pchariçinde olan, fragmentbu nedenle, :izin verilir. @Renesis - Wikipedia'da ABNF ile ilgili bir makale var en.wikipedia.org/wiki/ABNF Temelde izin verilen karakterlerin listesine bakıyorsunuz, burada OR/ anlamına geliyor . Herhangi bir GWT programlaması yapmadım, bu yüzden URI'lerin fragman kısmını nasıl kullandığını bilmiyorum.
McDowell

Son bir soru - bu spesifikasyonun gerçek dünya uygulaması hakkında herhangi bir fikriniz var mı? Bu, tarayıcıların parçadaki içeriği görmezden gelmesi (kodlamasını atlaması) gerektiği anlamına mı geliyor :?
Nicole

59

McDowell'in URI standardı üzerindeki analizine ek olarak, parçanın geçerli HTML bağlantı adı olması gerektiğini de unutmayın. Göre http://www.w3.org/TR/html4/types.html#type-name

Kimlik ve İSİM simgeleri bir harfle ([A-Za-z]) başlamalı ve ardından herhangi bir sayıda harf, rakam ([0-9]), kısa çizgi ("-"), alt çizgi ("_") gelebilir , iki nokta üst üste (":") ve noktalar (".").

Yani şanslısın. ":" açıkça izin verilir. Ve hiç kimse "%" 'den kaçmamalı, sadece "%" oradaki yasadışı karakter olduğu için değil, aynı zamanda parçanın çapa adıyla karakter karakteriyle eşleşmesi gerektiği için, bu nedenle hiçbir aracı onlarla hiçbir şekilde oynamaya çalışmamalıdır.

Ancak onu test etmelisiniz. Web standartları sıkı bir şekilde izlenmez, bazen standartlar çelişir. Örneğin HTTP / 1.1 RFC 2616, istek URL'sinde sorgu dizesine izin vermezken, HTML GET yöntemiyle bir form gönderirken bir tane oluşturur. Gerçek dünyada hangisi uygulanırsa, günün sonunda kazanır.


58

MediaWiki ve diğer wiki motorları, ad alanlarını belirtmek için URL'lerinde iki nokta üst üste kullanır, görünüşe göre büyük sorunlar yok.

örneğin http://en.wikipedia.org/wiki/Template:Welcome


31
En alakalı cevap. Spesifikasyonlarda bulunanların web geliştirmedeki gerçeklikle çok az ilgisi olduğunu hepimiz biliyoruz. "Güvenlik" konusunda "dünyanın en iyi 10 web sitesinden birinin bunu yapmasından" daha iyi bir garanti alamayacaksınız.
Steven Collins

1
@StevenCollins Tam olarak aynı şeyi ifade eden, bundan 3 yıl önce verilen cevaptan daha önemli değil :)
Martin James

7

Ben buna güvenmezdim. Muhtemelen %3Abirçok kullanıcı aracısı tarafından kodlanmış url alacaktır .


1
@arbales: Evet. Daha az uyumlu bazı kullanıcı aracıları, uyumlu olmayan url'leri süslenmemiş olarak bırakacaktır.
Asaph

4

Gönderen URLEncoderjavadoc:

HTML form kodlaması hakkında daha fazla bilgi için HTML spesifikasyonuna bakın .

Bir String kodlanırken, aşağıdaki kurallar geçerlidir:

  • Alfasayısal karakterler "a" ila "z", "A" ila "Z" ve "0" ila "9" aynı kalır.
  • ".", "-", "*" ve "_" özel karakterleri aynı kalır.
  • Boşluk karakteri "" artı işaretine "+" dönüştürülür.
  • Diğer tüm karakterler güvensizdir ve önce bazı kodlama şemaları kullanılarak bir veya daha fazla bayta dönüştürülür. Daha sonra her bayt, 3 karakterli "% xy" dizesi ile temsil edilir; burada xy, baytın iki basamaklı onaltılık gösterimidir. Kullanılması önerilen kodlama şeması UTF-8'dir. Bununla birlikte, uyumluluk nedenleriyle, bir kodlama belirtilmezse, platformun varsayılan kodlaması kullanılır.

Yani :güvenli değil.


3

Karakteri içeren Wikipedia URL'lerinden bazılarını kodlayan Firefox veya IE8 görmüyorum .


1
Opera ayrıca
noktalı virgülü

1
Renesis, URL yolundan değil, URL parçasından bahsediyor.
Gumbo

Wikipedia, bu soruyu yazarken düşüncelerimden biriydi. Öyleyse iki nokta üst üste kullanımı teknik olarak geçersiz / güvenli değil mi? Genellikle kodlanmış Wikipedia URL'lerinde (ve) görüyorum, ancak iki nokta üst üste işaretini asla görmüyorum, bu da kafamı biraz karıştırdı.
Nicole

3
Wayback Makinası bir vardır: kendi bağlantıları birçoğunda - örneğin web.archive.org/web/20080822150704/http://stackoverflow.com
barrowc

2

Bir protokol kimlik doğrulama gerektiriyorsa, kullanıcı adı ve parola arasında ayrım olarak iki nokta üst üste kullanılır.


0

Kolon güvenli değil. Buraya bakın


Bu sayfa neden güvenli olmadıklarını motive etmiyor. Başvurulan RFC2396 , ondan kaçılması gerektiğini de söylemiyor. Ayrıca, sağlanan dönüştürücü komut dosyası onu kodlamaz (yine de Chrome 9'da).
Adam Lindberg

Adam yanılıyorsun. Doğrudan neyi ve neden olduğunu belirtir.
ktamlyn

-5

Güvenli bir karakter değildir ve alan adınızın hemen arkasındayken hangi bağlantı noktasına bağlandığınızı ayırt etmek için kullanılır.

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.