传统主义者认为,与使用 NHibernate 等对象关系映射 (ORM) 框架相比,存储过程提供了更好的安全性。
为了反驳这个论点,NHibernate 可以使用哪些方法来确保适当的安全性(例如,防止 sql 注入等)?
(每个答案请只提供一种方法)
传统主义者认为,与使用 NHibernate 等对象关系映射 (ORM) 框架相比,存储过程提供了更好的安全性。
为了反驳这个论点,NHibernate 可以使用哪些方法来确保适当的安全性(例如,防止 sql 注入等)?
(每个答案请只提供一种方法)
保护您的连接字符串。
从 .NET 2.0 和 NHibernate 1.2 开始,很容易在配置文件中使用加密的连接字符串(和其他应用程序设置)。将连接字符串存储在<connectionStrings>
块中,然后使用 NHibernateconnection.connection_string_name
属性而不是connection.connection_string
. 如果您运行的是网站而不是 Windows 应用程序,则可以使用aspnet_regiis
命令行工具来加密<connectionStrings>
块,同时将其余的 NHibernate 设置保留为纯文本以便于编辑。
如果您的数据库平台支持,另一种策略是为您的数据库连接使用集成身份验证。这样,您(希望)不会在配置文件中以明文形式存储凭据。
实际上,如果您使用 SQL 或 HQL 构建查询,NHibernate 可能容易受到 SQL 注入的攻击。如果您需要这样做,请确保使用参数化查询,否则您将面临一个痛苦的世界。
使用专用的锁定 SQL 帐户
我听到的支持 sprocs 而不是 ORM 的论点之一是,他们不希望人们在数据库中做任何他们想做的事情。他们不允许对表本身进行选择/插入/更新/删除。每个操作都通过一个由 DBA 审查的程序进行控制。我可以理解这种想法的来源......尤其是当你有一群业余爱好者都把手放在你的数据库中时。
但是时代变了,NHibernate 不一样了。这是令人难以置信的成熟。在大多数情况下,它会比您的 DBA 编写更好的 SQL :)。
你仍然必须保护自己不做愚蠢的事情。正如蜘蛛侠所说:“能力越大,责任越大”
我认为让 NHibernate 能够正确访问数据库并通过其他方式(例如审计日志记录和定期备份)控制操作更为合适。如果有人做了一些愚蠢的事情,你总是可以恢复的。
大多数 ORM 通过创建参数化查询来处理 SQL 注入。在 NHibernate 中,如果您使用 LINQ to NHibernate 或 Criteria/Query over 编写查询的方法,则查询会自动参数化,如果您自己动态创建 HQL/SQL 查询,您会更容易使用,并且必须记住您的查询必须参数化。
OWASP 在 ORM 工具的上下文中提到了一种形式的 SQL 注入漏洞(并以 HQL 注入为例):http ://www.owasp.org/index.php/Interpreter_Injection#ORM_Injection