我有许多字段由用户在表单上完成,然后通过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>";
答案 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);
希望能帮助您入门。