避免 MS Access 中的 SQL 注入

Isa*_*man 2 sql ms-access vba

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

可以说我有一个tblCustomer字段CustName,PhoneAddress。还可以说我有一个供新客户输入数据的输入表单,其中的控件名为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
Run Code Online (Sandbox Code Playgroud)

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

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

Tim*_*sen 5

使用带有位置参数的准备好的语句可以消除有人 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
Run Code Online (Sandbox Code Playgroud)