Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SqlCommand类仅强制选择?_C#_Sql Server_Sqlcommand - Fatal编程技术网

C# SqlCommand类仅强制选择?

C# SqlCommand类仅强制选择?,c#,sql-server,sqlcommand,C#,Sql Server,Sqlcommand,我正在开发一个用于SQL监视的应用程序,它只是一个控制台应用程序,在一堆服务器上每5分钟运行一次。它有一个带有连接字符串和sql查询的配置文件。问题是我希望程序只接受SELECT查询 我的同事告诉我,他认为我可以在SqlCommand类中设置一些东西,但我已经在Google上搜索了一段时间,但没有成功。有人对我的问题有明确的解决办法吗?我曾考虑过在查询中搜索不同的单词,但有太多可能出错 欢迎提出任何建议 除非应用程序自己构建整个SELECT语句,否则这是不可能的 问题是,即使您确保第一个单词是S

我正在开发一个用于SQL监视的应用程序,它只是一个控制台应用程序,在一堆服务器上每5分钟运行一次。它有一个带有连接字符串和sql查询的配置文件。问题是我希望程序只接受SELECT查询

我的同事告诉我,他认为我可以在SqlCommand类中设置一些东西,但我已经在Google上搜索了一段时间,但没有成功。有人对我的问题有明确的解决办法吗?我曾考虑过在查询中搜索不同的单词,但有太多可能出错


欢迎提出任何建议

除非应用程序自己构建整个SELECT语句,否则这是不可能的

问题是,即使您确保第一个单词是SELECT,也不会阻止恶意用户终止命令,然后再发出EXEC或UPDATE语句


最好的解决方案是确保连接字符串中引用的用户帐户对SQL对象的权限有限,因此只能从支持的对象中进行选择。

可以限制数据库表本身。
您可以撤消所有权限,但可以从应用程序的用户中进行选择。

搜索用于SQL-SERVER的
REVOKE/GRANT
命令。

授予特权将是更好的方法,但您仍然可以使用以下方法解析语句,即使它是一系列SQL命令:

bool OkToRun = true;
foreach(string s in TheQueryString.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
    if (!s.Trim().ToUpper().StartsWith("SELECT "))
        OkToRun = false;

由于配置文件包含连接字符串,应用程序本身不提供用户。它与应用程序无关。此REVOKE命令应在数据库本身上运行。应用程序仍然使用用户来连接数据库。这是我通过“我曾考虑搜索查询中的不同单词,但可能会出错”得出的结论=/同意授予特权是最好的解决方案,但在这种情况下,配置文件会将程序交给用户。。我将继续使用您的代码示例,直到找到更好的!感谢并非所有SELECT查询都会以
SELECT
关键字开头,例如那些使用CTE的查询。