Yanıtlar:
Yorum ayrıcalıklarına sahip değilim, yoksa daha önceki bir cevaba yorum olarak bırakmış olurdum.
YAPMAYIN, tekrar ediyorum, HTML kullanarak kesme işareti bırakmayın
'
Bu geçerli bir HTML karakter varlığı referansı değil. Bir XML karakter varlık referansıdır. Firefox ve Chrome, en azından yukarıdakileri bir HTML belgesinde kesme işareti olarak gösterse de, Internet Explorer bunu yapmaz. Ve bunu yapmayı reddettiği zaman standardı takip ediyor.
Bir kesme işareti kullanarak, HTML kullanarak
'
Ancak, genel olarak gerekli olduğuna inanmıyorum.
http://fishbowl.pastiche.org/2003/07/01/the_curse_of_apos/
http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
Nate ile aynı fikirde değilim. İdeal olarak, mümkün olduğunca az kaçış kullanmalı ve karakterleri doğal olarak ifade etmek için UTF-8 kullanmalısınız. Bunu yapmak için UTF-8'i idare edebilecek bir editöre ve ayrıca aşağıdaki gibi doğru bir karakter kümesi beyanına ihtiyacınız var:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Ancak, (X) HTML'de özel bir anlamı olan karakterlerden kaçmayı alışkanlık haline getirmelisiniz, yani:
< <
> >
" "
& &
' '
Bu, bu karakterleri yazmak istediğinizde yanlışlıkla işaretleme yazmadığınızdan emin olmanızı sağlar. Bu, güvenliği korumak için kullanıcı girişi için özellikle önemlidir. Daha az açık, ama kaçmak gerçekten önemli "
. Bir dize, bir HTML özniteliğinde ( title="something"
vb.) Sona ererse , kullanıcı özniteliği sonlandırabilir ve kendi işaretlemesini ekleyebilir. Kullanıcı girerse " onclick="alert('hello');
ve bunu eklediyseniz ne olacağını hayal edin .title="..."
PHP kullanıyorsanız, bunu htmlspecialchars
yapmak için işlevi kullanabilirsiniz . Diğer dillerin başka benzer işlevleri olabilir.
Güncelleme: Ben apos konusunda düzeltilmiş duruyorum. Kahretsin sinir bozucu IE.
'
değil '
. Herhangi bir nedenden ötürü, sizin gibi bir HTML niteliği için tek tırnaklar kullanıyorsanız title='something'
, bu değerin içindeki herhangi bir alıntıdan açıkça çıkmanız gerekir.
Kullanım durumunuza bağlıdır, ancak '
genel olarak doğal dilde kullanmaktan vazgeçmemiz gerekir , bu nedenle XML'inizde bilgisayar kodunuz yoksa sorun ortaya çıkmamalıdır.
Dizelerin çevrildiği yerlerde, bazı çevirmenlerin kapanış tırnaklarını unicode kıvırcık tırnaklarıyla değiştirdiğini, ancak düz tırnakları açılış alıntıları olarak bırakarak görsel olarak dengesiz ve profesyonelce görünmelerini önlüyoruz.
Unicode karakterleri ‘
ve ’
değiştirmeniz gerekir '
mümkünse kadar, “
ve ”
değiştirmelisiniz "
. Bu yararlıdır çünkü bilgisayarlar noktalama işaretlerini özel olarak algılamaz. (Stack Overflow / Chrome'un ' don’t
' yazım hatası olduğunu, oysa ' ' olduğunu düşündüğümü görmek beni eğlendirse de don't
.)
Klavyede çok cazip '
ve "
karakterlere sahip olmamıza yardımcı olmuyor .
Öyleyse, StackExchange'in kendisinin bir HTML varlık kullanarak bir kesme işareti kodlayıp kodlamadığını görelim.
İşte bu sayfanın kaynak kodundan bazı örnekler.
(1) Soru başlığı: Kodlanmış.
Should I escape the Apostrophe ( ' ) character with its HTML entity (&#39;)?
(2) drew'in cevabı: Kodlanmadı.
But I don't believe it is, in general, necessary.
(3) Tom'un nitro2k01'in cevabı üzerine yorumu: Kodlanmış.
I've got two contradicting answers now. One recommends escaping ' and the other does not. What should I believe?
Bu yüzden iki tarafa da gider.
Ancak, bu sayfanın kaynak kodu hiçbir zaman kullanmaz '
. Tüm kodlamalar biçimindedir '
. Bu nitro2k01 ile uyumludur ve kullanmamaya yönelik tavsiyede bulunur '
.
Cevabınız içeriğe bağlıdır:
Bu verilerle HTML’de bir paragraf yazıyorsanız, <,> ve & 'dan kaçmanız yeterli olabilir:
<p>{string}</p>
Bir HTML özniteliğine yazıyorsanız, ancak
<a href='/some/path/{string}'>...</a>
O zaman apostrophe'den kesinlikle kaçmalısın. Bir saldırgan bunu için koyarsa bu bir saldırı vektörü olabilir string
:
string = "' onmouseover='alert(\"nasty script here!\")' data-ignore='"
Aynı şey çift tırnak için de geçerli. Hatta backtick `in savunmasız olduğunu bile okudum, çünkü bu HTML özelliklerinde de kullanılabiliyordu. Dağıtım rutinlerinizin bir parçası olarak otomatik bir HTML sözdizimi kontrol komut dosyası yoksa, bu üçten birinin kullanılabileceğini ve HTML öznitelikleri için kaçılması gerektiğini varsayalım.
En uç noktalarda bile, alıntılanmamış nitelikler bile geçerlidir, bu nedenle boşluk karakterinin de kaçması gerekir. Ve !
, @
, $
, %
, (
, )
, =
, +
, {
, }
, [
, ve ]
, her biri bir özelliğin patlak ve yenisini ekleyerek izin verebilir.
JavaScript'te kaçış yapmak için, JQuery's'i kullanıyorum $(element).text(string)
veya $(element).attr(attrname, string)
kaçanları benim için yapıyorum. HTML'inizden kaçmayan $(element).html(unsafe)
, çok dikkatli olun !
Sunucu tarafı kodunda her durum için riski dikkatlice değerlendirmek ve belgeleri dikkatlice okumak zorundayım. Bu, Rails, Django, raw PHP, Drupal, vs. gibi kullandığınız belirli dil ve kütüphanelere bağlı olacaktır.
Sorunu mümkün olduğunca erken durdurmayı düşünüyorsanız, veritabanınıza girmeden önce atlarınızı tutun. DB'nizde depolanan metnin HTML'den kaçması, sizi cehennem gezintisine çıkarabilir. Daha sonra belirli HTML etiketlerine izin vermek, ancak italik, kalın, renkler ve tablolar gibi diğerlerine izin vermek istemezseniz ne olur? Ne ilk geçişte şey kaçırmış, ancak escaper zaten kaçmış sanki &
olarak &
ve "
sıra "
? O dönüştürmeniz Will &amp;
ve &quot;
?
Benim yaklaşımım sadece veritabanı için SQL'den kaçış yapmak, fakat daha sonra işlenmek üzere tüm HTML özel karakterlerini içeride bırakmak. Bu şekilde, HTML çıkışlarımdan kolayca hata ayıklayabilir ve ince ayar yapabilirim. Ayrıca, kullanıcı tarafından sağlanan dizeleri varsa kendi SQL tablolarıma güvenemeyeceğim anlamına gelir.
Kullanıcı tarafından kontrol edilen girdilere asla güvenmeyin ve her zaman HTML niteliklerinizi alıntılayın!
Dayalı: HTML'den kaçan, Ryan Grove'dan &, <,> ve "den daha fazlası var
Kesme işareti içeriğinize aitse, kaçın. Kodla karıştırılabilecek diğer tüm içerik karakterleri, ondan kurtulun.
Asıl varlığı kullanmadan işi yapmanın en kolay yolu PHP htmlentities()
veya htmlspecialchars()
işlevleri kullanmaktır:
$val = htmlspecialchars("Don't", ENT_QUOTES, 'UTF-8');
if($_POST){
$val = htmlspecialchars(trim($_POST['val']), ENT_QUOTES, 'UTF-8');
}
echo "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en' class='njs'>
<head>
<meta http-equiv='Content-type' content='text/html;charset=utf-8' />
<title>Special Characters</title>
<style type='text/css'>
@import 'special.css';
</style>
</head>
<body>
<form method='post' action='' id='fm' name='fm'>
<input type='text' value='$val' name='val' id='val' />
<input type='submit' value='submit' name='sub' id='sub' />
</form>
</body>
<script type='text/javascript' src='special.js'></script>
</html>";
&apos
artık HTML5 için geçerli. Eski tarayıcıları desteklemeniz veya Outlook için HTML e-posta yazmanız'
gerekiyorsa, karakterden kaçmak için gerekli olduğunu düşünüyorsanız en iyi şekilde yapışmanız söylenir .