PHP 中格式化/转义字符串以在 XML 中使用的正确方法


Proper way in PHP to format/escape a string for use in XML

我有许多字段,由用户在表单上填写,然后通过 SOAP 发送到 Web 服务。 当我构建 XML 以传递用户条目时,它通常可以正常工作。 但是,在API失败的几种情况下,我遇到了问题,我知道它与用户输入的字符有关。

是否有正确的方法可以转义通过XML发送的字符串? 我读过很多关于使用 htmlspecialchars() 的帖子,然后很多人说这是不好的做法。 我最近也意识到我可能应该将编码更改为 UTF-8?

敢肯定,我可能会为这篇文章投下票,因为我承认我在 XML 方面没有太多专业知识。 在这里寻找最佳实践,以便我对此 API 的调用尽可能可靠,并真诚地感谢任何指导。

下面是 XML 代码段:

//BUILD FIELD DATA
$xmlStr = "<?xml version='"1.0'" encoding='"us-ascii'"?>
<record>
<field Name='"dateCreated'" Text='"".$DATE_CREATE."'" />
<field Name='"purpose'" Text='"".$PURPOSE."'" />
<field Name='"comments'" Text='"".$COMMENTS."'" />
<field Name='"terms'" Text='"".$TERMS."'" />
</record>";

我建议您考虑使用XMLWriter函数来构建XML文档。这个关于XMLWriter的PHP手册页在用户贡献的注释部分有一个很好的简单用法示例:http://php.net/manual/en/function.xmlwriter-open-memory.php。如果我没记错的话,XMLWriter 函数将为您转义一些字符。

您还可以考虑使用 CDATA 标记包装 XML 元素的内容,如下所示:

<field Name="purpose"><![CDATA[ Here's < some " crazy !/> characters! ]]></field>

这基本上告诉XML不要解析CDATA标签中的任何内容

您还应该清理您接受的任何用户输入,以确保避免坏人的恶意行为。我建议研究filter_var.它不是防弹的,但它肯定会有所帮助。我在我的一些代码中使用以下代码来清理我的 PHP 脚本的输入:

function cleanInput($input){
    if(gettype($input) == 'array'){
        foreach($input as $key => &$val){
            $key = cleanInput($key);
            $val = cleanInput($val);
        }
    }else{
        $input = filter_var(trim($input), FILTER_SANITIZE_SPECIAL_CHARS);
    }
    return $input;
}
$_POST = array_map("cleanInput", $_POST);
$_GET = array_map("cleanInput", $_GET);

希望对您入门有所帮助。