c# - 确保仅 "Reasonable"查询

标签 c# asp.net sql sql-server

在我们的组织中,我们需要让员工通过提供 WHERE 子句来过滤 Web 应用程序中的数据。它在很长一段时间内都运行良好,但我们偶尔会遇到用户提供的查询需要对大表进行全表扫描或低效的连接等。

有些 clown 可能会这样写:

select * from big_table where
Name in (select name from some_table where name like '%search everything%')
or name in ('a', 'b', 'c')
or price < 20
or price > 40
or exists (select 1 from some_other_table where col1 + col2 + col3 = 4)
or exists (select 1 from table_a, table+b)

显然,这不是查询这些具有计算值、非索引列、大量 OR 以及对 table_a 和 table_b 的无限制连接的表的好方法。

但对于用户而言,这可能完全有意义。

那么最好的方法是什么,如果有的话,允许内部用户向数据库提供查询,同时确保它不会锁定十几个表并使网络服务器挂起 5 分钟?

我猜这是 c#/sql-server 中的一种编程方式,可以在查询运行之前获取查询的执行计划。如果是这样,哪些因素会影响成本?估计 I/O 成本?估计 CPU 成本?告诉用户他的查询不好的合理限制是什么?

编辑:我们是一家市场研究公司。我们有数以千计的调查,每个调查都有自己的数据。我们有数十名研究人员想要以任意方式对数据进行切片。我们有工具让他们使用 GUI 构建“有效”过滤器,但一些“高级用户”想要提供他们自己的查询。我意识到这不是标准或最佳实践,但我还能如何让数十个用户使用任意复杂的条件和不断变化的条件查询表中他们想要的行?

最佳答案

你的问题的前提是:

在我们的组织中,我们需要通过提供 WHERE 子句让员工在我们的 Web 应用程序中过滤日期。

我发现这个前提从表面上看是有缺陷的。我无法想象我会允许用户这样做的情况。除了您已经确定的问题之外,您还容易受到 SQL 注入(inject)攻击。

我强烈建议您重新评估您的要求,看看您是否可以构建一种更安全、更有针对性的方式来让您的用户进行搜索。

但是,如果您的用户真的很老练(并且值得信赖!),足以直接提供 WHERE 子句,则需要对他们进行培训,让他们知道什么可以作为过滤器提交,什么不能提交。

关于c# - 确保仅 "Reasonable"查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2015564/

相关文章:

c# - Parallel.ForEach 如何知道在哪个项目? - 哪个循环?

c# - 如何使用 C# 将颜色(在 RGB 模式下)转换为 PNG 的透明色?

c# - 可点击图像 map c#

java - 复合主键太长?

mysql - 从用户评分表中获取所有连续日期的条纹

c# - 有没有办法公开强类型资源文件(而不是内部文件)?

asp.net - Razor - 如何在 div 标签中显示 html 内容?

c# - 尝试调用具有 out 参数的函数时出现问题

javascript - 单击按钮在 GoogleMap 中移动

sql - 如何在 SQL 中请求一个随机列?