htmlentities,htmlspecialchars和ajax问题

时间:2014-04-16 17:56:28

标签: php ajax

尝试将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>
&lt;option value=&#039;685|686&#039;&gt;Pop Star Essence&lt;/option&gt;
</select>
</body>
</html>

上面的内容正确地打印到html上,除了用htmlentities清理的行,它打印出来如下,显然是正确的但没有识别html标签:

<option value='685/686'>Pop Star Essence</option>

我当然错过了一些基本的东西,希望你能告诉我。 感谢

2 个答案:

答案 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;
}