尝试将htmlentities / htmlspecialchars与ajax调用一起使用,当远程输出呈现回原始脚本时,它不会转换为html标记。
我已经搜遍了一个解决方案,但找不到一个,所以我在这里。
所有这些都运行良好而且不应用htmlentities,但我对XSS进行了扫描,并将其作为潜在问题提出。
以下是远程php文件中代码的相关部分:
<select class = "hook1" id = "<?php echo $version ; ?>" name="vdiesel" >
<option>Version essence</option>
<?php
while ($r= $stmt->fetch(PDO::FETCH_ASSOC)) {
$out="<option value='".$r['version_id'].'|'.$r['vid_diesel']."'>".$r['version']."</option>";
//echo $out;
echo htmlentities($out, ENT_QUOTES, 'UTF-8');
}
echo "</select>";
相关的? ajax调用的一部分:
$.ajax({
type: "POST",
dataType:"html",
url: url,
beforeSend: function () {
$("#"+ selbot).html("<option>Loading ...</option>");
},
data: {passval:pass_id, pass2:selbot},
success: function(data){
$("#"+ selbot).html(data);
}
});
这是Firebug控制台响应的示例:
<select class = "hook1" id = "version9" name="vdiesel" >
<option>Version essence</option>
<option value='685|686'>Pop Star Essence</option>
</select>
</body>
</html>
上面的内容正确地打印到html上,除了用htmlentities清理的行,它打印出来如下,显然是正确的但没有识别html标签:
<option value='685/686'>Pop Star Essence</option>
我当然错过了一些基本的东西,希望你能告诉我。 感谢
答案 0 :(得分:2)
你的编码太多了。
您应该只编码从数据库中获取的值,以便它们不会破坏html(并且不会造成XSS风险......):
$out="<option value='".htmlentities($r['version_id'], ENT_QUOTES, 'UTF-8')
.'|'.htmlentities($r['vid_diesel'], ENT_QUOTES, 'UTF-8')."'>"
.htmlentities($r['version'], ENT_QUOTES, 'UTF-8')."</option>";
答案 1 :(得分:1)
您在错误的地方使用htmlentities()
。它应仅用于应按字面显示的数据部分,而不是HTML容器。
while ($r= $stmt->fetch(PDO::FETCH_ASSOC)) {
$out="<option value='" . htmlentities($r['version_id'], ENT_QUOTES, 'UTF-8') . '|' . htmlentities($r['vid_diesel'], ENT_QUOTES, 'UTF-8') . "'>". htmlentities($r['version'], ENT_QUOTES, 'UTF-8') . "</option>";
echo $out;
}