PHP - xml-güvenli değerler oluşturmak için) yeterli (htmlentities mi?

4 Cevap php

Ben sıfırdan bir XML dosyası oluşturma ve htmlentities () Her potansiyel bir XML dosyası kırabilir karakteri (ve muhtemelen UTF-8 veri) dönüştürür olmadığını bilmek gerekir ediyorum? Değerler twitter / flickr yem olacak, bu yüzden emin olmak gerekir!

4 Cevap

Yasal XML oluşturmak için htmlentities() is not garantili bir yoldur.

Bu endişe ise, tüm htmlspecialchars() instead of htmlentities() kullanın. Eğer veri temsili ve XML belgesinin kodlama arasındaki kodlama uyumsuzlukları varsa, htmlentities() (bunu yaparken XML boyutunu kabartmak olacak) onları örtbas / geçici bir çözüm için hizmet edebilir. Ben sizin kodlamaları tutarlı olsun ve sadece htmlspecialchars() kullanmak daha iyidir inanıyorum.

Ayrıca, htmlspecialchars() tek tırnak ile ayrılmış XML öznitelikleri içindeki dönüş değerini pompa eğer, siz de ENT_QUOTES bayrağı geçmek gerekir unutmayın böylece herhangi tek tırnak kaynak dize düzgün de kodlanmıştır. Gelecekte XML öznitelikleri için tek tırnak kullanarak birinden kaynaklanan hatalar için kod bağışıklık yapar gibi, zaten bunu yapıyor öneririz.

Edit: netleştirmek için:

htmlentities() (sadece ANSI karakterler ile temsil edilir) varlıklara (Ben bu UTF-8 verilerle ne demek olduğunu varsayıyorum) ANSI olmayan karakter bir dizi dönüştürmek olacaktır. Ancak, karşılık gelen bir varlık yok, herhangi bir karakter için bunu yapamazsınız, ve böylece onun dönüş değeri yalnızca ANSI karakterlerden oluşuyor garanti edemez. Bunu kullanmak değil düşündüren 'm bu yüzden.

Kodlama olası bir sorun ise, (iconv() gibi) açıkça anlaştım.

Edit 2: hesap Josh Davis'in comment belowis alarak Geliştirilmiş cevap.

Gordon cevabı iyi ve XML kodlamak sorunları açıklamak, ancak basit bir fonksiyon (ya da ne yapmak blackbox) göstermez. Jon'un cevabı 'htmlspecialchars'dan' işlevi recomendation ile iyi başlayan, ancak o ve diğerleri bazı hata yapmak, o zaman ben empatik olacaktır.

Dizeleri ve XML veri iyi bir programcı MUST have control about use or not of UTF-8: UTF-8 (veya başka bir ASCII olmayan kodlamak) tutarlı bir algoritma GÜVENLİ IS.

SAFE UTF-8 XML NOT NEED FULL-ENTITY ENCODE. Gelişigüzel kodlar üretmek "ikinci sınıf insan olmayan-readble, kodlama / kod çözme-talep, XML". Tüm içerik ASCII olduğunda ve güvenli ASCII XML, ayrıca, varlık kodlamak gerek.

Only 3 or 4 characters need to be escaped in a string of XML content: >, <, &, and optional ". Please read http://www.w3.org/TR/REC-xml/ "2.4 Character Data and Markup" and "4.6 Predefined Entities". THEN YOU can use 'htmlentities'

Örnek için, aşağıdaki PHP işlevi XML tamamen güvenli hale getirecek:

// it is a didactic illustration, USE htmlentities($S,flag)
function xmlsafe($s,$intoQuotes=0) {
if ($intoQuotes)
    return str_replace(array('&','>','<','"'), array('&amp;','&gt;','&lt;','&quot;'), $s);
    // SAME AS htmlspecialchars($s)
else
    return str_replace(array('&','>','<'), array('&amp;','&gt;','&lt;'), $s);
    // SAME AS htmlspecialchars($s,ENT_NOQUOTES)
}

// example of SAFE XML CONSTRUCTION
function xmlTag( $element, $attribs, $contents = NULL) {
$out = '<' . $element;
foreach( $attribs as $name => $val )
   $out .= ' '.$name.'="'. xmlsafe( $val,1 ) .'"';
if ( $contents==='' || is_null($contents) )
    $out .= '/>';
else
    $out .= '>'.xmlsafe( $contents )."</$element>";
return $out;
}

Bir CDATA bloğunda, CDATA gelişigüzel kullanımını önlemek lütfen, bu işlevi kullanmak gerek ... Ama yok.

Yani soru "() 'ler sonucu XML uyumlu ve UTF-8 uyumlu olmasını garanti htmlentities nedir?" Olduğunu Cevap hayır, öyle değil değildir.

htmlspecialchars () should XML'in özel karakterler kaçış için yeterli olabilir ancak UTF-8 dizeleri iki şekilde sterilize etmek gerekir. Eğer XML SimpleXML, diyelim ki, inşa bile, dizeleri sterilize gerekecek. Böyle XMLWriter veya DOM gibi diğer kitaplıkları hakkında, ben aynı olduğunu düşünüyorum bilmiyorum.