如果我限制用户的输入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都只被选中更有效。(顺便说一下,这很难实现)。