C#asp.net从viewstate动态构建SQL查询

时间:2009-01-24 21:40:22

标签: c# asp.net security viewstate

在我的C#asp.net webform上,我有一个搜索页面,其中大约有20个元素可以用作搜索的一部分。稍后会有更多补充。

我所做的是扩展文本框和下拉列表框以包含一些变量:

fieldname:Tablename.columnname dbtype:DbType.Int32 Joinparam:LEFT加入otherTable ON x.y = a.b

这些都存储在viewstate中并重新加载。我这样做的原因是我可以遍历所有控件并拉出所有类型的控件。然后我可以验证它们以确保它们具有输入并且是正确的类型。如果是这样,我可以将它们传递给数据库访问层,让代码动态生成SQL语句。

除了SELECT语句之外,我不会发生任何事情。选择和返回的字段无法更改,我使用dbparameter尝试避免sql注入。

我担心的是,我将在搜索条件中使用的表和字段名称以及视图状态中所需的JOINS。这是一个真正的坏主意吗?

我可以通过在数据库中保存这些信息的表中只有一些int索引来掩盖这一点,但这仍然需要放入视图状态,只是意味着他们会有一个额外的层来解决。

我采用这种方法的原因是我不想在数据库层中放置大量的IF语句来在那里构建语句。这将是丑陋的地狱和痛苦维持。

感谢您提出任何建议。

乔恩

修改

感谢大家的建议。值得庆幸的是,这个应用程序只是一个内部的东西,所以损坏将是有限的但我永远不会再使用这种技术,而是会改进搜索模板的想法。

干杯:)

3 个答案:

答案 0 :(得分:3)

我认为在视图逻辑中编码部分数据访问层是一个真正的设计错误。抛开安全问题,对于追随你的人来说,这很难维持和理解。我认为从长远来看,从各种选定输入中生成特定查询的工厂类可能更容易使用。或者,您可以从输入中填充“搜索模板”,并将搜索模板功能作为生成查询的工厂,就像UserPrincipal与System.DirectoryServices.AccountManagement命名空间中的PrincipalSearcher交互的方式一样。

答案 1 :(得分:2)

Viewstate未加密,它是base64编码的。现有的实用程序可以让您解码页面的视图状态。

可以加密页面或所有页面的viewstate: http://msdn.microsoft.com/en-us/library/aa479501.aspx

那就是说,我不推荐这种方法。应用程序设计的最佳方法是将UI与业务和数据访问逻辑分离。在这种情况下,你会将它们紧密地联系在一起,没有明显的好处。

如果您确实在数据访问层中构建了更强大的即席查询功能,则可能会在应用程序的后端添加值。您可以通过Web服务,Windows窗体应用程序等提供搜索功能。即使这种类型的功能不是您想象的在不久的将来发生的事情,当您采用这种方法时,它可能是一个巨大的时间(和$$$)保护程序。

您在UI中构建的逻辑可以轻松构建到某种类型的查询引擎中。您可以通过动态地为其添加条件来构建一个汇总查询的方法,而不是您想要避免的IF。

答案 2 :(得分:1)

好的,所以ViewState默认为MACed,并且可以选择加密。所以,尽管你可以(默认情况下)阅读 viewstate,tampering isn't trivial

像这样动态构建你的查询最肯定会打开你的Sql注入 - 你正在参数化搜索术语,但是如果我可以在你的JOIN子句中注入一个; DROP TABLE语句,你就被冲洗了(除非你已经当然,要小心设置数据库级别的安全性。

话虽如此,我认为你的JOIN条款没有任何理由需要在ViewState中。我认为你在ASPX标记中将它们设置为子类文本框的属性 - 它们没有理由改变它们。您可能需要ViewState的唯一事情是搜索条件本身 - 它是适当参数化的。这类似于SqlDataSource如何保护它的SelectCommand属性 - 不要将它存储在ViewState中,以免泄露信息(或冒险篡改 - 尽管我认为这不是一个严重的漏洞)。

关于这是否可以维持的更大问题 - 嗯,我想你必须打电话。