此代码适用于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时出错...
答案 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。它含糊不清,将来可能会失败,并会生成通知。)