【问题标题】:List of characters to be restricted for protection against XSS and SQL Injections?为防止 XSS 和 SQL 注入而限制的字符列表?
【发布时间】:2011-04-22 00:32:36
【问题描述】:

我浏览了很多文章,找到了一个简单的字符列表,这些字符可以限制用户输入以保护我的网站免受 XSS 和 SQL 注入攻击,但找不到任何通用列表。

有人可以通过简单地给我这方面的安全或不安全字符列表来帮助我吗?我知道这可以是特定于字段的,但我需要它用于我希望允许最大可能字符的文本字段。

【问题讨论】:

  • 感谢大家的回复。所以,看来我必须对此进行更多研究,因为白名单字符无济于事。

标签: php mysql security xss sql-injection


【解决方案1】:

“黑名单”方法充满了问题。对于 SQLi 和 XSS,针对白名单的输入验证是必不可少的,即定义您期望而不是不期望。还要记住,用户输入 - 或“不受信任的数据” - 来自许多地方:表单、查询字符串、标题、ID3 和 exif 标签等。

对于 SQLi,请确保您始终使用参数化 SQL 语句,通常以存储过程参数或任何体面的 ORM 的形式。还应用“最小特权原则”并限制连接到数据库的帐户可能造成的损害。更多关于 SQLi 的信息:http://www.troyhunt.com/2010/05/owasp-top-10-for-net-developers-part-1.html

在 XSS 方面,始终对您的输出进行编码,并确保您针对其出现的适当标记语言对其进行编码。JavaScript 的输出编码不同于 HTML,也不同于 CSS。请记住,不仅要编码立即反映输入的响应,还要编码存储在数据库中的不受信任的数据,这些数据可能会带来持久的 XSS 威胁。更多关于这一切的信息:http://www.troyhunt.com/2010/05/owasp-top-10-for-net-developers-part-2.html

我知道这超出了您最初的问题,但我想说的是,允许的字符只是图片的一小部分。上面提到的其他做法可能更重要(但您仍应使用这些白名单)。

【讨论】:

  • 感谢您的回答。所以底线是仅仅白名单是不够的。但我想知道的是,除了从未在任何攻击中使用的字母数字字符之外,是否还有其他字符。例如,如果我只允许带有点 (.) 和逗号 (,) 的字母数字文本,会不会让任何人造成任何伤害?
  • 今天有字符还是明天有字符?今天,看看 XSS 备忘单,你就会知道攻击结构有多么庞大:ha.ckers.org/xss.html 明天,好吧,重点是我们不知道。不断有新的漏洞利用出现,所以谁知道有什么样的零日漏洞正在等待发生。这就是白名单如此重要的原因;即使我们认为某个特定字符可能会被恶意使用,但随着时间的推移,我们很可能会被证明是错误的。
【解决方案2】:

字符过滤不是您应该采取的安全措施。要防止 SQL 注入,请使用prepared statements。为了防止 XSS 你应该escape所有用户输入正确

【讨论】:

  • 感谢您的回复和链接,但我现在不想进入安全问题,因为我没有那么多时间 :) 我不能简单地避免某些字符已知被用于此类攻击?
  • 我不建议你这样做,但如果你打算通过字符过滤来保证安全,那么你最好加入白名单而不是持久化。我对 SQL 注入或 XSS 的了解还不够,无法为您提供明确的答案,即您需要禁止哪些字符才能完全安全(如果您可以与其他人一起利用,禁止任何字符是没有意义的),但是禁止引号(单引号和双引号)和尖括号是好的开始,但几乎可以肯定是不够的。
  • Atul,如果您真的想走捷径,请从参数化 SQL 开始(无论如何您都不应该这样做),然后输出编码。正确执行这些操作,白名单就没有那么重要了(但您应该仍然执行此操作)。黑名单字符是一个滑坡,几乎总是费力且效果不佳。
【解决方案3】:

看看 Drupal CMS 的 xss 过滤的implementation。该函数具有包含允许的 HTML 标签的白名单,所有其他内容都将被转义。

【讨论】:

    猜你喜欢
    • 2019-06-03
    • 2013-05-20
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    相关资源
    最近更新 更多