0

我希望保护我的代码免受 XSS 攻击,但我一直在阅读的所有示例都涉及直接用户输入验证(例如在联系表单或登录中)。

如果无法直接输入(即我的网站只是从数据库中读取而不是写入),我是否需要保护我的代码,我有点困惑?我仍然认为我需要这样做,因为我将我的数据库归类为外部源,并且回显的变量中的数据仍然来自其他地方。

我是否认为读取的任何数据仍然构成用户输入并应进行相应处理?此外,如果我随后添加了一个联系表格,我是否需要在每个页面中验证/清理/转义从我的数据库中提取的每条信息,还是只在表格本身处理它?

4

2 回答 2

4

忘掉“用户输入”这个词,用“未知字符串”来思考。任何你不知道它所包含的事实的东西在正确的上下文中都是潜在的危险或破坏性的。

同样重要的是要记住,没有适用于所有情况的单一解决方案。例如,这些都可能需要不同类型的消毒或转义:

  • HTML 属性:<a href="$unknown">
  • HTML文本内容:<p>$unknown</p>
  • javascript:<script>var B = $unknown;</script>
  • SQL:SELECT * from $unknown
  • CSS:.myClass { color:$unknown; }

一般来说,您应该(如果可能)避免在 HTML 属性、CSS 或 Javascript 中使用未知数据——因为这些地方可能会变得复杂。在大多数情况下,只需转义 HTML 字符即可。

这里的关键词是context,这就是为什么你不想“清理” input而是 output 的原因之一。相同的数据可以在不同的上下文中使用,并且需要不同的转义或过滤措施。

我强烈建议使用 OWASP 作为学习 XSS 和一般安全性的资源:https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)

于 2012-10-07T20:53:58.910 回答
1

我是否认为读取的任何数据仍然构成用户输入并应进行相应处理?

一般来说 - 是的。大多数数据库主要包含纯文本和数字。

不过也有例外。例如,如果您在其中显式存储 HTML,并确保在输入时它是安全的(或至少是可信的),那么当您提取数据时,您无需担心保护自己免受 XSS 攻击。这方面的一个例子是允许用户在文章中输入 HTML 的 CMS(例如 Wordpress)。

此外,如果我随后添加了一个联系表格,我是否需要在每个页面中验证/清理/转义从我的数据库中提取的每条信息,还是只在表格本身处理它?

该表格允许输入来自系统外部的数据。当您将数据放在任何地方时,您需要采取任何适合的措施。如果将其放入 SQL 字符串中,则需要将其转义为 SQL。如果将其放入电子邮件主题中,则需要为此进行转义。如果将其放入 HTML 文档中,则需要为此进行转义。(等等)。

于 2012-10-07T20:27:24.950 回答