【问题标题】:Purpose of web app input validation for security reasons出于安全原因进行 Web 应用程序输入验证的目的
【发布时间】:2015-07-15 13:28:39
【问题描述】:

我经常遇到一些建议,通过输入验证来保护 Web 应用程序免受许多漏洞的影响,例如 SQL 注入和其他类型的注入。 它有时甚至被认为是最重要的一项技术。

就个人而言,我觉得出于安全原因的输入验证从来没有必要,最好用

代替
  • 如果可能,不要将用户输入与编程语言混合(例如,使用参数化 SQL 语句而不是在查询字符串中连接输入)
  • 在将用户输入与编程或标记语言混合之前对其进行转义(例如 html 转义、javascript 转义......)

当然,对于良好的 UX,最好在 GUI 的背面和早期捕获会产生错误的输入,但这是另一回事。

我是否遗漏了什么,或者是我试图弥补上述两条规则的错误的唯一目的?

【问题讨论】:

  • 其实这个问题大概属于security.stackexchange.com -> 有没有办法移动它?
  • 可能会要求将其迁移到 Meta 或聊天中,因为标志列表中没有 Security SE 选项。

标签: validation security xss sql-injection code-injection


【解决方案1】:
  1. 并非所有 SQL 语句都是可参数化的。例如,如果您需要使用动态标识符(而不是文字)。即使是白名单也很困难,有时它需要是动态的。

  2. 在输出时转义 XSS 是个好主意。直到您忘记在您的管理仪表板上逃脱它并且他们窃取了您所有管理员的 cookie。不要让 XSS 进入您的数据库。

【讨论】:

  • 1.不过,用户输入不应该是实际 SQL 的一部分,对吧?所以你可以使用 SQL 转义。我仍然认为没有必要禁止任何字符。 2. 我也可以这么说:“直到您忘记验证遗留数据库迁移脚本中的输入”。此外,任何像样的 web 框架都会默认使用 html 转义,并且很少需要绕过它。
【解决方案2】:

是的,您通常是正确的。

一条数据只有在“使用”时才是危险的。只有在使用的上下文中具有特殊含义时,它才是危险的。

例如,<script> 只有在输出到 HTML 页面时才具有危险性。

Robert'); DROP TABLE Students;-- 只是危险的when used in a database query

通常,您希望尽可能晚地使这些数据“安全”。例如当作为 HTML 输出到 HTML 页面时的 HTML 编码,并在插入数据库时​​进行参数化。这样做的一大优势是,当稍后从这些位置检索数据时,它将以其原始、未经处理的格式返回。

因此,如果您在输入字段中有值 A&B O'Leary,它将被编码如下:

<input type="hidden" value="A&amp; O&#x27;Leary" />

如果将其提交给您的应用程序,您的编程框架将自动为您将其解码回A&amp;B O'Leary。与您的数据库相同:

string name = "A&B O'Leary";
string sql = "INSERT INTO Customers (Name) VALUES (@Name)";
SqlCommand command = new SqlCommand(sql);
command.Parameters.Add("@Name", name];

简单。

此外,如果您需要以纯文本形式向用户提供任何输出,您应该从数据库中检索它并将其吐出。或者在 JavaScript 中 - you just JavaScript entity encode (尽管出于复杂性的原因最好避免 - 我发现如果我只输出到 HTML 然后从 DOM 中读取值更容易保护)。

如果您提前对其进行了 HTML 编码,那么要输出到 JavaScript/JSON,您首先必须将其转换回来,然后再对其进行十六进制实体编码。它会变得一团糟,一些开发人员会忘记他们必须先解码,并且到处都有 &amps。

可以使用验证作为额外的防御,但它不应该是第一个停靠港。例如,如果您要验证英国邮政编码,您可能希望将大写和小写字母数字字符列入白名单。您的应用程序将拒绝或删除任何其他字符。这可以减少您的应用程序上发生 SQLi 或 XSS 的机会,但是在您需要输入以包含对输出上下文具有特殊含义的字符(" '&lt;&gt; 等)时,这种方法会失败。例如,在 Stack Overflow 上,如果他们不允许使用此类字符,您将阻止问题和答案包含代码 sn-ps,这几乎会使网站变得毫无用处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-23
    • 1970-01-01
    • 2020-05-04
    • 2020-05-14
    • 1970-01-01
    • 2014-06-16
    • 2013-06-30
    • 2016-02-07
    相关资源
    最近更新 更多