Fortify Sql Injection для Oracle
Когда я сканирую свой проект с помощью статического анализатора кода fortify, он находит результаты Sql Injection.
В окне "Рекомендации" fortify говорится: "Основной причиной уязвимости внедрения SQL-кода является способность злоумышленника изменить контекст в запросе SQL, в результате чего значение, которое программист намеревался интерпретировать как данные, вместо этого будет интерпретироваться как команда. SQL-запрос создан, программист знает, что следует интерпретировать как часть команды, а что - как данные. Параметризованные операторы SQL могут реализовать это поведение путем запрета изменений контекста, ориентированных на данные, и предотвращения почти всех атак внедрения SQL. Параметризованный SQL операторы создаются с использованием строк обычного SQL, но когда необходимо включить предоставленные пользователем данные, они создают параметры связывания, которые являются заполнителями для данных, которые впоследствии вставляются. Параметры связывания позволяют программе явно указывать базе данных, что следует обрабатывать как команда и что следует рассматривать как данные. Когда программа готова выполнить оператор, она указывает на базу данных значения времени выполнения, используемые для значения каждого из параметров привязки, без риска интерпретации данных как команд. "
Посмотри мой код, пожалуйста. Я уже использую параметризованные операторы SQL. Так в чем проблема? Что мне не хватает?
Резюме моего кода;
Dim stateid As String = HttpContext.Current.Request.QueryString.Item("stateid"))
Dim colArgs As COLLECTIONS.ParamterCollection
colArgs = New COLLECTIONS.ParamterCollection
colArgs.Add(DATA.DataPreps.PrepStringForDB(stateid ))
Dim sSQL As String = "SELECT * FROM STATE WHERE N_STATE_ID = :P"
PrepareSQL(sSQL, colArgs, objDBConfigObject)
Dim objCommand As OracleCommand = new OracleCommand(sSQL, connection)
objCommand.CommandTimeout = m_nConnectionTimeout
For Each objArgument In colArgs
objParam = New Oracle.DataAccess.Client.OracleParameter(":P" & CStr(nInArgIndex), objArgument.enOracleType)
objParam.Value = objArgument.varValue
objCommand.Parameters.Add(objParam)
nInArgIndex += 1
objArgument = Nothing
objParam = Nothing
Next
objCommand.CommandType = CommandType.Text
objDataAdapter = New Oracle.DataAccess.Client.OracleDataAdapter(objCommand)
nRecordsAffected = objDataAdapter.Fill(objDataSet)
2 ответа
Параметризованные запросы не являются волшебной пулей. Я бы добавил несколько вещей:
objParam.OracleDbType = Oracle.DataAccess.Client.OracleDbType.VarChar (это тип данных столбца БД)
Убедитесь, что вы проводите проверку ввода для удаления любых опасных символов SQLi.
Выполните некоторую проверку работоспособности передаваемых аргументов. Например, сколько макс символов должно быть в строке stateid?
Вы можете использовать DBMS_ASSERT для проверки всех пользовательских данных.
http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_assert.htm