如何在ADO.NET中安全地创建查询,其中选择的表更改?

Cri*_*ole 3 c# sql ado.net sql-injection database-security

在ADO.NET中,您可以向命令对象添加参数,以将用户输入安全地添加到SQL查询中.SQL查询常见的其他谓词的等价物是什么?

我正在编写一个程序,它本质上是一个非常有限的OR映射器和SQL生成器(它主要关注具有元信息的数据库和符合该元数据的其他数据库).因此,我需要能够调用以下内容:

string sql = "select " + USER_SELECTED_COLUMNS + 
            " from " + USER_SELECTED_TABLE + 
            " where " + USER_CRITERIA;
Run Code Online (Sandbox Code Playgroud)

其中一些(如criteria)可信用户(我公司的其他开发人员)输入我的程序,而其他数据由不信任的用户(客户)通过他们的搜索等输入我的程序.

我想让这个程序安全,我知道上面的内容不是.目前我已经USER_SELECTED_COLUMNS用命令参数替换了,但是我无法找到CRITERIA和TABLEs的等价物.(或按订单列).是否有任何类似于SqlParameter我可以用于非选择谓词的ADO.NET功能?

Jam*_*iec 5

我不认为我可以告诉你如何在1个响应中避免SQL注入,但是,我可以给你的主要指针是:

使用WHITELISTS,而不是BLACKLISTS.

也就是说,在对用户输入进行清理时USER_SELECTED_TABLE,可能的输入应该只是可能的表.同样,输入USER_SELECTED_COLUMNS应限于可能的列USER_SELECTED_TABLE.