1

如果我们获取一个数据库表,我们可以查询所有行,或者我们可以选择对其应用过滤器。过滤器可以根据用户输入而变化。在选项很少的情况下,我们可以为这几个特定条件指定不同的查询。但是,如果用户可能会或可能不会指定很多选项,那么上述方法就不会派上用场。我知道,我可以根据用户输入组成过滤器并将其作为字符串作为参数发送到相应的存储过程,使用该过滤器构建查询,最后在 EXECUTE IMMEDIATE 的帮助下执行查询字符串(在 Oracle 的情况下)。不知道为什么,但我真的不喜欢这种查询构建方式。我认为这样我就可以为 SQL 注入器敞开大门。此外,

4

2 回答 2

2

使用数据库参数而不是尝试引用您的文字是前进的方向。

这将保护您免受 SQL 注入。

于 2013-01-09T14:15:31.520 回答
1

解决此问题的常用方法是构建表示查询条件的表达式树,将它们转换为参数化SQL(以避免 SQL 注入风险),将参数值绑定到生成的 SQL,并针对目标数据库执行生成的查询。

确切的方法取决于您的客户端编程框架:.NET 有Entity FrameworkLINQ2SQL,它们都支持表达式树;Java有Hibernate和JPA等等。我已经看到了几种不同的框架用于构建可定制的查询,并取得了很大的成功。在这些框架不可用的情况下,您可以推出自己的框架,尽管这需要更多的工作。

于 2013-01-09T14:19:21.490 回答