在jQuery html()中防止XSS

我使用ajax从数据库接收数据,然后使用.html()jQuery函数将其与HTML代码一起添加到网站,如下所示:

$.ajax({ url: "getDatabaseData.php", type: "post", dataType: "json", success: function(response){ $("#message-div").html(getMessagesHtml(response)); } }); function getMessagesHtml(messages){ var result = ""; for(var i = 0; i < messages.length; i++){ result += "
" + "

Name: " + messages[i].name + "

" + "

Message: " + messages[i].message + "

" + "
"; } return result; }

以下是getDatabaseData.php,它从数据库获取并返回数据:

 $messages = $CFG_DB->select("SELECT name, message FROM messages"); echo json_encode($messages); 

想象一下,例如,如果消息包含以下文本:

 XSS Attack code goes here 

我的问题是:

  1. 这样做会不会出现XSS问题?
  2. 如果有问题,我该如何预防呢?

我想在这种情况下使用text()而不是html()不是一个选项,因为我还添加了html代码。

没有javascript,当使用PHP打印数据时,我只是对从数据库接收的变量使用htmlentities来阻止XSS,例如htmlentities(messages [i] .name)和htmlentities(messages [i] .message)。 但我没有看到任何类似的JavaScript。

使用用户输入设置文本是最安全的方法。 而不是创建html字符串,而是创建元素

就像是:

 function getMessagesHtml(messages){ return messages.map(function(o){ var $div = $('
'); $div.append($('

', {text: "Name: " + o.name})); $div.append($('

', {text: "Message: " + o.message})); return $div; }); }


根据注释,另一种方法是创建一个清理辅助函数,该函数创建一个元素,将输入字符串作为文本传递给元素并返回该文本

 function text(str){ return $('
',{text:str}).text(); }