戈登的回答很好并解释了 XML 编码问题,但没有显示简单的功能(或黑盒的作用)。 Jon 的回答从 'htmlspecialchars' 功能推荐开始,但他和其他人犯了一些错误,那么我会强调。
优秀的程序员必须控制是否在您的字符串和 XML 数据中使用 UTF-8:UTF-8(或其他非 ASCII 编码)在一致的算法中是安全的。
安全的 UTF-8 XML 不需要完整的实体编码。不分青红皂白的编码产生“第二类,非人类可读,编码/解码需求,XML”。并且安全的 ASCII XML,也不需要实体编码,当你所有的内容都是 ASCII 时。
在 XML 内容的字符串中只需要转义 3 或 4 个字符:>、<、& 和可选的"。
请阅读http://www.w3.org/TR/REC-xml/“2.4 字符数据和标记”和“4.6 预定义实体”。那么你可以使用'htmlentities'
为了说明,以下 PHP 函数将使 XML 完全安全:
// it is a didactic illustration, USE htmlentities($S,flag)
function xmlsafe($s,$intoQuotes=0) {
if ($intoQuotes)
return str_replace(array('&','>','<','"'), array('&','>','<','"'), $s);
// SAME AS htmlspecialchars($s)
else
return str_replace(array('&','>','<'), array('&','>','<'), $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;
}
在 CDATA 块中你不需要使用这个函数...但是,请避免不加选择地使用 CDATA。