在添加将在服务器上运行的代码、命令或附加 SQL 代码的经典意义上,对于使用链接表时的标准注入,答案是否定的。这是因为客户端上的任何 T-SQL 代码都不会通过 ACE 数据库引擎传递,并且多个命令(例如用 ; 分隔)不会传递到服务器端。
然而,在访问应用程序中可能会发生一些“可能的”注入,并且同样适用于链接表。换句话说,在这种组合中引入 SQL 服务器或使用内置数据库引擎不受经典注入的影响。
所以这里的上下文非常重要。因此,真正的问题是访问应用程序会受到 SQL 注入吗?如果发现一个与内置 ACE 引擎配合使用的工作证明示例,那么如果您使用 SQL Server 的链接表,也会存在相同的注入。
没有可行的 SQL 注入概念证明可以运行服务器端 T-SQL 代码,或者我知道这是可能的。
但是,如果 VBA 代码使用传递查询,那么答案肯定是肯定的,因为 Access 客户端会将原始 t-sql 传递到服务器端,并且不会触及此类 t-sql 命令和 t-sql 语句。因此,提示输入某些参数值,然后在 VBA 中连接到某些原始 t-sql 语句,然后发送到 SQL Server 的表单肯定会受到 SQL 注入的影响。
因此,链接表、绑定到这些链接表的表单不受服务器端注入的影响。
在某些可能的情况下,从表单文本框中提取的表达式用作 Access sql 中的参数可能会修改开发人员的意图。
Eg:
strSQL =“从tblCustomers中选择*,其中InvoiceID =” me.TextBoxPrompt
在上面,预计用户输入 234324(发票号码)。但是,用户可以输入已知的 VBA 函数。根据您拥有的沙盒模式设置,可能会输入意外的表达式。事实上,这可能会导致某些 VBA 运行。 (用户必须了解要运行的公共 VBA 函数)。
所以在上面,它实际上并不是sql注入,而是VBA注入(这里有一点语义,但区别很重要)。
因此,某些有限形式的 SQL 注入可能会发生在客户端,但此类表达式永远不会到达服务器。
归根结底,这意味着通过采用 SQL Server,与标准 Access 产品相比,您不会以任何方式增加 SQL 注入的可能性(其中我指出了可能发生的一些有限类型的注入)。
此规则的唯一例外是,如果 Access 应用程序使用原始发送到 SQL Server 的传递查询,并且用户参数以原始格式从表单获取并直接传递到 SQL Server。因为我经常使用作为字符串和用户提示结果的传递查询,所以这是一个问题。我经常使用字符串而不是真正的 ADO 参数(工作量太大)。为了防止注入,我有一个小函数可以从给定的字符串中删除“;”和 () 字符。因此,这个小例程可以防止将其他命令发送到由“;”分隔的 SQL 服务器。例如。