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