Sql server 使用MS Access链接表到SQL server后端时,是否可以进行SQL注入

Sql server 使用MS Access链接表到SQL server后端时,是否可以进行SQL注入,sql-server,ms-access,sql-injection,Sql Server,Ms Access,Sql Injection,我一直在做一些这方面的研究,但到目前为止还是一片空白。情况是这样的 我正在开发一个连接到SQL Server后端的MS Access前端 在某种程度上,我使用链接表/表单访问SQL DB——这样,当用户更新表单中的值时,Access会自动(我没有代码)更新SQL DB中的值 所以我的问题是,这是否容易受到SQL注入的影响?或者将访问“参数化”更新,使任何可能的SQL注入代码只需按原样添加到DB中,而不是在服务器上解析并可能运行某些恶意代码 提前感谢您对这方面的任何指点 使用绑定表单而不运行手动构

我一直在做一些这方面的研究,但到目前为止还是一片空白。情况是这样的

我正在开发一个连接到SQL Server后端的MS Access前端

在某种程度上,我使用链接表/表单访问SQL DB——这样,当用户更新表单中的值时,Access会自动(我没有代码)更新SQL DB中的值

所以我的问题是,这是否容易受到SQL注入的影响?或者将访问“参数化”更新,使任何可能的SQL注入代码只需按原样添加到DB中,而不是在服务器上解析并可能运行某些恶意代码


提前感谢您对这方面的任何指点

使用绑定表单而不运行手动构造的查询:

这是否容易受到SQL注入的影响

没有

或者将访问“参数化”更新,这样任何可能的SQL注入代码都将简单地“按原样”添加到DB中


大卫·芬顿摘自:

  • SQL注入最适合于完成所有任务的应用程序 使用SQL进行编辑。而这将适用于由 Jet/ACE数据库(见#1),它不适用于标准访问 应用程序,不使用SQL编辑绑定数据。也就是说,大多数 Access应用程序中的数据编辑是通过绑定表单而不是 通过SQL,所以它实际上不会受到SQL的影响 注射
  • 编辑:


    您可以使用查看Access如何通过ODBC与SQL Server准确交互。

    使用绑定表单而不运行手动构造的查询:

    这是否容易受到SQL注入的影响

    没有

    或者将访问“参数化”更新,这样任何可能的SQL注入代码都将简单地“按原样”添加到DB中


    大卫·芬顿摘自:

  • SQL注入最适合于完成所有任务的应用程序 使用SQL进行编辑。而这将适用于由 Jet/ACE数据库(见#1),它不适用于标准访问 应用程序,不使用SQL编辑绑定数据。也就是说,大多数 Access应用程序中的数据编辑是通过绑定表单而不是 通过SQL,所以它实际上不会受到SQL的影响 注射
  • 编辑:


    您可以使用查看Access如何通过ODBC与SQL Server准确交互。

    在添加代码、命令或将在服务器上运行的其他SQL代码的传统意义上,使用链接表时,对于标准注入,答案是否定的。这是因为客户端上的任何T-SQL代码都不会通过ACE数据库引擎传递,并且多个命令(比如用a;)也不会传递到服务器端。 但是,access应用程序中可能会发生一些“可能的”注入,链接表也是如此。换句话说,在这种组合中引入SQL server或使用内置数据库引擎不受经典注入的约束

    所以这里的上下文非常重要。因此,真正的问题是access应用程序是否要接受SQL注入?如果您找到了一个与内置ACE引擎一起工作的工作示例的证明,那么如果您使用链接表到SQL server,那么同样的注入也将存在

    目前还没有SQL注入概念的工作证明,可以运行服务器端T-SQL代码,或者我知道这是可能的

    但是,如果VBA代码使用传递查询,那么答案肯定是肯定的,因为Access客户端将把原始t-sql传递到服务器端,而不接触此类t-sql命令和t-sql语句。因此,一个表单提示输入一些参数值,然后在VBA中连接到一些原始t-sql语句,然后发送到sql server,它肯定会接受sql注入

    因此,链接表、绑定到这些链接表的表单不受服务器端注入的约束

    在某些情况下,从用作Access sql参数的表单文本框中提取的表达式可能会修改开发人员的意图

    例如:

    strSQL=“从tblCustomers中选择*,其中InvoiceID=“me.TextBoxPrompt”

    在上面的示例中,预期用户键入234324(发票号)。但是,用户可以键入已知的VBA函数。根据您的沙盒模式设置,可以输入一个不需要的表达式。这实际上可能导致某些VBA运行。(用户必须知道公共VBA函数才能运行)

    因此在上面,它实际上不是sql注入,而是VBA注入(这里有一点语义,但区别很重要)

    因此,一些有限形式的sql注入可能发生在客户端,但这种表达式永远不会到达服务器端

    归根结底,这意味着通过采用SQL server,SQL注入的可能性不会以任何方式超过标准Access产品(我指出了一些有限的注入类型)


    此规则的唯一例外是,如果Access应用程序使用原始发送到SQL server的传递查询,并且用户参数以原始格式从表单中获取并直接传递到SQL server。因为我经常使用由字符串和用户提示生成的传递查询,所以这是一个问题。我经常使用字符串而不是真正的ADO参数(工作量太大)。为了防止注入,我有一个小函数,从给定字符串中删除“;”和()字符。因此,这个小例程可以防止向SQL server发送由“;”分隔的其他命令。

    在添加代码、命令或将在服务器上运行的其他SQL代码的传统意义上,答案是否定的