似乎可以通过简单地拒绝所有不使用命名参数的查询来一劳永逸地阻止所有 Sql 注入威胁。有什么方法可以配置 Sql server 来做到这一点?或者通过检查每个查询而不编写整个 SQL 解析器来在应用程序级别强制执行此操作?谢谢。
3 回答
- 删除角色的授权,以便能够对所涉及的表进行 SELECT/UPDATE/INSERT/DELETE
- 在存储过程/函数/等的角色上授予 EXECUTE
- 将角色与要保护的数据库用户相关联
它不会停止也具有 GRANT 访问能力的帐户,但它将阻止与该角色关联的用户(假设每个用户没有其他授权)能够在存储过程/函数之外执行查询/等存在。
只有几种方法可以做到这一点。OMG Ponies 给出了最好的答案:不允许直接针对您的数据库执行 sql 语句,而是利用 sql server 可以提供的工具和安全性。
另一种方法是添加所有查询都必须经过的附加层。简而言之,您会将所有查询(SOA 架构)传递给一个新应用程序,该应用程序将评估查询以传递给 sql server。我已经看到有一家公司这样做是为了应对他们网站的 sql 注入问题。
当然,这是一种可怕的做事方式,因为 SQL 注入只是一个潜在的问题。
除了 SQL 注入之外,您还会遇到网站本身被破解时会发生什么的问题。一旦您可以将新页面写入 Web 服务器,将您想要的任何查询传递给关联的数据库服务器就变得微不足道了。这将很容易绕过您可以放置的任何代码级别的东西。这将允许攻击者只写select * from ...
或truncate table ...
见鬼,内部人员可能只是使用站点凭据直接连接到 sql 服务器并运行他们想要的任何查询。
关键是,如果您利用 sql server 内置的安全性来防止直接访问表,那么您可以通过存储过程控制任何尝试连接到服务器的人都可以使用的全部操作。
你想如何检查呢?查询有时具有常量值,可以很容易地添加到查询中。例如,我有一个准备多语言的数据库,但并非所有代码都是,所以我的查询如下所示:
SELECT NAME FROM SOMETABLE WHERE ID = :ID AND LANGUAGEID = 1
ID 是一个参数,但语言 ID 不是。是否应该阻止此查询?
您要求阻止不使用命名参数的查询。这很容易执行。只需阻止任何未指定任何参数的查询。您可以在应用程序层中执行此操作。但是很难阻止像上面这样的查询,其中一个值是参数而另一个不是。您需要解析该查询以检测它,这也很困难。
我认为 sql server 没有任何内置功能可以做到这一点。