<a href…> 'de "ve" işaretleri kodlayabilir miyim?


157

Otomatik olarak HTML üreten kod yazıyorum ve düzgün bir şekilde kodlamak istiyorum.

Aşağıdaki URL'ye bir bağlantı oluşturduğumu varsayalım:

http://www.google.com/search?rls=en&q=stack+overflow

Tüm öznitelik değerlerinin HTML kodlu olması gerektiğini varsayıyorum. (Yanlışsam lütfen beni düzeltin.) Yani yukarıdaki URL'yi bir bağlantı etiketine koyarsam &amp;, ve işareti şu şekilde kodlamalıyım :

<a href="http://www.google.com/search?rls=en&amp;q=stack+overflow">

Bu doğru mu?



6
@CiroSantilli: gerçek URL dizeleriyle ilgili; bu, HTML özelliklerinde göründüklerinde nasıl kodlandıklarıyla ilgilidir.
JW.

gördüğüm gibi, ve işaretleri kodlamak her zaman html5 gerekli değildir ve cevaplar modası geçmiş.
qdinar

Yanıtlar:


175

Evet öyle. HTML varlıkları HTML öznitelikleri içinde ayrıştırılır ve bir sapma &belirsizliği oluşturur. Bu nedenle &amp;, tüm HTML özelliklerinin &içine yazmak yerine her zaman yazmalısınız .

Yani, sadece &ve tırnak ihtiyaç kodlanmış olması. éÖzelliğinizde olduğu gibi özel karakterleriniz varsa , HTML ayrıştırıcısını tatmin etmek için bunları kodlamanız gerekmez.

