2009-12-12 44 views
0

此代码在IE以外的浏览器上正常工作。IE给出嵌入在PHP中的XML代码错误

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 ...

+0

展我们整个页面 – Lazarus 2009-12-12 15:15:21

回答

4

应该

<![CDATA 

<! [CDATA 

它找到 '>' 末端有,不喜欢它。

您还需要改变一切““”,‘<’和‘>’你的PHP代码片段里面HTML实体 你应该这样来做:

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

而且找回来了像这样:

htmlspecialchars_decode($string) 
+0

更改为<![CDATA但仍不能正常工作。我需要删除> – RKh 2009-12-12 15:11:44

+0

看看我的编辑。您还需要避开输入。 – 2009-12-12 15:39:33

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

XML注入,如果公司可以包含<&使用htmlspecialchars()编码任何文Y。 ou追加到标记中。 (它的工作原理也同样适用于XML作为HTML。htmlentities,而另一方面,也不会。)在CDATA节

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

流浪空间,它应该是<![CDATA[ ... ]]>。请注意,]]>在文本内容中是无效的。

无论哪种方式,CDATA部分并没有真正帮助你。它并不免除你逃避输出的责任:值中的字符串]]>仍然会打破良构。 CDATA部分对手工编写方便而言是一种破解,通常不是机器生成的XML中的东西。

既然你要做一些无论如何逃脱这种情况下,你最好忘掉CDATA,只是做了正常的方式:

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

(或者预先定义的函数使用短名称像h()为你做echo htmlspecialchars,避免这么多打字)

(注:。avoid using bare-word array indices它是模糊的,在未来可能会失败,并会生成通知)