¿Qué es SQL Injection y por qué importa en OneStream?

Prevent OneStream SQL Injection

Esto surgió recientemente con un cliente. Estaban realizando una auditoría de seguridad sobre las reglas de negocio de OneStream escritas en su aplicación y la auditoría estaba fallando por SQL Injection. Entonces, ¿qué es SQL Injection y cómo lo evitamos en OneStream?

Dim dt as New DataTable
 Dim strSalesPersonFirstName As String = "John"
 Dim strSalesPersonLastName As String = "Doe"
 Dim strCity As String = Nothing
 using dbconn As DbConnInfo = BRApi.Database.CreateApplicationDbConnInfo(si)
        Dim Sql As String = String.Empty
        sql = $"SELECT City from XFC_TableView_SalesPerson WHERE SalesPersonFirstName = '{strSalesPersonFirstName}' AND SalesPersonLastName = '{strSalesPersonLastName}';"
        dt = BRApi.Database.ExecuteSqlUsingReader(dbConn,sql.ToString,False)
        If Not dt is Nothing Then
           For Each RowNotInTableException As DataRow In dt.Rows
                    strCity = RowNotInTableException.Item("City")
           Next
        End If
        brapi.ErroLog.LogMessage(si,"City=" & strCity.ToString)
 End Using

La consulta SQL es interpretada por VB.Net, que reemplaza las variables de cadena en la consulta y luego pasa la consulta completa a la base de datos. Ese enfoque puede ser vulnerable si los valores no se controlan adecuadamente.

Syntax
Public Function ExecuteSqlUsingReader(ByVal dbConn As DbConnInfo, ByVal sqlStatement As String, ByVal dbParaminfos As List(Of DbParaminfo),
ByVal useCommandTimeoutLarge As Boolean) As DataTable

dbParamInfo es una lista de objetos DbParamInfo. Básicamente, se carga la lista con los parámetros y sus valores para la consulta SQL parametrizada y luego se pasa a BRApi.Database.ExecuteSql o BRApi.Database.ExecuteSqlUsingReader.

1. Cree un objeto DbParamInfo y agregue sus variables

Dim dt as New DataTable
 Dim strSalesPersonFirstName As String = "John"
 Dim strSalesPersonLastName As String = "Doe"
 Dim strCity As String = Nothing
 Dim dbParamInfos As New List(Of DbParamInfo)
 dbParamInfos.Add(New DbParamInfo("strSalesPersonFirstName", strSalesPersonFirstName))
 dbParamInfos.Add(New DbParamInfo("strSalesPersonLastName", strSalesPersonLastName))

2. Parametrice su consulta SQL

Using dbConn As DbConnInfo = BRApi.Database.CreateApplicationDBConnInfo(si)
Dim Sql As String = String.Empty
 sql = $"SELECT City from XFC_TableView_SalesPerson WHERE SalesPersonFirstName = @strSalesPersonFirstName AND SalesPersonLastName = @strSalesPersonLastName;"

3. Pase juntos la consulta SQL y el objeto DbParamInfo

Finalmente, pase tanto la consulta SQL como el objeto DbParamInfo por separado a la llamada de ejecución. Mantener los parámetros separados de la consulta ayuda a evitar SQL Injection y mejora la seguridad del código.

La consulta completa

Dim dt as New DataTable
 Dim strSalesPersonFirstName As String = "John"
 Dim strSalesPersonLastName As String = "Doe"
 Dim strCity As String = Nothing
  Dim dbParamInfos As New List(Of DbParamInfo)
 dbParamInfos.Add(New DbParamInfo("strSalesPersonFirstName", strSalesPersonFirstName))
 dbParamInfos.Add(New DbParamInfo("strSalesPersonLastName", strSalesPersonLastName))
 using dbconn As DbConnInfo = BRApi.Database.CreateApplicationDbConnInfo(si)
        Dim Sql As String = String.Empty
        sql = $"SELECT City from XFC_TableView_SalesPerson WHERE SalesPersonFirstName = @strSalesPersonFirstName AND SalesPersonLastName = @strSalesPersonLastName;"
        dt = BRApi.Database.ExecuteSqlUsingReader(dbConn,sql.ToString,dbParamInfors,False)
        If Not dt is Nothing Then
           For Each RowNotInTableException As DataRow In dt.Rows
                    strCity = RowNotInTableException.Item("City")
           Next
        End If
        brapi.ErroLog.LogMessage(si,"City=" & strCity.ToString)
 End Using

No es un cambio grande en la forma habitual de escribir consultas SQL en OneStream, y ayuda a evitar inyecciones SQL y a superar auditorías de seguridad.

Contacto

MindStream Analytics

Para saber más sobre OneStream y cómo MindStream Analytics puede ayudarle a mejorar su planificación, reporting y analítica, complete el siguiente formulario.