我的用户可以注入我的动态sql吗?
我是一个为内部用户撰写的桌面开发人员,所以我不担心恶意黑客,但我想知道在更新可以在服务器上执行sql的值时是否有任何可以输入的内容。
业务定义了他们的内容模式,并且我有一个CRUD应用程序,当他们的模式更改时不需要更改,因为验证详细信息是表驱动的,更新使用动态SQL。 我必须在他们的数据输入中支持单引号,所以当他们输入时,我会在服务器上执行SQL之前将它们加倍。 但是,从我读过的内容来看,这不足以阻止注射。
所以我的问题是,他们可以在自由形式的文本字段中输入哪些文本,这些文本可以改变服务器上的某些内容而不是存储为字面值?
基本上,我在运行时按照模式构建SQL语句:
更新表set field = value其中pkField = pkVal
与此VB.NET代码:
Friend Function updateVal(ByVal newVal As String) As Integer
Dim params As Collection
Dim SQL As String
Dim ret As Integer
SQL = _updateSQL(newVal)
params = New Collection
params.Add(SQLClientAccess.instance.sqlParam("@SQL", DbType.String, 0, SQL))
Try
ret = SQLClientAccess.instance.execSP("usp_execSQL", params)
Catch ex As Exception
Throw New Exception(ex.Message)
End Try
Return ret
End Function
Private Function _updateSQL(ByVal newVal As String) As String
Dim SQL As String
Dim useDelimiter As Boolean = (_formatType = DisplaySet.formatTypes.text)
Dim position As Integer = InStr(newVal, "'")
Do Until position = 0
newVal = Left(newVal, position) + Mid(newVal, position) ' double embedded single quotes '
position = InStr(position + 2, newVal, "'")
Loop
If _formatType = DisplaySet.formatTypes.memo Then
SQL = "declare @ptrval binary(16)"
SQL = SQL & " select @ptrval = textptr(" & _fieldName & ")"
SQL = SQL & " from " & _updateTableName & _PKWhereClauses
SQL = SQL & " updatetext " & _updateTableName & "." & _fieldName & " @ptrval 0 null '" & newVal & "'"
Else
SQL = "Update " & _updateTableName & " set " & _fieldName & " = "
If useDelimiter Then
SQL = SQL & "'"
End If
SQL = SQL & newVal
If useDelimiter Then
SQL = SQL & "'"
End If
SQL = SQL & _PKWhereClauses
End If
Return SQL
End Function
当我更新文本字段的值
雷蒙德'; 下拉表OrdersTable--
它会产生:
Update caseFile set notes = 'Redmond''; drop table OrdersTable--' where guardianshipID = '001168-3'
并将值更新为它们输入的文字值。
他们还可以输入什么来注入SQL?
再说一遍,我并不担心有人想在他们的工作中破解服务器,但是想知道他们是否可以不小心从其他地方粘贴文本并破坏某些东西。
谢谢。
假设你转义字符串(根据你所说的话),你应该是安全的。 我唯一能想到的其他事情是,如果您使用基于Unicode的字符集与数据库进行通信,请确保您发送的字符串在该编码中有效。
无论您如何清理用户输入,增加攻击面都是您正在做的事情的真正问题。 如果您回顾SQL注入的历史,您会注意到随着时间的推移,涌现出新的甚至更有创意的方式来破坏它们。 虽然你可能已经避免了已知的事情,但它始终存在着潜在的问题,使得这类代码很难生成。 你会更好地简单地使用不同的方法。
您也可以评估替代解决方案。 使用参数动态生成SQL。 像这样的东西:
// snippet just for get the idea
var parameters = new Dictionary<string, object>();
GetParametersFromUI(parameters);
if (parameters.ContainsKey("@id")) {
whereBuilder.Append(" AND id = @id");
cmd.Parameters.AddWithValue("@id", parameters["@id"]);
}
...
链接地址: http://www.djcxy.com/p/42821.html