实体框架是否可以在无法访问sp_executesql的情况下执行存储过程?



大家好,

我继承了多个桌面应用程序,这些应用程序严重依赖存储过程进行数据操作。这些应用程序是用VB6编写的,我目前正在尝试弄清楚如何将它们移植到.Net 5或.Net 6。

我知道实体框架核心能够执行存储过程。但是,在我最近观看的一段视频中,我了解到实体框架核心通过存储过程sp_executesql执行数据函数,以允许执行开发人员可能动态生成的任何过程。

但是,正如上面链接的视频所提到的,这为桌面应用程序带来了安全漏洞。要触发sp_executesql,桌面应用程序的用户必须具有可以在其系统上触发它的凭据。这些值可能被加密,但加密并非无懈可击。

如果我创建和使用无权访问sp_executesql但有权访问同事创建的存储过程的数据库凭据,则实体框架是否能够触发后者?

您可以使用"原始 SQL 查询"直接执行存储过程,而无需sp_executesql

var customers = context.Customers.SqlQuery("dbo.sp_getcustomers");

或:

var customers = context.Customers.SqlQuery("dbo.sp_getcustomerbyid @p1", customerID);

SqlQuery返回一个延迟加载IEnumerable<T>

顺便说一句,原始 SQL 查询非常有用,而不仅仅是调用存储过程。 您不必仅仅依赖实体框架的 SQL 生成机制(有时可能会生成次优 SQL),而是可以直接执行自己选择的任意、格式良好的 SQL 语句。

延伸阅读:
Raw SQL Query (EF6)
Database.SqlQuery Method

如果我创建和使用无权访问sp_executesql但有权访问同事创建的存储过程的数据库凭据,则实体框架是否能够触发后者?

这个问题的前提有双重缺陷。

  1. sp_executesql可供所有用户使用,并且不存在任何类型的安全漏洞。 您的用户将有权访问sp_executesql。

  2. EF 不会直接调用sp_executesql。 它将存储过程作为 RPC 而不是 TSQL 批处理调用。 这是内置的 TDS 协议功能。 但探查器使用 sp_executesql 将 RPC 调用显示为 TSQL 批处理,以便您可以将调用复制并粘贴到查询窗口中进行测试。

相关内容

最新更新