转义 SQL 参数

Posted

技术标签:

【中文标题】转义 SQL 参数【英文标题】:Escape SQL Parameter 【发布时间】:2009-12-10 16:31:52 【问题描述】:

我需要解决我报告的一个 NHibernate 错误 here。本质上,NHibernate 将为同一个 HQL 参数生成多个 SQL 参数,这会导致在分组构造中使用参数的查询出现问题。

在修复错误之前,我想我只是将参数连接到 HQL 中。显然这很容易受到 SQL 注入的影响,除非我对参数值进行转义(因为它是 HQL,所以我不能使用常规的 ADO.NET 参数)。

System.Data 中是否有一个方法可以转义参数值,从而可以安全地连接到 SQL 字符串?我正在使用 SQL Server 2005,我很乐意在短期内针对该平台做一些特定的事情,直到 NHibernate 错误得到修复。

谢谢, 肯特

【问题讨论】:

我很困惑为什么要按用户输入进行分组?按常数分组...什么值会给出查询?对不起,如果这是一个愚蠢的问题。 【参考方案1】:

据我所知,没有任何东西可供您使用(类似于Oracle DBMS_ASSERT 库的东西可以工作if it were available in Sql Server)。您可以做的一件可以保护您的事情是简单地检查您的参数值(即您将要连接的内容)是否有任何空白,如果包含它则抛出异常 - 这应该可以保护您免受任何破坏性方面的影响注射。当然,如果您连接的参数不需要能够找到实际包含空格的值,这将是一个可行的解决方案,但我认为这将是一个有限的场景。

【讨论】:

唉,这正是我的情况。它基本上是我要匹配的类别名称,其中可以包含空格。在最坏的情况下,我会检查引号并抛出参数值中是否有任何引号。 哈,数字就是这样。如果你通读这个其他 SO 线程(这里:***.com/questions/1800013/…),它提供了一些非常好的代码,可以防止绝大多数事情,但你几乎总是容易受到不可打印的密钥攻击(即退格) . 酷 - 谢谢。现在我添加了一个非常严格的检查来确保输入匹配@"^[A-Za-z\:\, ]*$" 的正则表达式。如果不是,则抛出异常。

以上是关于转义 SQL 参数的主要内容,如果未能解决你的问题,请参考以下文章

SQL 注入中的“参数化查询/准备语句”如何比转义用户输入更好

spring for mongodb转义参数以避免SQL注入

HTML 本地存储参数替换转义

带有绑定参数的预处理语句优于带有转义/引用参数的插值语句的原因

JDBC驱动程序为准备好的语句转义参数?

SQL Server 中的 SQL 注入如何击败转义单引号的卫生设施?