'&' Kelimesini '& amp;' olarak kodlamam gerekiyor mu?


207

&Sitemin HTML5 ve UTF-8 ile bir ' ' sembolü kullanıyorum <title>. Google, başlıklarındaki tüm tarayıcılarda olduğu gibi, SERP'lerde ve işareti iyi gösteriyor.

http://validator.w3.org bana bunu veriyor:

& karakter başvurusu başlatmadı. (& muhtemelen kaçmış olmalıydı &amp;.)

Gerçekten yapmam gerekiyor &amp;mu?

Sayfalarımın doğrulanması amacıyla doğrulanmasından endişe etmiyorum, ancak insanların bu konudaki fikirlerini ve bunun önemli olup olmadığını ve nedenini duymak isterim.


63
Gözlükler bunu söylemiyor. Poster, tüm senaryolarda ve işaretinden kaçmayı gerektirmeyen HTML5'i ifade eder.
Matthew Wilson

2
Bu, görüş aradığınız için Topluluk Wiki olmalıdır ve doğrulama konusunda telaşlı olmamanız, yanıt vermeniz gereken nesnel bir temel olmadığı anlamına gelir.
Richard JP Le Guen

6
@Richard: gerçekten mi? "Doğrulamanın önemli olmadığı" konusunda hemfikir olmasam da, bunu çok objektif bir soru olarak görüyorum: "Bu özellikten başka bir şeyi bozuyor mu?"
Joachim Sauer

2
@YiJiang Geçerli web tarayıcıları kullanıcıyı anlamak için büyük uzunluklara gider . Google da öyle . Spec'in bir parçası. Gelecekteki web tarayıcıları daha az bağışlayıcı olabilir . Bu yüzden Wikipedia'nın bunu nasıl yaptığını kontrol etmek ve kopyalamak her zaman iyi bir fikirdir.
unixman83

2
HTML spesifikasyonu bok girişini kabul ettiğini söylüyor. Bu, sitenizin şu anda "izin verilmesine" izin verildiği anlamına mı geliyor? Kapatılması gereken etiketleri kapatın ve bazı şeylerden kaçın! Hadi millet.
doug65536

Yanıtlar:


143

Evet. Hatanın dediği gibi, HTML'de öznitelikler #PCDATA, ayrıştırıldıkları anlamına gelir. Bu, niteliklerde karakter varlıklarını kullanabileceğiniz anlamına gelir. Tek &başına kullanmak yanlıştır ve yumuşak tarayıcılar için değilse ve bunun XHTML değil HTML olduğu gerçeği, ayrıştırmayı bozacaktır. Sadece kaçmak &amp;ve her şey iyi olurdu.

HTML5, boş bırakmanıza izin vermez, ancak yalnızca aşağıdaki veriler geçerli bir karakter başvurusuna benzemediğinde. Ancak, bu sembolün tüm örneklerinden kaçmak, hangilerinin olması gerektiği ve hangilerinin olması gerekmediği konusunda endişelenmekten daha iyidir.

Bu noktayı aklınızda bulundurun; & amp; & amp; 'den kaçmıyorsanız, oluşturduğunuz veriler için yeterince kötüdür (kodun çok iyi olabileceği yerlerde), kullanıcı tarafından gönderilen veriler için büyük bir sorun olan etiket sınırlayıcılardan da kaçmıyor olabilirsiniz, bu da HTML ve kod enjeksiyonuna, çerez çalmaya ve diğer istismarlara yol açabilir.

Lütfen kodunuzdan kaçın. Gelecekte size çok fazla sorun kazandıracak.


9
Hiçbir tarayıcı a & tek başına "yanlış yorumlayamaz". Mevcut her tarayıcı bunu "&" olarak görüntüler. Açıkça bunu yapmak için pratik bir sebep istediğini ve validasyon umurunda olmadığını belirtti ..
Thomas Bonini

