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

时间:2014-12-09 19:28:47

标签: php xml encoding

我有许多字段由用户在表单上完成,然后通过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>";

1 个答案:

答案 0 :(得分:0)

我建议你研究使用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);

希望能帮助您入门。