Soy un desarrollador de escritorio a escribir para los usuarios internos, así que no estoy preocupado por los hackers, pero me gustaría saber si hay algo que pudieran entrar al actualizar un valor que pudiera ejecutar SQL en el servidor.¿Pueden mis usuarios inyectar mi sql dinámico?
El negocio define su esquema de contenido y tengo una aplicación CRUD para ellos que no tiene que cambiarse cuando cambia su esquema porque los detalles de validación son basados en tablas y las actualizaciones son con SQL dinámico. Tengo que admitir comillas simples en su entrada de datos, así que cuando las ingresan, las doblo antes de que se ejecute SQL en el servidor. Por lo que he leído, sin embargo, esto no debería ser suficiente para detener una inyección.
Así que mi pregunta es, ¿qué texto podrían entran en un campo de texto de forma libre que podría cambiar algo en el servidor en lugar de ser almacenados como un valor literal?
Básicamente, estoy construyendo una instrucción SQL en tiempo de ejecución que sigue el patrón:
actualización de campo de tabla del set = valor donde pkField = pkVal
con este código 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
cuando actualice un campo de texto con el valor
Redmond '; drop table OrdersTable--
que genera:
Update caseFile set notes = 'Redmond''; drop table OrdersTable--' where guardianshipID = '001168-3'
y actualiza el valor al valor literal que entraron.
Qué otra cosa podían entrar en ese inyectaría SQL?
Una vez más, no estoy preocupado de que alguien quiere piratear el servidor en su trabajo, pero me gustaría saber cómo si accidentalmente podrían pegar texto desde otro lugar y romper algo.
Gracias.
"No estoy preocupado de que alguien quiere piratear el servidor en su trabajo" - que es mejor que seas, empleados descontentos hacer atacantes bastante desagradables. –
Si fueras uno, ¿qué sql usarías? – Beth
+1 Para una buena pregunta. Esto es algo que me he preguntado acerca de mí mismo. He visto muchas afirmaciones vagas en los libros de texto acerca de que esto es insuficiente, pero nunca hay ninguna explicación de por qué. Estaría encantado si alguien pudiera responder esto correctamente con un ejemplo definitivo de la entrada del usuario que podría causar un problema. Estoy dispuesto a apostar ahora que esto no va a suceder y completar las respuestas no ** que no abordan la pregunta muy específica ** recomendando SQL parametrizado se votará a la parte superior. –