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

Is SQL injection possible when using MS Access linked tables to a SQL server back-end

我一直在对此进行一些研究,但到目前为止还是一片空白。这就是情况。

我正在开发一个链接到 SQL 服务器后端的 MS Access 前端。

我部分地在访问 SQL 数据库时使用链接 tables/forms - 这样当用户更新表单中的值时,Access 会自动(我没有代码) ) 更新 SQL 数据库中的值。

所以我的问题是 - 这是否容易受到 SQL 注入的影响?或者将以任何可能的 SQL 注入代码简单地添加到数据库 'as is' 而不是在服务器上解析并且可能 运行 一些恶意代码。

在此先感谢您对此的任何指点!

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

is this vulnerable to SQL injection in any way?

没有

Or will Access 'parameterize' the update in such a way that any possible SQL injection code will simply be added to the DB 'as is'

是的。


来自 David Fenton 的 https://www.pcreview.co.uk/threads/sql-injection-characters-cleaning-function.4021211/#post-14022015

  1. SQL injection is most relevant for applications that do all their editing with SQL. While that would apply to a website backed by a Jet/ACE database (see #1), it doesn't apply to a standard Access app, which doesn't use SQL to edit bound data. That is, most of the data editing in an Access application is via bound forms rather than through SQL, so it's not really going to be susceptible to SQL injection.

编辑:

您可以使用 Logging ODBC, SQL Server 查看 Access 如何通过 ODBC 与 SQL 服务器交互。

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

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

SQL 注入的概念没有有效的证明 运行 服务器端 T-SQL 代码是可能的,或者我知道这是可能的。

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

所以链接表,这些链接表的绑定表单不受服务器端注入的影响。

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

例如:

strSQL = "select * from tblCustomers where InvoiceID = " me.TextBoxPrompt

在上面,预计用户输入 234324(发票编号)。但是,用户可以键入已知的 VBA 函数。根据您拥有的沙盒模式设置,可能会输入意料之外的表达式。这实际上可能因此导致一些 VBA 到 运行。 (用户必须知道 public VBA 函数到 运行)。

所以在上面,并不是真正的sql注入,而是VBA注入(这里有点语义,但是区别很重要)。

所以一些有限形式的 sql 注入可以发生在客户端,但是这样的表达永远不会到达服务器。

归根结底,这意味着通过采用 SQL 服务器,您不会以任何方式增加 SQL 注入的可能性超过标准 Access 产品(我指出的是一些有限类型的注入可能会发生)。

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