仅当它是select语句时才执行查询。怎么样?

时间:2011-03-04 15:42:10

标签: c# oracle

string sqlQuery = "unknown";

我需要编写一个接收sql查询作为参数的函数,例如: sqlQuery。我想只有当它是select语句并返回数据时才执行它。在其他情况下,如果参数sqlQuery包含delete,update或truncate,则该函数应返回null。

我想知道是否有办法在不解析参数sqlQuery的内容的情况下实现这一点。 我想用c sharp进行oracle查询。

任何提示。感谢。

更新

  1. 这应该适用于拥有所有权限的所有类型的用户。

8 个答案:

答案 0 :(得分:6)

在仅具有select权限的用户的上下文中运行查询。任何其他类型的查询都会出错。

答案 1 :(得分:2)

SET TRANSACTION READ ONLY,然后执行字符串。如果它试图修改数据,它将生成ORA-01456错误。你可以捕获它并返回你想要的任何东西。

答案 2 :(得分:1)

您可以搜索字符串中的关键字,例如“更新”,“删除”,“截断”以及您可以在表格上执行ddl或dml的所有其他方法,但它非常容易出错。您必须在查询中消除可能包含这些关键字的字符串,并且您必须考虑很多关键字。

如果您的要求是返回null,为什么不在必要对象上仅赋予select权限,如果遇到权限不足错误则返回null?

http://download.oracle.com/docs/cd/E11882_01/server.112/e17069/strms_trapply.htm#STRMS1065

答案 3 :(得分:1)

我不允许客户端指定SQL select字符串。太多可能的攻击媒介。

你考虑过使用Linq吗?调用者可以传递可以传递给Func<T, bool>子句的Where。由于Linq将为您生成select语句,因此不可能出现非选择语句。

答案 4 :(得分:1)

如果您真的必须使用将在数据库上运行的构造字符串,则应使用DBMS_ASSERT数据库包以确保您具有不受SQL注入的纯查询。 Oracle网站上有一篇关于here的好文章。

基础知识是:

  • 仅提供必要的最低权限,例如仅向用户提供“select”,如先前回复中所述。然后只在最小的必要表集上。视图在限制访问方面非常有用。
  • 尽可能使用绑定变量。
  • 如果您不能使用绑定变量,请使用DBMS_ASSERT
  • 检查语句的纯度

答案 5 :(得分:1)

请记住SELECT列FROM表FOR UPDATE仍然会对该表上的每一行进行独占锁定。它只需要SELECT权限(不需要INSERT,UPDATE或DELETE)。

答案 6 :(得分:0)

您可以使用ADO.NET SqlCommand http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.aspx。它具有用于select类型查询的ExecuteReader方法和用于其他sql表达式的ExecuteNonQuery,您可以设置CommandText字符串属性。如果我是对的,如果查询不是ExecuteReader中的select,则抛出异常,但是你必须检查它。

答案 7 :(得分:0)

string sqlQuery = "("+evil_sql+")";

只有子查询才能以括号开头。这将停止DML,DDL和Gary提到的FOR UPDATE问题。您仍然必须执行所有操作,只需捕获所有错误。我在面向公众的网站上做到了这一点,没有任何问题。

即使您的用户未被直接授予任何内容,您也需要检查不必要的PUBLIC授权。当然还要修补你的系统。可以在SELECT中调用的函数中存在漏洞。