运行用户提供的SELECT查询有什么危险?



如果我限制用户的输入SQL语句,使其以SELECT开头,在这种情况下可以运行任何注入攻击吗?我是否留下了一个不同的安全漏洞(除了访问模式有权访问的所有数据之外)?

编辑如果我也禁止分号(;)呢?

是。如果您允许用户在网站中输入SQL(这是SQL注入攻击的典型情况),那么您就为自己打开了一条攻击途径。如果你限制单个字符,或者限制它只以SELECT语句开始,这并不重要,最终SQL有太多的方法来解析输入(网络甚至有更多),以捕获每一个可能的恶意查询,同时又不阻止大多数可能的非恶意查询。

总是解析你的输入。理想情况下,使用一个框架或至少一组存储过程(不能在其中动态构建和执行查询)访问数据库。

多告诉我们一些你想解决的问题,我们可以提供更多的帮助。

EDIT (post-comment):如果您试图为您的支持人员创建一个内部工具,您将需要创建一个具有基本搜索功能的工具。为用户提供下拉菜单,让他们选择要搜索的字段,并将输入传递到存储过程或框架中,以最小化风险。如果你认为你的技术支持人员会写SQL,只要给他们一个登录到你的数据库的权限就可以了——在像Management Studio这样的数据库访问工具中,限制用户访问'SELECT'语句比保护一个网站要容易得多。

简而言之,是的。SQL注入攻击给出一个简单的select:

var sqlCommand = "SELECT * FROM Table1 WHERE Field = '" & fieldValue & "';";

可以通过将变量fieldValue的值替换为以下内容来修改:

fieldValue = "'; DELETE FROM Table1 WHERE 0 = 0 OR '' <> '";

当脚本运行时,将导致创建和执行两个语句:

SELECT * FROM Table1 WHERE Field = ''; DELETE FROM Table1 WHERE 0 = 0 OR '' <> '';

这只是一个简单的例子,可以运行任意数量的语句来插入、更新、删除等…

要扩展关于剥离分号的编辑,可以将fieldValue变量更改为如下内容:

fieldValue = "' OR 1 = 1 OR '' <> '";

您将以以下内容结束:

SELECT * FROM Table1 WHERE Field = '' OR 1 = 1 OR '' <> '';

是的,sql注入攻击可以从select:

开始
SELECT * FROM USERS; DROP TABLE USERS

是的,注入攻击仍然可以通过攻击者在Select语句上使用'Where'子句来实现。也就是说,他们可以通过this获得完整的详细信息。

解析SQL并确定访问权限仍然有风险。例如,如果有人通过以下内容,该怎么办?

"select * from table_1; drop table X;"

您可以像某些用户建议的那样使用存储过程和绑定输入。

还要确保你用来连接你的应用程序/客户端的数据库用户在你的情况下只有"SELECT"权限。我相信这比确保所有sql都只被选中更有效。(顺便说一下,这很难实现)。

最新更新