string sqlQuery = "unknown";
我需要编写一个接收sql查询作为参数的函数,例如: sqlQuery
。我想只有当它是select语句并返回数据时才执行它。在其他情况下,如果参数sqlQuery
包含delete,update或truncate,则该函数应返回null。
我想知道是否有办法在不解析参数sqlQuery
的内容的情况下实现这一点。
我想用c sharp进行oracle查询。
任何提示。感谢。
更新
答案 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的好文章。
基础知识是:
答案 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中调用的函数中存在漏洞。