这些 JavaScript 方法是否可以被视为 XSS 安全?

5
我正在实现一个名为“单页应用”的程序,它接受 JSON 格式的输入。这也意味着所有 HTML 都在浏览器中渲染,所有模板(我使用的是 Knockout)似乎不受用户输入的影响,这意味着模板不是通过后端动态构建的,而是静态地嵌入到客户端中。换句话说,我不会像下面这样做:
echo '<input type="text" value="$var">'

因此,所有用户内容的呈现基本上都可以归结为这些JS方法:

document.createTextNode(userVar); // for displaying static text
inputElement.value = userVar; // for populating input fields
document.title = userVar; // some user input can be reflected in the doc title
window.history.pushState = ... // no user input is set here directly, but there are URIs where this could be set using an outside link

那么现在的问题是:这些方法是否完全安全,不会发生XSS攻击?还是仍然有可能触发XSS攻击 - 如果是的话,如何进行?


1
我们无法仅凭如此少的信息告诉您。您是将用户的自有内容呈现给他们,还是将一个用户的内容呈现给另一个用户? - user229044
JSON输入来自后端(通过使用REST API),但这与什么有关?想象一下,“userVar”中可能包含任何字符串内容。 - frontend_dev
1
@Jamiec,我想我必须在这里表示不同意。再次强调问题是:“是否可能使用这四种方法任何放置在“userVar”中的内容来触发XSS攻击。如果“是”,请告诉我具体如何操作。如果“否”,那么我认为我的应用程序是安全的,因为只有这些方法有效地用于呈现内容。据我所知,这些都不能用于发起此类攻击。当然,我很清楚例如使用“innerHTML”是可能的,但这不是实际问题。 - frontend_dev
Jamie,我是说的那样 ;) 整个序列应该像这样:var tag = document.createElement("span"); tag.appendChild(document.createTextNode(userVar)); rootEle.appendChild(tag); - frontend_dev
嗯," Pedantic dickweed "(字面意思为:过分严格的混蛋)?你确定吗?我给出了一个确切的问题,你给出的答案根本与这个问题无关。但既然这个问题与安全有关,我假设" Pedantic dickweed "是一种称赞。在我看来,这个主题值得严谨对待,因为我绝对不想让任何漏洞存在。 - frontend_dev
显示剩余3条评论
2个回答

3
我认为这四个函数都是安全的。document.createTextElement方法似乎是安全的,而其他方法都不能添加对象到DOM中。
要发起XSS攻击,攻击者必须能够通过现有脚本来运行任意代码(这就是eval存在问题的原因),或通过诸如

攻击者也无法接管我的脚本,至少我不知道如何做到。JS是完全静态的,我不使用“eval”。 - frontend_dev
JS不是静态的,它是动态的并在浏览器环境中运行,因此您可以创建事件监听器、定时器等。它可以通过Chrome检查器非常容易地进行修改。虽然文件本身不会被更新,但其中的代码可以被更改(在会话期间,即页面刷新之前)以允许攻击。 - diggersworld
除了以上所有答案,您可能会发现这个链接很有用:http://www.acunetix.com/websitesecurity/cross-site-scripting/ - hiradyazdan
1
@diggersworld,这被称为自我XSS,没有网站是安全的。显然,人们可以在自己的浏览器中注入任意代码,只有当攻击者能够在其他人的浏览器上运行代码时才会变得危险。 - howderek
1
@howderek 是的,我知道,所以我在我的回答中说这是毫无意义的。 :) - diggersworld

2
无论您的JavaScript是否容易受到跨站脚本攻击(XSS)的影响,安全性是另一个问题。 XSS的想法是攻击者将代码放入您的系统中,然后由另一个用户运行,例如可能会将其重定向到另一个(潜在恶意的)站点。
如果您没有将输入数据存储到系统中,然后将其显示给另一个用户,则可以避免受到XSS的影响。用户只能攻击自己,这在我看来是毫无意义的。
但是,如果您将输入数据存储到系统中,则存在潜在问题(如果没有后端知识,则很难确定)。但是,无论您通过JavaScript提交什么,无论您将其发送到哪里,后端都必须处理(验证和验证)以确保它不具有恶意性。
最重要的是不要依赖JavaScript。无论您的脚本是10行还是1,000,000行,都可以通过前端进行操作,因为它在客户端运行。您可以使用Google Chrome的检查器自行尝试。

当然,我知道后端必须验证这些内容,所以我并不完全依赖JS。但是,了解客户端是否完全免疫仍然很重要,而且我认为使用我提到的方法可以实现这一点。 - frontend_dev
你需要问自己的问题是:我的代码是否从一个用户那里接收输入,然后将其显示给其他用户?如果是肯定的,那么就存在 XSS 的潜在风险。 - diggersworld
答案是“是”,但“潜力”究竟在哪里? - frontend_dev
你用来填充页面的传入JSON数据是潜力。 - diggersworld
diggersworld,“潜在的可能性”可能存在,但这并不意味着存在可以使用的具体攻击向量。我的目标是将客户端加固到一个技术上无法启动此类攻击的程度。因此,我的问题是。 - frontend_dev
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接