在ADO.NET中,您可以向命令对象添加参数,以便将用户输入安全地添加到SQL查询中。 SQL查询常见的其他谓词的等价物是什么?
我正在编写一个程序,它本质上是一个非常有限的O-R映射器和SQL生成器(它主要关注具有元信息的数据库和符合该元数据的其他数据库)。因此,我需要能够调用以下内容:
string sql = "select " + USER_SELECTED_COLUMNS +
" from " + USER_SELECTED_TABLE +
" where " + USER_CRITERIA;
其中一些(如criteria
)字面上由受信任的用户(我公司的其他开发人员)输入我的程序,而其他数据由不受信任的用户(客户)通过他们的搜索输入我的程序,等
我想让这个程序安全,我知道上面的内容不是。目前我已将USER_SELECTED_COLUMNS
替换为命令参数,但我无法找到CRITERIA和TABLE的等效项。 (或按订单列)。是否有任何类似于SqlParameter
的ADO.NET功能可以用于非选择谓词?
答案 0 :(得分:5)
我不认为我可以告诉你如何在1个响应中避免SQL注入,但是,我可以给你的主要指针是:
使用WHITELISTS,而不是BLACKLISTS。
也就是说,在清理USER_SELECTED_TABLE
的用户输入时,可能的输入应该只是可能的表。同样,USER_SELECTED_COLUMNS
的输入应限于USER_SELECTED_TABLE
的可能列。
答案 1 :(得分:2)
当您构建允许用户选择表的屏幕时,列不使用实际名称。您如何拥有UserID但显示UserName的方式。使用object_id和column_id(如表单sys.tables.object_id和sys.columns.object_id + column_id)。将它们添加到您的过程中,仅使用连接到系统视图的数字ID构建SQL:
sys.tables (Transact-SQL)
sys.columns (Transact-SQL)
您可以连接字符串表和列名,但它们将来自系统视图,而不是来自用户输入。
答案 2 :(得分:1)
通过Microsoft Web Protection Library运行您在上面指出的所有变量。它将提供SQL注入和XSS攻击的安全性。下载中有一些示例向您展示如何在代码隐藏中使用它。