HTML özellikleri içindeki tırnak işaretlerinden nasıl düzgün bir şekilde kaçabilirim?


267

Değer dizesi bir teklif içerdiğinde kırılıyor bir web sayfasında bir açılan var.

Değer "asd, ancak DOM'de her zaman boş bir dize olarak görünür.

Dize düzgün kaçmak için bildiğim her şekilde denedim, ama boşuna.

<option value=""asd">test</option>
<option value="\"asd">test</option>
<option value="&quot;asd">test</option>
<option value="&#34;asd">test</option>

Geri gönderme iletisinin doğru değeri içermesi için bunu sayfada nasıl oluşturabilirim?


Sayfayı nasıl üretiyorsunuz?
SLaks

1
Tek tırnak kullanırsanız ne olur? <option value = '"asd'> test </option>
Wim ten Brink

5
Ben bu cevapların hiçbiri html öznitelikleri içinde kullanmak için dizeleri düzgün kaçmak söylemek nasıl belirtmek zorunda
reconbot

4
@reconbot Bu, HTML'nin nasıl oluşturulduğuna bağlıdır. Soru alıntılarla ilgiliydi, bu yüzden teknik olarak kabul edilen cevap sorulan soruya cevap veriyor. Dizeleri düzgün bir şekilde kaçmakla ilgili olarak, genel durum için kullanışlı bir bağlantım yok, ancak PHP'de kullanacaksınız htmlentities.
Matt Browne

Yanıtlar:


343

&quot; doğru yol, testlerinizin üçüncüsü:

<option value="&quot;asd">test</option>

Bu çalışmayı aşağıda veya jsFiddle'da görebilirsiniz .

alert($("option")[0].value);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select>
  <option value="&quot;asd">Test</option>
</select>

Alternatif olarak, öznitelik değerini tek tırnak işaretleri ile sınırlayabilirsiniz:

<option value='"asd'>test</option>

17
OP'nin dördüncü seçeneği olan & # 34; tırnaklardan kaçmanın geçerli bir yoludur. Sayısal varlıklar üzerinde sayısal html varlıkları kullanmanın bir faydası vardır; adlandırılmış varlıklar tüm karakterleri kapsamazken sayısal varlıklar da kapsamaktadır. HTML4 listesinin tamamı w3.org/TR/html4/sgml/entities.html adresindedir .
atk

38
@atk: yes, &quot;ile aynı karakterle eşleşir &#34;, ancak burada &quot;tanımlanmış bir varlık olduğu için sayısal seçeneği kullanmanın bir yararı yoktur . &quot;hatırlaması daha kolaydır.
Andy E

6
Katılıyorum. Bu özel durumda, kullanımı daha kolaydır & quot; Sadece genel durumu belirtmek istedim.
atk

4
@SIDU: için değiştirecektirler &amp;quot;a(replace &ile &amp;)
Andy E

4
^ sonsuz döngü
Omar Meky

16

PHP kullanıyorsanız, aramayı htmlentitiesveya htmlspecialcharsişlevi deneyin .


2
sadece bunları kullanmak yeterli olmayabilir, deneyin <option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='"); ?>' />- ENT_QUOTES ile kullandığınızdan emin olun, bu güvenli:, <option value='<?php echo htmlentities("' onmouseover='alert(123);' foo='", ENT_QUOTES); ?>' /> ancak ENT_QUOTES'e ek olarak ENT_SUBSTITUTE ve ENT_DISALLOWED'i de eklemelisiniz, kişisel olarak bu sarmalayıcıyı yıllardır kullandım:function hhb_tohtml(string $str):string { return htmlentities($str, ENT_QUOTES | ENT_HTML401 | ENT_SUBSTITUTE | ENT_DISALLOWED, 'UTF-8', true); }
hanshenrik

12

Başına HTML yazım ve hatta HTML5 , şu tüm geçerli seçenekler şunlardır:

<option value="&quot;asd">test</option>
<option value="&#34;asd">test</option>
<option value='"asd'>test</option>
<option value='&quot;asd'>test</option>
<option value='&#34;asd'>test</option>
<option value=&quot;asd>test</option>
<option value=&#34;asd>test</option>

