如何安全地使用XSS编码通过javascript将AJAX注入DOM的来自PHP的不可信数据?

如何安全地使用XSS编码通过javascript将AJAX注入DOM的来自PHP的不可信数据?,javascript,php,json,ajax,xss,Javascript,Php,Json,Ajax,Xss,我对XSS预防非常有信心,因为我们的站点上有一个较旧的设置。。。我们使用OWASP的XSS缓解功能从数据库中删除用户提供的数据(我们通过准备好的语句直接向数据库中注入值,直到输出时才进行编码),并通过(简化为可读性)打印数据: show.php show.php 我应该在retrieve.php脚本中保留xssafe()包装函数,然后进行json_编码,然后通过Javascript注入这些值吗?或者我们的新设置安全吗?还是有更好的方法?谢谢。你所做的看起来很安全 createTextNode在页

我对XSS预防非常有信心,因为我们的站点上有一个较旧的设置。。。我们使用OWASP的XSS缓解功能从数据库中删除用户提供的数据(我们通过准备好的语句直接向数据库中注入值,直到输出时才进行编码),并通过(简化为可读性)打印数据:

show.php show.php
我应该在retrieve.php脚本中保留xssafe()包装函数,然后进行json_编码,然后通过Javascript注入这些值吗?或者我们的新设置安全吗?还是有更好的方法?谢谢。

你所做的看起来很安全

createTextNode
在页面上创建一个文本节点-JavaScript将在内部为您处理编码

setAttribute
将在页面上设置一个属性-此处也适用,该参数被视为强类型值,不可能使用恶意代码逃逸

我应该在retrieve.php中保留xssafe()包装函数吗 脚本,然后json_编码


因此,不。

您仍然需要对不受信任的值(例如htmlencode)进行编码。Json编码不关心XSS。@CharlotteDunois好的,谢谢。我们是在json_编码之前从PHP端进行html编码,还是在ajax数据结束后以某种方式使用javascript进行html编码?如果是后者,JS中是否有函数可以安全地编码数据以注入HTML。我似乎找不到内置函数,我见过的最接近的函数是Reform.js或jqencode,但它们似乎都不是非常流行,这让我很担心。另外,我想我已经读到,使用javascript来记录.createTextNode()是一种安全的方法,可以将不受信任的数据注入服务器端的HtmlCode不受信任的数据(例如,来自数据库的用户输入数据),如果要对完成的数据进行HtmlCode/html,还可以使自己的html代码无用。@CharlottedNois,谢谢,因此,如果我理解正确,那么如果我修改新的retrieve.php脚本,首先通过xssafe()对值进行编码(就像我们以前所做的那样),然后在通过AJAX发送数据之前进行json_编码,我们就可以了。一旦javascript对json数据进行解码,它就已经正确地进行了html编码,所以我们不应该在将数据注入DOM时遇到任何问题?是的。您只需要确保来自用户的任何内容都得到了htmlencoded,这样就不会有XSS出现。例如,如果您发送
警报('Hi')到数据库,然后打印到页面上。您应该将其视为文本。为此,您需要对用户输入进行html编码。您自己的HTML不应该是HTML编码的,否则它不会被解释为HTML。我真的不知道您是将带有JSON的用户输入发送到前端并在那里生成HTML代码,还是仍然在服务器上生成HTML代码并将完成的HTML代码推回(这就是我要做的)。
print "<li>";
print "<a href='page?id=".xssafe($row->TRUSTED_VALUE)."'>".xssafe($row->UNTRUSTED_VALUE)."</a>";
print "</li>";
$data['TRUSTED_VALUE'] = $row->TRUSTED_VALUE; // 123
$data['UNTRUSTED_VALUE'] = $row->UNTRUSTED_VALUE; // who knows?
header('Content-Type: application/json');
print json_encode($data);
<script src="show.js"></script>
$.ajax({
        url: 'retrive.php',
        dataType: 'json',
        data: {page: pageNum},
        success: loadLI
}); 

function loadLI() {
        data = response.data;
        var li = document.createElement('li');
        var anchor = document.createElement('a');
        anchor.setAttribute('href', 'page?id='+encodeURIComponent(data.TRUSTED_VALUE));
        anchor.appendChild(document.createTextNode(data.UNTRUSTED_VALUE));
        li.appendChild(anchor);

}