在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
我的问题是:
- 这样做会不会出现XSS问题?
- 如果有问题,我该如何预防呢?
我想在这种情况下使用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(); }