我有一个xml文档和simplexml,我可以很容易地解析成我想要的内容。
我的Xml:
<?xml version="1.0" encoding="UTF-8"?>
<noticias>
<noticia url="noticia-1">
<titulo>título da notícia 1</titulo>
<desc>some description</desc>
<texto>some text here</texto>
<img>filename here</img>
<in>some reference to where it came from</in>
</noticia>
...
</noticias>
PHP simplexml解析器
$file = 'xml/noticias.xml';
if(file_exists($file)) {
$xml = simplexml_load_file($file);
foreach($xml as $item) {
$url = $item['url'];
$titulo = $item->titulo;
...
echo '<div><h2>'.$titulo.'</h2></div>';
}
}
我的问题是:这是安全的吗?我该如何提高安全性? 提前谢谢。
答案 0 :(得分:1)
不是。但是,源中的问题与SimpleXML无关。您从外部数据源(XML文件)输出字符串值作为HTML源。这允许称为HTML注入的东西。它可以打破你的输出或让它被操纵,而无需用户实际注意到。
以下是基于您的来源的小例子:
$xmlString = <<<'XML'
<noticias>
<noticia url="noticia-1">
<titulo>título da <i>notícia</i> 1</titulo>
</noticia>
</noticias>
XML;
$xml = simplexml_load_string($xmlString);
foreach($xml->noticia as $item) {
$titulo = $item->titulo;
echo '<div><h2>'.$titulo.'</h2></div>';
}
输出:
<div><h2>título da <i>notícia</i> 1</h2></div>
i
元素是XML中的文本内容,但输出中是HTML源。标题的一部分将在浏览器中呈现斜体。对于HTML注入来说,这是一个无害的例子,但想象一个意图不太好的人。
如果您输出任何值到HTML,请确保使用htmlspecialchars()
转义特殊字符或使用为您进行转义的API(如DOM)。