我需要在我们被分配维护的非IT应用程序中修复一些安全问题。它位于Microsoft Access前端(SQL Server后端)。
有谁知道SQL注入是否可以通过Microsoft Access控件的RecordSource或RowSource属性完成?例如,如果我将列表框的recordsource设置为
Me.SomeListBox.Recordsource = 'SELECT * FROM SomeTable WHERE SomeField = ''' & Me.txtSomeTextBox & '''.
我不确定微软是否内置了这些属性的预防,所以我想知道我是否应该通过清理功能运行Me.txtSomeTextBox。
这当然是一个快速修复...应用程序将在今年晚些时候重新设计并从Access(yay!)迁移出来。
先谢谢你们!
如果你正在进行字符串连接,那么你很容易受到攻击。
可以使用VBA消除WHERE条件中字段名称的明显使用。
Sub btnLogin_OnClick()
If instr(0, me.txtBox, someFieldName) > 0 Then
Msgbox("Foo Bar!")
Else
Login
End If
End Sub
在你的情况下,注入不能使它到SQL服务器。通过链接表访问本地查询是有限的一个SQL语句。因此,尽管可以“注入”Access的“小”,但是sql字符串不能作为多个sql语句到达SQL服务器,也不能使用给定的示例运行服务器端SQL。
所以“内置预防”是这样的SQL仅限于一个字符串。
因为结果字符串不能是多个sql语句,并且因为文本框结果是“引用”,所以你只能提供一个字符串表达式作为条件,并且你的例子不可能注入sql。
如果有人可以根据文本框的示例VBA sql + concat发布一个有效的注入示例,那么我全都耳朵。
因此,虽然在Access中可能会出现“一些”注入的情况,但您所拥有的示例肯定不是我所知道的这种情况。
知识渊博的用户可能会在该表达式中运行VBA()函数,但他们必须知道实际VBA函数的名称。即使在这种情况下,也不会执行一些你不想要的SQL。
我想可以查看删除记录的任何sql字符串,并且可以查看用户提供的值/表达式,但是您给出的示例不是典型的SQL注入风险。
回答你原来的问题:这取决于控制。列表框和组合框可以将选择查询作为其记录源。不是动作查询。
文本框控件只能绑定到表字段。
这些控件不可供任何最终用户使用,以便在编译为.accde文件类型时可以重新定义记录源。
Me.SomeListBox.Recordsource = 'SELECT * FROM SomeTable WHERE SomeField = ''' & Me.txtSomeTextBox & '''
你可以做一个包装器,只是为了避免破坏组合的SQL查询,例如
Me.SomeListBox.Recordsource = 'SELECT * FROM SomeTable WHERE SomeField = ''' & Replace(Me.txtSomeTextBox,"'","''") & '''
在这种情况下,您添加配对的'符号(' - >''),查询将不会被破坏。