IE在嵌入PHP的XML代码上出错

时间:2009-12-12 15:03:57

标签: xml php

此代码适用于IE以外的浏览器。

echo "
<item>
<link>http://www.example.com/showrssdetails.php?id=".$row[recordid]."</link>
<guid isPermaLink=\"true\">http://www.example.com/showrssdetails.php.php?id=".$row[recordid]."</guid>
<title>".$row[company]."</title>
<description><! [CDATA[".$row[desiredcandidate]."]]></description>
<comments>http://www.example.com/showrssdetails.php.php?id=".$row[recordid]."#Comments</comments>
</item>";

IE在第6行给出错误:

在文字内容中找到了无效字符。处理资源“http://example.com/job_listing_rssxml.php时出错...

2 个答案:

答案 0 :(得分:4)

应该是

<![CDATA

不是

<! [CDATA

找到'&gt;'在那里结束并且不喜欢它。

您还需要更改所有''','&lt;'和'&gt;'在你的PHP代码片段内部到html实体。 你应该这样做:

...
<![CDATA[".htmlspecialchars($row['desiredcandidate'])."]]>
...

然后像这样把它拿回来:

htmlspecialchars_decode($string)

答案 1 :(得分:2)

<title>".$row[company]."</title>

如果公司可以包含<&,则注入XML。使用htmlspecialchars()对您附加到标记中的任何文本进行编码。 (它对于XML和HTML一样有效。htmlentities,另一方面,不会。)

<description><! [CDATA[".$row[desiredcandidate]."]]></description>

CDATA部分中的杂散空间,应为<![CDATA[ ... ]]>。请注意,]]>在文本内容中无效。

无论哪种方式,CDATA部分都没有真正帮助你。它并不能免除您逃避输出的责任:值中的字符串]]>仍会破坏格式良好。 CDATA部分是手工创作方便的黑客攻击,通常不会放在机器生成的XML中。

鉴于你必须在这种情况下进行一些转义,你最好忘记CDATA并且只是按照正常方式进行:

<description><?php echo htmlspecialchars($row['desiredcandidate']); ?></description>

(或预定义一个名称为h()的函数为echo htmlspecialchars做{{1}},以避免这么多打字。)

(注意:avoid using bare-word array indices。它含糊不清,将来可能会失败,并会生成通知。)