47
Evet. Ama ahlaki, olmamız gereken güvenerek müsamaha ve tarayıcıların "güzel" hata işleme hakkında? Yoksa sadece doğru kodu yazmalı mıyız?
Delan Azabani

8
@Delan: Yazdığım her sayfayı geçerli kılmaya çalışırken, onun "ahlaken" umurunda olmadığı sorusunu okuduğumu anlıyorum. Sadece işe yarayıp yaramadığını umursuyor. Bunlar iki farklı felsefedir ve her ikisinin de artıları ve eksileri vardır ve “doğru” bir felsefe yoktur. Örneğin, bu web sitesi doğrulamıyor ve yine de harika bir web sitesi.
Thomas Bonini

3
@Andreas, ancak tarayıcıların doğru kodu yorumlamalarında yeterince hata var, onlara anlamsız işaretleme gönderirken doğru sonuçları almalarına bağlı olarak şanslı. Bugün bu örnekle işe yarayabilir ve daha sonra bir sonraki örnekle başarısız olabilir (bir sonraki örneğin & karakterinden sonra bir noktalı virgül olup olmadığını söyleyin)
Jon Hanna

11
Herkes HTML5 hakkında konuşuyor gibi görünüyor, ancak asıl soru HTML5'in kullanımda olduğunu belirtiyor. HTML5 açıkça bir çıkış karakterine izin vermez ve bu durumda normalde bir varlığa genişletilip genişletilmediği sürece (örn. & Copy = 2 sorunlu ancak & x = 2 iyi değilse).
Matthew Wilson

55

Doğrulama bir yana, bir HTML belgesi için belirli karakterleri kodlamanın bir web sayfası olarak düzgün ve güvenli bir şekilde görüntülenebilmesi için önemli olduğu gerçeği kalmaktadır.

Her koşulda &olduğu gibi kodlama &amp;, benim için, hata ve başarısızlık olasılığını azaltarak yaşamak daha kolay bir kuraldır.

Aşağıdakileri karşılaştırın: hangisi daha kolay? hangi kolaydır bozmak için ?

Metodoloji 1

  1. Ve işareti karakterleri içeren bir içerik yazın.
  2. Hepsini kodlayın.

Metodoloji 2

(bir tuz tanesi ile lütfen;))

  1. Ve işareti karakterleri içeren bir içerik yazın.
  2. Durum bazında, her bir ve işareti inceleyin. Şunları belirleyin:
    • İzole edilir ve net bir şekilde ve işareti vardır. Örneğin. volt & amp
       > Bu durumda kodlamayı zahmet etmeyin.
    • Yalıtılmış değildir, ancak sonuçta ortaya çıkan varlık mevcut olmadığından ve varlık listesi asla gelişemeyeceğinden asla varolmayacağından yine de belirsiz olduğunu hissedersiniz. Örneğin amp&volt
       , bu durumda kodlamayı zahmet etmeyin.
    • İzole ve belirsiz değildir. Örneğin. volt&amp
       > Kodlayın.

??


3
İkinci durumda amp&volt ise belirsiz: mi &voltşimdi bir varlık referansı veya olmasın?
Gumbo

6
İçinde @Gumbo işareti amp&voltolan değil (HTML spektrumu tanımına göre) muğlak bir işareti. Bkz. Mathiasbynens.be/notes/ambiguous-ampersands ve mothereff.in/ampersands#amp%26volt .
Mathias Bynens

@MathiasBynens Şimdiye kadar (2019), belirsiz bir ve işareti tanımı, 2011'de mathiasbynens.be/notes/ambiguous-ampersands'de alıntıladığınız tanımdan biraz değişmiş gibi görünüyor .
Jacob C.,

21

HTML5 kuralları HTML4'ten farklıdır. HTML5'te gerekli değildir - ve işareti bir parametre adı başlatmazsa. "& copy = 2" hala bir sorundur, örneğin & copy; telif hakkı sembolüdür.

Ancak bana göre, aşağıdaki metne bağlı olarak kodlamaya veya kodlamamaya karar vermek daha zor bir iş. Bu yüzden en kolay yol muhtemelen her zaman kodlamaktır.


