使用 simplexml 提高安全性

Improve security with simplexml

我有一个 xml 文档,使用简单的xml 我可以轻松解析成我想要的内容。

我的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 简单xml 解析器

$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>';
    }
}

我的问题是:这安全吗?我怎样才能提高安全性? 提前致谢。

不是。但是,您源代码中的问题与 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)转义你.