简单的 Linq 安全

Simple Linq Security

我正在尝试查找 ASP.NET 登录页面中的安全漏洞。我将如何清理用户输入以使 XSS 和 SQL 注入成为不可能?我觉得我的 Linq 查询是安全的,但我可能是错的。如果您需要更多信息,请告诉我。

String username = usernameTxt.Text.toString();

Company check = (from u in context.Company
                                where u.companyadminUserName.Equals(username)
                                select u).FirstOrDefault();

if (check == null)
{        
    return BAD_USER;
}
else
{
    return GOOD_USER;
}

好吧,这有助于了解您正在使用的 LINQ-to-SQL 的实现。我想每个实现都会默认将参数转义到 LINQ 扩展方法,但不会伤害到双重检查。

通常,您希望在用户界面和服务层之间始终有一个中间人。您的应用程序中可能到处都有它们;验证器。在验证数字是数字或邮政编码是邮政编码的情况下,它们显然是必要的,但没有什么比验证所有用户输入都没有被转义更重要的了。但这还不够好 - 这只是开始。

我建议在边界处建立类似于 ASP.NET 提供的东西 - 以防止 HTML 也被输入到用户界面输入中 - 但也在你的薄之间的边界controller 和 thick service,或者作为自己的层。

在这样的设计中,也许您可​​以在每个数据库输入参数上实现一个属性或注解,例如 InterrogateTheCarrierAttribute(假设您已将所有数据库调用参数化为函数,并且您没有连接字符串以创建查询)。在类似的事情上:每个 Powershell 调用包装器或 sh 包装器或函数来访问银行帐户和取款等。然后,当对象以一种或另一种形式移动时,每次它们越过 "validation boundary," 他们必须进行消毒,就好像没有其他卫生保证一样。这是矫枉过正,但除非验证成本高昂,否则为什么不呢?

想一想:如果不是错误的用户界面输入,而是文本文件或受信任的 Web 服务遭到破坏怎么办?如果您从 "this tier, this tier," 的角度考虑它,您可以说服自己在不安全的地方有安全。 Microsoft 的 Web 服务器永远不会向您发送格式错误的数据包,对吗?您的记录器永远不会发送错误的数据库 SQL,对吧?但它有可能发生。因此,使用 "cross-cutting" 验证方法,您总是在边界处进行验证,至少在进入的方式上,可能在出路时。通过这样做,您就不太可能因为错误的假设而让您的数据库接口完全开放。

示例:接受您的查询。关键问题是 1) username 是否被转义,以及 2) 未转义的 username 是否有可能以某种方式克服 LINQ to SQL 是主要抽象而不是立即进行注射。

现在您应该知道这些问题的答案了,但我们的系统不应该要求无所不知才能有效。所以,我建议实现一个横切层来进行验证,但是你想怎么做。