如果查询是来自c#的select语句,则只执行?

时间:2018-03-15 08:57:53

标签: c# sql .net sql-server asp.net-mvc-4

我需要编写一个接收String[] str = new String[] { "one", "two", "three" }; List<String> list = Arrays.asList(str); Collections.shuffle(list); 作为参数的函数。我想只有当它是select语句并返回数据时才执行它。在其他情况下,如果参数包含delete,update或truncate,则该函数应返回null。

1 个答案:

答案 0 :(得分:2)

这在各个层面都是一个糟糕的主意;除非您正在撰写SEDE之类的内容,否则您应该永远接受来自外部世界的SQL。除了允许对任何内容进行未经检查的读取之外,几乎可以肯定地滥用几乎任何其他内容。例如:

exec ('del' + 'ete from SomeData')

不包含delete。然后你和攻击者进行军备竞赛,在你知道它之前他们已经xp_cmdshell没有execexec是隐式通话的可选项)而且你没有更长时间拥有服务器。

解析SQL操作的方法,但几乎肯定是不值得的。 SQL很复杂而且细致入微,大多数解析器都不会是最新的。如果您正在为报告工具编写即席查询API,可以考虑使用一个更易于解析的单独查询DSL,允许您检查语法,然后构造安全参数化SQL一次你已根据允许的清单检查了所有内容。

或者更好:不要在所有中公开即席查询;在报告系统之外很少需要它。如果这只是为了您的方便,允许您将SQL推送到视图/客户端而不必为每个操作编写一个路由:那么您做错了。