【问题标题】:Avoiding SQL Injection in MS Access [duplicate]避免 MS Access 中的 SQL 注入
【发布时间】:2018-10-14 09:57:34
【问题描述】:

我试图更好地理解参数化 sql 作为 SQL 注入的解决方案。

假设我有一个tblCustomer 字段CustNamePhoneAddress。还可以说我有一个输入表单供新客户输入他们的数据,控件名为txtNametxtPhonetxtAddress

可以运行以下 vba 代码:

dim strName, strPhone strAddress, strSQL as string
strName = me.txtName
strPhone = me.txtPhone
strAddress = me.txtAddress
strSQL = "INSERT INTO tblCustomer (CustName, Phone, Address) _
VALUES (" & strName & ", " & strPhone & ", " & strAddress & ");"

DoCmd.RunSQL strSQL

但是如果有人指定地址 "Robert'); DROP TABLE tblCustomer; --" (wink) 我会遇到一些严重的问题。

我使用了 vba 参数,但它们对我没有帮助。那么当人们说使用参数来解决问题时,他们的意思是什么

【问题讨论】:

    标签: sql ms-access vba


    【解决方案1】:

    使用带有位置参数的准备好的语句消除了有人可能会向您注入 SQL 的机会:

    strSQL = "INSERT INTO tblCustomer (CustName, Phone, Address) " &
        "VALUES ([str_name], [str_phone], [str_address]);"
    
    Set qdf = db.CreateQueryDef(vbNullString, strSql)
    With qdf
        .Parameters("str_name").Value = strName
        .Parameters("str_phone").Value = strPhone
        .Parameters("str_address").Value = strAddress
        .Execute dbFailOnError
    End With
    

    【讨论】:

    • 这看起来正是我正在寻找的,和/但我有问题: 1. 你为什么不必定义“qdf”?如果你不这样做,它会自动成为一个变体吗?我们是否需要它成为一个变体,以便它简单地执行我们在 vba 中所说的,唯一的目的是节省我们的打字/空间?如果您在 Option Explicit 中工作,这是不允许的吗? 2.为什么用vbNullString作为QueryDef的名字?这是为了避免每次我们为查询定义参数时实际创建和记录一个新的 QueryDef 对象吗? 3. 为什么不运行 PARAMETERS 语句和 INSERT 语句?
    • 哇。我以为那里会有一些换行符。对不起。看起来像一团糟,充满要求的气喘吁吁的咆哮。
    • 我不是 VBA 人员,但我对语句的了解足以为您提供至少朝着正确方向迈出的一步。只要您在查询字符串中正确分隔关键字和数据(即不要使用SELECTcolFROMmyTable,因为这显然不会运行),空格应该无关紧要。
    • 不确定您指的是什么重新空白...我对换行符的评论是指我自己上面的评论,以防引起混淆。相信我,我只在 VBA 中工作了大约 6 周。与我相比,你绝对是 vba 的 mvp... :P
    • K.和一个伙伴坐下来,弄清楚你在回答中的大部分意思。不过,您能否确认几件事:您是否使用了 With qdf,而不仅仅是 qdf.Parameters(... 每次只是为了节省您多次编写 qdf如果在此过程中遇到错误,则将其发送到数据?
    【解决方案2】:

    看这里:

    https://msdn.microsoft.com/en-us/library/office/ff845220.aspx

    一个冗长的解释是,参数化查询允许您在 SQL 查询中使用变量,如果该变量是字符串或与您的数据类型匹配(用于类型检查),该变量将被正确转义,并防止出现问题你已经列出来了。

    【讨论】:

      猜你喜欢
      • 2012-09-23
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 2011-08-16
      • 2014-04-29
      • 1970-01-01
      • 2014-06-16
      • 1970-01-01
      相关资源
      最近更新 更多