【问题标题】:What's the best way to restrict insert/update queries when using ExecuteSqlCommand?使用 ExecuteSqlCommand 时限制插入/更新查询的最佳方法是什么?
【发布时间】:2019-06-11 20:34:47
【问题描述】:

我正在继承一个具有这个公共虚拟方法的类

public virtual int ExecuteSqlCommand(string query, params SqlParameter[] parameters)
{
    return _context.Database.ExecuteSqlCommand(query, parameters);
}

我想覆盖它并提供对数据库的只读访问权限,因此应限制任何插入/更新命令

我可以通过在查询中搜索插入/更新关键字来做到这一点,但我不确定这是 100% 的证明。

有没有更好的方法来实现这一点?

【问题讨论】:

  • 是的——不要授予访问数据库的帐户更改任何内容的权限(和/或仅为这些访问创建备用帐户)。这是 唯一 万无一失的方法,没有在命令上使用功能齐全的 T-SQL 解析器,即使你这样做了,你也无法判断是否(比如说)存储过程调用更新任何东西。

标签: c# entity-framework-6


【解决方案1】:

让数据库安全处理它。使用仅具有数据库读取权限的用户帐户运行查询。

如果您想提前警告用户,您可以使用搜索插入/更新的方法,但我不会依赖它作为安全机制。此时,如果他们没有足够的权限,您也可以运行查询并处理错误。

【讨论】:

    【解决方案2】:

    如果消费者真的想滥用它,搜索 INSERT/UPDATE/DELETE 并不是 100% 的证据 他们可以执行以下操作:

    EXEC('DE' + 'LETE ' + 'FROM Users')
    

    另一种基本上也有效但不能证明的方法是创建一个事务并在最后回滚它。

    最好的方法是创建一个只有只读访问权限的新用户并使用该用户帐户连接到数据库。

    【讨论】:

    • 另一种方法是创建回滚更改的触发器,虽然这看起来万无一失,但在所有表上创建触发器需要努力
    猜你喜欢
    • 1970-01-01
    • 2012-03-07
    • 2020-04-06
    • 2017-12-19
    • 2017-03-31
    • 1970-01-01
    • 2010-09-22
    • 2021-01-28
    相关资源
    最近更新 更多