6

我正在创建一个网页,用户可以在其中交互并在远程计算机上执行基本的文件系统操作(创建文件/目录、删除文件/目录、导航文件系统)。该网页是基本的 HTML(UTF-8 编码)和 Javascript。我需要让这个网页 XSS 证明。

使用Javascript(输出百分比编码的十六进制值)转义用户输入中的所有非字母数字字符(以防止基于DOM的XSS)和文件名信息(以防止存储的XSS)就足够了吗?

我基本上只将字母数字输入列入白名单。此外,由于我使用的是百分比编码的十六进制值,我假设不应该存在 UTF 编码漏洞。

谁能想到这个机制中的任何安全漏洞?

4

6 回答 6

8

使用 javascript(我认为你在说什么)进行转义似乎不太安全。它在用户机器上运行,他们可以通过一些努力绕过转义机制。

您尝试做的事情听起来不错,但您需要在服务器端进行。

于 2009-05-16T18:23:41.040 回答
1

几点注意事项:

  • 正如@Alo 所说,这应该在服务器端完成,以防止攻击者完全绕过您的 javascript 并将恶意输入直接发送到服务器。但是,正如您所指出的,这应该(在某些情况下)也在客户端完成,以防止基于 DOM 的 XSS。
  • 您提到该页面是 UTF-8,您需要使用元标记、HTTP 标头等强制执行此操作。否则,您很容易受到 UTF-7 攻击。
  • 空格 - 是不是字母数字?(有些包括...)在某些情况下,仅使用空格和字母,就可以进行全面的 XSS 攻击。

在我对HTML 编码是否可以防止各种 XSS 攻击的回答中查看更多信息? 你会在那里找到你需要知道的一切。

于 2009-05-16T20:11:10.953 回答
1

补充其他观点的说明:

确保正确使用 GET 和 POST,因为这是许多网站上最简单的安全漏洞。

如果用户输入将触发对数据库的任何更改,请确保使用 POST。

如果您正在检索要显示的信息,则只有用户 GET。

于 2009-05-16T20:20:23.100 回答
0

听起来很安全,而且可能是,但有一个问题。只有正确实施它才有效。太容易出错了。如果你想这样做,那没关系,但我建议使用一些已经测试过的库来做到这一点,而不是自己动手。

于 2009-05-16T18:06:12.720 回答
0

编码是一件好事。最大的潜在风险是您如何处理数据以及是否/何时解码/显示数据。如果您解码用户输入并显示它,解码数据,那么您可能会遇到问题。

如果您没有迫切需要支持在潜在 XSS 漏洞方面风险更大的字符(例如 '<'、'>'、';' 等),那么我认为将这些字符列入黑名单也是合理的。这样,如果您解码和显示数据,您就不会潜在地表达 XSS 问题。

于 2009-05-16T18:21:27.033 回答
0

防御 XSS 的基本方法是尽可能使用正则表达式来验证输入并对所有输出进行编码。编码输出可能很棘手,因此最好使用库。您的应用程序的至少一个重要输入是文件名,因此您需要一个正则表达式来匹配目标操作系统的任何有效文件名。仅接受字母数字输入将使您的应用无法处理常见操作系统上的许多文件名。我不明白为什么使用 %hex 值会有任何好处。没有理由不能以这种方式对恶意脚本进行编码。同一个脚本可以有许多有效的 utf-8 表示。您需要阅读更多关于反 XSS 编码实践的背景知识。谷歌 OWASP 供参考。

于 2009-05-16T18:34:20.123 回答