【问题标题】:Only Execute if the query is select statement from c#? [closed]仅当查询是来自 c# 的 select 语句时才执行? [关闭]
【发布时间】:2018-03-15 08:57:53
【问题描述】:

我需要编写一个接收Sql-Query 作为参数的函数。我只想在它是 select 语句并返回数据时执行它。在其他情况下,如果参数包含删除、更新或截断,函数应该返回null。

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 最好的解决方案是编写这样的函数,而是使用像 EF 这样的 ORM 或像 Dapper 这样的微 ORM。
  • 在没有解析语句的情况下不要尝试这个(这不是一件容易的事)。您正在尝试做的事情会在您的系统中打开一个巨大的安全漏洞。最好不要这样做。如果您必须拥有它,请让您的 DBA 创建一个对 DB 具有只读访问权限的帐户,并使用该帐户的连接运行查询。这样,DB 将拒绝您可能发送的任何更新。
  • ADO.NET 的 ExecuteReader 也适用于 INSERT/DELETE,如果没有结果,它将不返回任何内容
  • 您可以使用只允许对所有表进行读取访问并且不允许您执行存储过程或写入/删除的登录吗?

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


【解决方案1】:

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

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

不包含delete。然后你进入与攻击者的军备竞赛,在你知道之前他们已经在没有exec 的情况下运行xp_cmdshellexec 对于隐式调用是可选的)并且你不再拥有服务器。

种方法可以解析 SQL 操作,但几乎可以肯定不值得。 SQL 复杂而微妙,大多数解析器都不是最新的。如果您正在为报告工具编写临时查询 API,则可以考虑使用更易于解析的单独查询 DSL,允许您检查语法,然后构造安全的参数化 SQL已根据允许列表检查了所有内容。

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

【讨论】:

    猜你喜欢
    • 2014-06-25
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多