2
Öznitelik değerlerini alıntılamak gibidir - zorunda değilsiniz, ancak her zaman yaparsanız yanlış gidemezsiniz.
Paul D.Waite

3
&copy=2düşündüğünüz kadar büyük bir problem değildir. Özellik değerlerinde (örn. hrefÖzellik), için &copykarakter referansı olarak kabul edilmez ©. Bir öznitelik değerinin dışında olurdu.
Mathias Bynens

Ve işareti normal olarak öncesinde ve ardından İngilizce metinde bir boşluk olduğu göz önüne alındığında, izlediğim kuralı hatırlamak veya düşünmek zor değildir: Ve işareti hemen hemen her zaman görünen başka bir görünür karaktere dokunmuyorsa, o zaman buna gerek yoktur. kodlayan. Aksi takdirde, basitlik uğruna kodlayın.
Carl Smith

HTML5 kurallarına bir başvuru ekleyebilir misiniz?
Ferrybig

17

Bence bu daha çok "tarayıcının umurunda değilken özellikleri takip et" sorusuna dönüştü. İşte benim genel cevabım:

Standartlar "şimdiki" bir şey değildir. Onlar "gelecek" bir şeydir. Geliştiriciler olarak web standartlarını takip edersek, tarayıcı satıcılarının bu standartları doğru bir şekilde uygulama olasılığı daha yüksektir ve tamamen birlikte çalışabilir bir ağa yaklaşırız, burada CSS saldırıları, özellik algılama ve tarayıcı algılama gerekli değildir. Yerleşimlerimizin belirli bir tarayıcıda neden kırıldığını veya bu sorunu nasıl çözeceğinizi bulmamız gerekmiyor.

Özellikle, HTML5 & amp; belirli bir durumda ve bir HTML5 dokümanı kullanıyorsanız (ve ayrıca kullanıcılarınızın HTML5 uyumlu tarayıcılar kullanmasını bekliyorsanız), bunu yapmanız için bir neden yoktur.


1
Bununla birlikte, genel olarak konuşursak, "standart" yolların çoğunun hala taslak modunda olduğunu ve gelecekte değişebileceğini hatırlamanız gerekir.
refaelio

6

Eh, kullanıcı girdisinden geliyorsa, o zaman kesinlikle evet, bariz nedenlerden dolayı. Bu web sitesinin bunu yapmadığını düşünün: Bu sorunun başlığı gerçekten '&' olarak '&' olarak kodlamam gerekiyor mu?

Eğer böyle bir şey varsa, o echo '<title>Dolce & Gabbana</title>';zaman kesinlikle konuşmak zorunda değilsiniz. Daha iyi olurdu, ancak hiç kullanıcı yoksa farkı fark edeceksiniz.


5

Bize titlegerçekte ne olduğunu gösterebilir misin ? Teslim ettiğimde

<!DOCTYPE html>
<html>
<title>Dolce & Gabbana</title>
<body>
<p>am i allowed loose & mpersands?</p>
</body>
</html>

için http://validator.w3.org/ - açıkça deneysel HTML 5 modunu kullanmak için soran - bu konuda hiçbir şikayetleri vardır &s ...


1
Evet, HTML5, önceki HTML ve XHTML ayrıştırıcılarından farklı bir ayrıştırıcıya sahiptir ve belirli durumlarda çıkış işareti olmayan işaretlere izin verir.
kevinji

Bu örneklere gelince, bu HTML5'te yeni bir şey değil. Her ikisi de <title>Dolce & Gabbana</title>ve <p>Dolce & Gabbana</p>geçerli HTML 2.0.
Mathias Bynens

4

HTML'de &, bir karakter başvurusunun ya da varlık başvurusunun bir başvurusunun başlangıcını işaretler . Ayrıştırıcıdaki bu noktadan sonra ya bir #karakter başvurusunu belirten ya da bir varlık başvurusunu belirten bir varlık adı ve her ikisini de a ;. Normal davranış budur.

