使用simplexml提高安全性

时间:2018-03-18 11:27:36

标签: php xml security simplexml

我有一个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>';
    }
}

我的问题是:这是安全的吗?我该如何提高安全性? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

不是。但是,源中的问题与SimpleXML无关。您从外部数据源(XML文件)输出字符串值作为HTML源。这允许称为HTML注入的东西。它可以打破你的输出或让它被操纵,而无需用户实际注意到。

以下是基于您的来源的小例子:

$xmlString = <<<'XML'
<noticias>
    <noticia url="noticia-1">
        <titulo>título da &lt;i>notícia&lt;/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)。