使用AJAX进行安全性并设置innerHTML?

时间:2016-09-26 19:00:21

标签: javascript php ajax xss innerhtml

考虑以下情况:

  • 我向PHP发送一个AJAX请求(无用户输入),启动一个函数。
  • 该函数返回一个原始HTML字符串。可以是任何东西 - 链接列表,一堆空div,要插入内联的SVG,大部分页面......在创建时不使用用户输入数据。
  • 我收到字符串作为回复并将其插入到 格。
  • 我(现在并且最好还是继续)使用纯JS - 没有库

接受JS中固有的某种程度的不安全感,我刚刚做了多么不安全的事情?

OWASP XSS Cheat Sheet表示要逃避所有“不受信任的数据”。鉴于上述情况,我的AJAX请求的结果是否不受信任?任何AJAX请求的结果都被视为“不可信”吗?

以这种方式插入HTML是不好的做法?如果是这样我应该做什么呢?

修改以澄清以下几点:

  • AJAX请求中的URL变量仅用于在服务器上启动PHP函数。根本没有变量传递给该函数(具体来说,我使用的是Joomla的com_ajax组件)。
  • 返回代码的所有都是静态的并由我编写。

1 个答案:

答案 0 :(得分:1)

只要响应是真正的静态且不涉及任何类型的用户输入,就可以了。 AJAX本身(正如您所暗示的)不会使其容易受到XSS的攻击(只要传输是安全的,这实际上意味着https)。

一个警告(不一定是你的情况,但一般来说)可能是你认为用户输入和不是。您的应用程序始终接收来自用户的输入,或者它可能使用先前接收的参数,甚至可能使用其他应用程序。即使您没有传递参数,也有请求标头,Cookie(如果有),也可以从数据库中读取用户输入。即使它看起来像数据库中的静态数据,在某些时候它可能源自某种类型的用户,可能是合法的(但是流氓的)或外部攻击者,或者它可能来自另一个写入的应用程序相同的数据库(无论如何都不是一个好的做法)。

简而言之,如果您发回的数据实际上只是静态数据(如硬编码的那样),那么它并不容易受到攻击,但它有很多种方式可以变为动态,并且从那里开始它就会变成动态的。你的(理想的基于风险的)决定,你保护的和你信任的。

最佳做法是默认编码所有内容以避免错误。如果您确信您信任要作为HTML插入DOM的数据源,那很好。威胁建模可能有助于发现您应该和不应该信任的内容,但在某些情况下,它也可能是显而易见的。