使用 AJAX 并设置 innerHTML 的安全性?
Security using AJAX and set innerHTML?
考虑以下情况:
- 我向 PHP 发送了一个 AJAX 请求(无用户输入),它启动了一个函数。
- 函数returns原始字符串HTML。可以是任何东西——链接列表、一堆空 divs、内联插入的 SVG、页面的大部分...在其创建过程中不使用用户输入数据。
- 我收到字符串作为响应并将其插入到
div.
- 我(目前并且希望继续)使用纯 JS - 没有库。
承认 JS 固有的某种程度的不安全性,我刚刚所做的有多不安全?
OWASP XSS Cheat Sheet 表示要转义所有 'untrusted data'。鉴于上述情况,我的 AJAX 请求的结果是否不受信任? AJAX请求的结果是否被视为'untrusted'?
以这种方式插入 HTML 是不好的做法吗?如果是这样,我应该做什么呢?
编辑以澄清几件事:
- URL AJAX 请求中的变量仅用于在服务器上启动 PHP 函数。根本没有变量传递给该函数(具体来说,我使用的是 Joomla 的 com_ajax 组件)。
- 所有返回的代码都是静态的,是我写的
只要响应是真正静态的并且不涉及任何类型的用户输入,就可以了。 AJAX 本身(正如您所暗示的)不会使其容易受到 XSS 攻击(只要传输是安全的,这实际上意味着 https)。
一个注意事项(不一定是您的情况,但一般情况下)可能是您认为用户输入是什么,什么不是。您的应用程序 总是 接收来自用户的输入,或者它可能使用之前接收到的参数,甚至是其他应用程序接收的参数。即使你不传递参数,也有请求headers、cookies(如果有的话),用户输入也可以从数据库中读取。即使它看起来像数据库中的静态数据,在某些时候它也可能源自某种用户,可能是合法(但流氓)用户,或外部攻击者,或者它可能来自另一个写入到的应用程序相同的数据库(无论如何都不是一个好习惯)。
所以简而言之,如果您发回的数据真的只是静态数据(如硬编码),那并不容易受到攻击,但有很多方法可以使它变成动态的,从那里它是您的(理想情况下基于风险) ) 决定,你要防范什么,你信任什么。
最佳做法是默认对所有内容进行编码以避免错误。如果您确定您信任要插入 DOM 的数据源为 HTML,那很好。威胁建模可能有助于发现您应该信任和不应该信任的内容,但在某些情况下,它也可能是显而易见的。
考虑以下情况:
- 我向 PHP 发送了一个 AJAX 请求(无用户输入),它启动了一个函数。
- 函数returns原始字符串HTML。可以是任何东西——链接列表、一堆空 divs、内联插入的 SVG、页面的大部分...在其创建过程中不使用用户输入数据。
- 我收到字符串作为响应并将其插入到 div.
- 我(目前并且希望继续)使用纯 JS - 没有库。
承认 JS 固有的某种程度的不安全性,我刚刚所做的有多不安全?
OWASP XSS Cheat Sheet 表示要转义所有 'untrusted data'。鉴于上述情况,我的 AJAX 请求的结果是否不受信任? AJAX请求的结果是否被视为'untrusted'?
以这种方式插入 HTML 是不好的做法吗?如果是这样,我应该做什么呢?
编辑以澄清几件事:
- URL AJAX 请求中的变量仅用于在服务器上启动 PHP 函数。根本没有变量传递给该函数(具体来说,我使用的是 Joomla 的 com_ajax 组件)。
- 所有返回的代码都是静态的,是我写的
只要响应是真正静态的并且不涉及任何类型的用户输入,就可以了。 AJAX 本身(正如您所暗示的)不会使其容易受到 XSS 攻击(只要传输是安全的,这实际上意味着 https)。
一个注意事项(不一定是您的情况,但一般情况下)可能是您认为用户输入是什么,什么不是。您的应用程序 总是 接收来自用户的输入,或者它可能使用之前接收到的参数,甚至是其他应用程序接收的参数。即使你不传递参数,也有请求headers、cookies(如果有的话),用户输入也可以从数据库中读取。即使它看起来像数据库中的静态数据,在某些时候它也可能源自某种用户,可能是合法(但流氓)用户,或外部攻击者,或者它可能来自另一个写入到的应用程序相同的数据库(无论如何都不是一个好习惯)。
所以简而言之,如果您发回的数据真的只是静态数据(如硬编码),那并不容易受到攻击,但有很多方法可以使它变成动态的,从那里它是您的(理想情况下基于风险) ) 决定,你要防范什么,你信任什么。
最佳做法是默认对所有内容进行编码以避免错误。如果您确定您信任要插入 DOM 的数据源为 HTML,那很好。威胁建模可能有助于发现您应该信任和不应该信任的内容,但在某些情况下,它也可能是显而易见的。