URL'lerin ASCII olmayan karakterler gibi özel bir işleme ihtiyaç duyması durumuydu é. Kaçışları kullananları kodlamanız gerekiyordu ve bu durumda RFC 1738%C3%A9 tarafından tanımlandıkları için verecekti . Bununla birlikte, RFC 1738'in yerini, WhatWG'nin ASCII olmayan bir URL gördüklerinde tarayıcıların nasıl davranması gerektiğini tanımlamak için RW 3986 (URI'ler, Tekdüzen Kaynak Tanımlayıcıları) ve RFC 3987 (IRI'ler, Uluslararası Kaynak Tanımlayıcıları) yerini almıştır. HTML5'ten beri içindeki karakterler . Bu nedenle, ASCII olmayan karakterleri yüzde kodlamalı veya yüzde URL'lere dahil etmek artık güvenlidir.


1
Bundan oldukça emindim, ama nadiren bir şüphe anım vardı. Onayladığınız için teşekkürler.
JW.

1
Ayrıca boşlukları% 20 yerine "+" olarak kodlayabilirsiniz - bu da URL'nin okunmasını kolaylaştırır.
NickG

1
+ şu anda yerel iPhone posta istemcisindeki mailto bağlantılarında değer görmez.
Ryan Olson


4
(Sadece bu hataya düştüğüm gibi) bir şablon motoruna güveniyorsanız, HTML varlıklarından kaçmanın otomatik olarak ilgilenip ilgilenmediğini kontrol etmeniz gerektiğini ekliyorum . Benim durumumda Twig bunu yapıyordu ve yanlış bir şekilde &amp;doğrudan kullanmak yerine tag özelliğine yazmaktan kaçıyordum &.
Kamafeather

24

Mevcut resmi HTML önerileriyle, ve işareti örneğin &amp;bu bağlamlarda olduğu gibi kaçmalıdır. Ancak, tarayıcılar bunu gerektirmez ve HTML5 CR bunu bir kural haline getirmeyi önerir , böylece özellik değerlerinde özel kurallar uygulanır. Mevcut HTML5 doğrulayıcıları bu bağlamda güncelliğini yitirmiştir ( yorum içeren hata raporuna bakın ).

Amplifandlardan öznitelik değerlerinde kaçmak mümkün olacaktır, ancak mevcut araçlarla doğrulamadan başka, hrefdeğerlerden kaçmak için pratik bir ihtiyaç yoktur (ve bunlardan kaçmaya başlarsanız küçük hata yapma riski vardır).


4
XHTML ( gerçek XHTML olarak gönderilir application/xhtml+xml) büyük olasılıkla her zaman gerektirir.
zneak

4
Hala irdelenmesi, tartışılması ve yanlış anlaşılan ediliyor bu değişiklik için bir uyarı, yani &kadar uzun "olduğu gibi, şimdi tamam olması gerekiyordu un belirsiz". Ve işareti belirsiz yapmanın bariz bir yolu, önce boşluk olmayan karakterlerle, ardından noktalı virgülle izlemektir. Bu ve işareti şimdi belirsizdir ve ayrıştırma hatasına neden olacaktır .
mat

Jukka'nın dediği gibi, kesinlikle tüm ve işaretleri kodlama riski vardır, bu yüzden href URL'lerinizden birinin noktalı virgül içermesinin ne kadar olası olduğunu düşünün. Bunun yerine, noktalı virgül içeren bir url gördüğümden emin olmadığımdan, pek olası değil. Bu yapılamaz. Yani pratik olarak, kullanımımızın &belirsiz olacağını düşünmüyorum . Bu nedenle, href özelliklerinde kodlanmamış olarak kullanmaya devam ediyoruz.
mat

Kaçmanın gerekli olmasının tüm nedeni tam olarak bir belirsizlik olasılığı nedeniyle . Bu özel sorun, XSS saldırı vektörleri, kötü oluşturma veya% 99.99 oranında herhangi bir etki vermiyor olabilir, ancak bu rahatsız etmemek için bir neden değildir. Doğru şekilde kaçmak zordur ve her zaman hata yapma olasılığı vardır.
Phil

5

Zneak'ın cevabının yeterli örnekleri olmadığını, HTML ve URI işlemeyi farklı yönler ve standartlar olarak göstermediğini ve bazı küçük şeylerin eksik olduğunu bulduğum için yeni bir cevap gönderiyorum.

Links ( <a href) içindeki URL'lerle ilgili iki standardınız var .

Birinci standart, "3.2.1. Veri Karakterleri" nde bir HTML özelliğinin değeri olarak kullanıldığında kaçması gereken karakterleri okuyabileceğiniz RFC 1866'dır (HTML 2.0). (Özniteliklerin kendileri özel karakterlere hiç izin vermez, örneğin <a hr&ef="http://...izin verilmez veya izin verilmez <a hr&amp;ef="http://....)

Daha sonra bu HTML 4 standardına girdi, kaçmanız gereken karakterler:

<   to   &lt;
>   to   &gt;
&   to   &amp;
"   to   &quote;
'   to   &apos;

Diğer standart, URL'lerin işlendiği RFC 3986 "Genel URI standardı" dır (bu, kullanıcı HTML öğesini tıkladığı için tarayıcı bir bağlantıyı izlemek üzereyken olur).

reserved    = gen-delims / sub-delims

gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

sub-delims  = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="

Bu karakterlerden kaçmak önemlidir, böylece müşteri verileri mi yoksa bir sınırlayıcı mı temsil ettiğini bilir.

Kaçışsız örnek:

https://example.com/?user=test&password&te&st&goto=https://google.com

Örnek, tamamen yasal URL

https://example.com/?user=test&password&te%26st&goto=https%3A%2F%2Fgoogle.com

HTML özelliği değerinde tam yasal URL örneği:

https://example.com/?user=test&amp;password&amp;te%26st&amp;goto=https%3A%2F%2Fgoogle.com

Ayrıca önemli senaryolar:

  • Değer olarak Javascript:

    <img src="..." onclick="window.location.href = &quot;https://example.com/?user=test&amp;password&amp;te%26st&amp;goto=https%3A%2F%2Fgoogle.com&quot;;">...</a>(Evet, ;;doğrudur.)

  • Değer olarak JSON:

    <a href="..." data-analytics="{&quot;event&quot;: &quot;click&quot;}">...</a>

  • Kaçan şeylerin içinde kaçan şeyler, çift kodlama, parametre içindeki URL içindeki URL vb.

    http://x.com/?passwordUrl=http%3A%2F%2Fy.com%2F%3Fuser%3Dtest&amp;password=&quot;&quot;123


3

Evet, dönüştürmeniz &gerekir &amp;.

W3C'nin bu html doğrulama aracı, bu gibi sorular için yararlıdır. Belirli bir sayfanın hatalarını ve uyarılarını size bildirir.


1
W3C doğrulayıcı bu &bir hata olarak ( bir href çıkışsız) tespit emin değilim .
ChrisW

6
Şu anda, W3C doğrulayıcı kaçış ve geçerli olarak kabul ediyor. Bu, standardın değiştiği ve kodlamanın artık gerekli olmadığı anlamına mı geliyor? (çoğu cevabı burada modası geçmiş yapmak)? Öyleyse, bu yalnızca href veya herhangi bir özellik için mi geçerlidir?
matteo
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.