Referans adı ya da sadece referans açılış Ama eğer &bir boşluk veya başka sınırlayıcı izler gibi ", ', <, >, &, biten ;ve hatta bir referans bölümü düz temsil etmek &atlanabilir:

<p title="&amp;">foo &amp; bar</p>
<p title="&amp">foo &amp bar</p>
<p title="&">foo & bar</p>

Yalnızca bu durumlarda, sonlama ;veya hatta referansın kendisi atlanabilir (en azından HTML 4'te). HTML 5'in bitmesini gerektirdiğini düşünüyorum ;.

Ancak spesifikasyon&#38; , &amp;karışıklığı önlemek için her zaman karakter referansı veya varlık referansı gibi bir referans kullanılmasını önerir :

Yazarlar , bir karakter başvurusunun başlangıcını (varlık referansı açık sınırlayıcı) karıştırmamak için &amp;" &" yerine " " (ASCII ondalık 38) kullanmalıdır . &amp;CDATA özellik değerlerinde karakter referanslarına izin verildiğinden yazarlar özellik değerlerinde de " " kullanmalıdır .


1
Bağlantı verdiğiniz HTML 4 özelliği budur; (taslak) HTML 5 spesifikasyonunu okuduğumda, sadece belirsiz ve işaretleri izin verilmiyor. Örneğin, ve ardından bir boşluk izlemesi belirsiz değildir ve bu nedenle (yine benim okumamla) izin verilmelidir - HTML 5 doğrulayıcısının kabul ettiği işaretleme için cevabım bakın.
AakashM

1
@AakashM: Emin değilim, kulağa böyle geliyordu.
Gumbo

3

Kullanıcı size iletirse veya bir URL'de yayınlanırsa, bundan kaçmanız gerekir.

Sayfadaki statik metinde görünüyorsa? Tüm tarayıcılar bunu her iki şekilde de doğru şekilde yapacak, bunun için çok endişelenmeyin, çünkü çalışacak.


3

Güncelleme (Mart 2020): W3C doğrulayıcı artık kaçan URL'lerden şikayet etmiyor.

Resim URL'lerinin neden kaçışının gerektiğini kontrol ediyordum, bu yüzden https://validator.w3.org adresinde denedim . Açıklama oldukça güzel. URL'lerin bile kaçması gerektiğini vurgular. [PS: Sanırım URL'nin ihtiyacından bu yana tüketildiğinde kaçacak &. Herkes açıklayabilir mi?]

<img alt="" src="foo?bar=qut&qux=fop" />

Belgede bir varlık referansı bulundu, ancak bu adla tanımlanmış bir referans yok. Genellikle buna referans adının, kodlanmamış ve işaretlerinin yanlış yazılması veya sondaki noktalı virgül (;) bırakılması neden olur. Bu hatanın en yaygın nedeni, WDG tarafından "URL'lerde Ampersandlar" bölümünde açıklandığı gibi URL'lerin kodlanmamış ve işaretleri. Varlık referansları ve işareti (&) ile başlar ve noktalı virgül (;) ile biter. Belgenizde gerçek ve işareti kullanmak istiyorsanız bunu "&" (URL'lerin içinde bile!) Olarak kodlamanız gerekir. Varlık referanslarını noktalı virgülle sonlandırmaya dikkat edin; aksi takdirde varlık referansınız aşağıdaki metinle bağlantılı olarak yorumlanabilir. Ayrıca, adlandırılmış varlık referanslarının büyük / küçük harfe duyarlı olduğunu unutmayın; Aelig: &; ve æ farklı karakterlerdir.


1
En çok oy alan yanıtı okuyun. Öznitelikler #PCDATA'dır ve bu nedenle ayrıştırılır. Varlıklar orada ele alınır. Örnekte, &bir varlık başvurusuna başlar. Okuduktan sonra &quxayrıştırıcı son noktalı virgül ( ;) bulamaz , ancak =varlık adının bir parçası olamayacak eşittir işaretine ( ) dönüşür . Ayrıştırıcı gerçekten katı olmaya çalıştıysa (HTML 4'e göre) bu ayrıştırma hatası olmalıdır. HTML 5'te, ayrıştırma genel olarak daha rahattır.
Palec

1
Genel ;olarak (bu nedenle bağlantıyı kontrol ettiğinizde) sorgu dizeleri ayırıcı olarak kullanmak en iyisidir şüpheli .
Demi

2

Evet, mümkünse geçerli bir kod sunmaya çalışmalısınız.

Çoğu tarayıcı bu hatayı sessizce düzeltir, ancak tarayıcılarda hata işlemeye güvenmeyle ilgili bir sorun vardır. Yanlış kodun nasıl işleneceğine dair bir standart yoktur, bu nedenle her hata ile ne yapılacağını anlamaya çalışmak her tarayıcı satıcısına bağlıdır ve sonuçlar değişebilir.

Tarayıcıların farklı tepki verebileceği bazı örnekler, öğeleri bir tablonun içine ancak tablo hücrelerinin dışına koyarsanız veya bağlantıları iç içe yerleştirirseniz.

Özel örneğiniz için herhangi bir soruna neden olması muhtemel değildir, ancak tarayıcıdaki hata düzeltmesi örneğin tarayıcının standartlara uygun moddan tuhaflık moduna geçmesine neden olabilir ve bu da düzeninizin tamamen bozulmasına neden olabilir.

Bu nedenle, daha ciddi sorunları tespit edebilmeniz için hata listesini doğrulayıcıda kısa tutmak için başka bir şey olmasa da koddaki böyle hataları düzeltmelisiniz.


2

Birkaç yıl önce, web uygulamalarımızdan birinin Firefox'ta düzgün görüntülenmediğine dair bir rapor aldık. Sayfanın benzeyen bir etiket içerdiği ortaya çıktı

<div style="..." ... style="...">

Firefox tekrarlanan bir stil özniteliğiyle karşı karşıya kaldığında, her iki stili de birleştirirken, Firefox bunlardan sadece birini kullanır, dolayısıyla farklı davranış gösterir. Etiketi olarak değiştirdim

<div style="...; ..." ...>

ve eminim, sorunu çözdü! Hikayenin ahlaki özelliği, tarayıcıların geçerli HTML'yi geçersiz HTML'den daha tutarlı şekilde ele almasıdır. Yani, lanet işaretlemenizi zaten düzeltin! (Veya düzeltmek için HTML Tidy'i kullanın.)


1

eğer &kullanılan html o zaman ondan kaçmak gerekir

Eğer &bir JavaScript dizeleri örneğin kullanılır alert('This & that');ya document.href Bunu kullanmak gerekmez.

Document.write kullanıyorsanız, bunu kullanmalısınız; document.write(<p>this &amp; that</p>)



Hakkında iyi bir nokta document.write(). Ama Alex'in senaryo standlarından belgeye yazmayı yaptığı her şey imo. +1
Patrick M

1

Yakınınızda biten bir noktalı virgülün &, farklı bir şey göstermesine neden olma olasılığına bağlıdır .

Örneğin, kullanıcılardan gelen girdilerle uğraşırken (örneğin, başlık etiketlerinize bir forum gönderisinin kullanıcı tarafından sağlanan konusunu eklerseniz), rastgele noktalı virgül koyabileceklerini asla bilemezsiniz ve bu rastgele varlıkları rastgele gösterebilir. Yani bu durumda daima kaçmak.

Kendi statik html'iniz için, kesinlikle atlayabilirsiniz, ancak uygun kaçmayı dahil etmek çok önemlidir, bundan kaçınmak için iyi bir neden yoktur.


0

Eğer gerçekten statik metin bahsediyoruz

<title>Foo & Bar</title>

sabit diskteki bazı dosyalarda saklanır ve doğrudan bir sunucu tarafından sunulur, o zaman evet: muhtemelen kaçması gerekmez.

Ancak, günümüzde tamamen statik olan çok az HTML içeriği olduğundan, HTML içeriğinin başka bir kaynaktan (veritabanı içeriği, kullanıcı girişi, web hizmeti çağrı sonucu, eski API sonucu) üretildiğini varsayan aşağıdaki sorumluluk reddi beyanını ekleyeceğim. ..):

Bir basitten kaçmazsanız &, o zaman bir &amp;ya da bir &nbsp;ya <b>da <script src="http://attacker.com/evil.js">ya da başka bir geçersiz metinden de kaçmamanız ihtimali vardır . Bu, içeriğinizi en iyi şekilde yanlış görüntülediğiniz ve XSS saldırılarından şüphelenebileceğiniz anlamına gelir .

Başka bir deyişle: diğer daha sorunlu durumları zaten kontrol edip kaçarken, tamamen kırık olmayan ama yine de biraz balıktan bağımsız ve kaçmak için neredeyse hiçbir neden yoktur.


2
Ben aşağı oy vermedim, ama tahmin etmeliysem, aşağı düştüğünüzü söyleyebilirim çünkü cevabınız (akıllıken) soru ile biraz uyumsuzluk. Kaçan kullanıcı girdisini sormuyor. Karakterler üzerinde kontrolü var ve temelde "İstediğimi yaparsa, mektuba özgü dil izini takip etmek gerçekten önemli mi?" Diye soruyor. Yani, biliyor ve çünkü & koymak.
Matt

@ Matt: Anlıyorum ve bu makul olurdu. Sadece hiç kimsenin artık tamamen statik HTML sayfaları yazmadığını ve hemen hemen tüm içeriğin en azından biraz dinamik (genellikle bazı veritabanı içeriğine dayalı) olduğunu varsayıyordum. Belki de bu varsayım açıklığa kavuşturulmalıydı.
Joachim Sauer

-1

Bu herkes için yararlı olup olmadığından emin değilim ... Bir süredir bununla savaşıyordum ... İşte tüm bağlantılarınızı, javascriptinizi, içeriğinizi düzeltmek için kullanabileceğiniz muhteşem bir regex. Kimsenin düzeltmek istemediği bir ton eski içerikle uğraşmak zorunda kaldım.

Bunu kalıp sayfanızdaki veya kontrolünüzdeki İşleme geçersiz kılmanıza ekleyin:

Lütfen bunu yanlış yere koyduğum için alev almayın:

// remove the & from href="blaw?a=b&b=c" and replace with &amp; 
//in urls - this corrects any unencoded & not just those in URL's
// this match will also ignore any matches it finds within <script> blocks AND
// it will also ignore the matches where the link includes a javascript command like
// <a href="javascript:alert{'& & &'}">blaw</a>
html = Regex.Replace(html, "&(?!(?<=(?<outerquote>[\"'])javascript:(?>(?!\\k<outerquote>|[>]).)*)\\k<outerquote>?)(?!(?:[a-zA-Z][a-zA-Z0-9]*|#\\d+);)(?!(?>(?:(?!<script|\\/script>).)*)\\/script>)", "&amp;", RegexOptions.Singleline | RegexOptions.IgnoreCase);

-1

Bağlantının ne zaman ve neden kaçmak &zorunda kalacağınıza dair oldukça iyi bir örneği var&amp;

https://jsfiddle.net/vh2h7usk/1/

İlginç bir şekilde, buradaki cevabımda doğru bir şekilde temsil etmek için karakterden kaçmak zorunda kaldım. Yerleşik kod örneği seçeneğini (yanıt panelinden) kullanacak olsaydım, sadece yazabilirim &amp;ve olması gerektiği gibi görünür. Ama eğer <code></code>elemanı el ile kullanacak olsaydım, doğru bir şekilde temsil edebilmek için kaçmalıyım :)

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.