XML sözdizimi kullanıyorsanız , tırnak işaretleri (tek veya çift) gereklidir.

İşte yukarıdaki tüm çalışma gösteren bir jsfiddle .


7

Başka bir seçenek, ne olursa olsun sakıncası yoksa çift tırnakları tek tırnaklarla değiştirmek. Ama bundan bahsetmiyorum:

<option value='"asd'>test</option>

Bundan bahsediyorum:

<option value="'asd">test</option>

Benim durumumda bu çözümü kullandım.


9
Ancak değer tek ve çift tırnak işareti içeriyorsa, bu başarısız olur
Raptor

@Raptor Değer çift tırnak içeriyorsa, bunları tek tırnaklara dönüştürdüm dedim. Değer tek tırnak işareti içeriyorsa, sorun olmaz.
csonuryilmaz


0

Gerçekten yalnızca güvenilmeyen verilerin iyi niteliklerin bir beyaz listesine girmesine izin vermelisiniz: hizalama, alink, alt, bgcolor, sınır, hücre dolgu, hücre aralığı, sınıf, renk, sütunlar, colspan, koordinatlar, dir, yüz, yükseklik, hspace, ismap, lang marginheight, marginwidth, çoklu, nohref, noresize, noshade, nowrap, ref, rel, rev, satırlar, satır aralığı, kaydırma, şekil, span, özet, tabindex, başlık, usemap, valign, değer, vlink, vspace, genişlik

Güvenilmeyen verileri javascript işleyicilerinin yanı sıra kimlik veya ad özniteliklerinin dışında tutmak istersiniz (DOM'daki diğer öğeleri gizleyebilirler).

Ayrıca, güvenilmeyen verileri bir SRC veya HREF özniteliğine koyuyorsanız, URL'yi doğrulamanız için gerçekte güvenilmeyen bir URL'dir;

Burada tüm ayrıntılar için: https://www.owasp.org/index.php/Abridged_XSS_Prevention_Cheat_Sheet


3
Bunun geç olduğunu biliyorum, ancak neredeyse tüm bu özellikler HTML4.01'de kullanımdan kaldırıldı ve 5'de kaldırıldı.
trysis

1
Soru, içinde güvenilmeyen veriler değil, içinde tırnak işareti bulunan veriler hakkında soru sormaktır.
Quentin

-3

Bir giriş metninin değerinde tırnaklardan kaçmanın bir yolu yoktur ... ancak javascript (veya jquery) kullanabilirsiniz:

<input type="input" name="myinput" id="myinput" value="" />
<script>document.getElementById("myinput").value="This input has a [\"]";</script>

1
"Bir giriş metninin değerinde tırnaklardan kaçmanın bir yolu yok" ifadeniz basit bir şekilde yanlıştır. 276 oy alan 2010 tarihli kabul edilen cevaba bakınız.
Quentin

Bana Quentin'i kabul et, ama CEVAP bunu yapmanın bir yolu olmadığını söylüyor. Bir html kodlu çift tırnak ekleyebileceğinizi veya çift tırnak işaretini sınırlamak için basit tırnak işareti kullanabileceğinizi söylüyor, ancak çift tırnak ile tanımlanan değere çift tırnak eklemenin bir yolu yok. İmkansız bir şeye alternatif sunuyor, ki benim yaptığımla aynı
Miguel

Bir çift tırnak ile sınırlanmış bir değere bir çift tırnak eklemenin yolu, az önce söylediğin gibi html kodlaması kullanmaktır .
Quentin

(Merhaba Quentin ... çevrimiçiyiz) Sadece bu dizenin değerinin çift tırnak olmadığını, bir "quot" olduğunu söylüyorum.
Miguel

2
Bir & quot; bir değerde gönderirseniz, sunucuda 6 karakter alırsınız, & işaretinden; işaretine. Çift fiyat teklifi almazsınız. Aynı değil ve benim için çalışmıyor
Miguel
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.