使用NHibernate时实现安全性的最佳实践是什么?

时间:2020-03-06 14:33:39  来源:igfitidea点击:

传统主义者认为,与使用诸如NHibernate之类的对象关系映射(ORM)框架相比,存储过程提供了更好的安全性。

为了反驳这种说法,NHibernate可以使用哪些方法来确保适当的安全性到位(例如,防止sql注入等)?

(每个答案仅提供一种方法)

解决方案

使用专用的锁定SQL帐户

实际上,如果我们使用SQL或者HQL构造查询,则NHibernate可能容易受到SQL注入的攻击。如果需要执行此操作,请确保使用参数化查询,否则,我们将遭受痛苦。

保护连接字符串。

从.NET 2.0和NHibernate 1.2开始,很容易在配置文件中使用加密的连接字符串(和其他应用程序设置)。将连接字符串存储在" <connectionStrings>"块中,然后使用NHibernate的" connection.connection_string_name"属性而不是" connection.connection_string"。如果我们运行的是网站而不是Windows应用程序,则可以使用" aspnet_regiis"命令行工具来加密" <connectionStrings>"块,同时将其余的NHibernate设置保留为纯文本格式,以便于编辑。

如果数据库平台支持,则另一种策略是对数据库连接使用集成身份验证。这样,我们(希望)不会以明文形式在配置文件中存储凭据。

http://weblogs.asp.net/fbouma/archive/2003/11/18/38178.aspx

我听说过赞成sproc而不是ORM的论点之一是,他们不希望人们做数据库中想要做的任何事情。它们不允许在表本身上进行选择/插入/更新/删除。每个动作均由DBA审查的程序控制。我可以理解这种想法的来源...尤其是当我们有一群业余爱好者全都在数据库中时。

但是时代变了,NHibernate也有所不同。非常成熟。在大多数情况下,它将比DBA :)编写更好的SQL。

我们仍然必须保护自己免于做一些愚蠢的事情。正如蜘蛛侠所说的:"能力越大,责任就越大"

我认为,更合适的方法是让NHibernate通过其他方式(例如审核日志记录和常规备份)正确访问数据库并控制操作。如果某人做某事愚蠢,我们可以随时恢复。