String.Format и SQL-запросы - PullRequest
       4

String.Format и SQL-запросы

1 голос
/ 14 марта 2011

В моем приложении я использую string.Format () для SQL, как это

Dim strSQL As String = "SELECT X FROM MY_TABLE WHERE Y <> {0} AND Z = '{1}'"
    strSQL = String.Format(strSQL, otherObj.Y, myObj.Z)

однажды я провел глобальный «стрессовый» тест с использованием SQL-инъекций (параметры с кавычками и тому подобное) и обнаружил множество ошибок ...

Как в .NET лучше всего «бороться» с этим? Существует ли String.Format или другой распространенный способ правильно (и безопасно) использовать параметры SQL в запросах sql.

Чем бы вы порекомендовали заменить String.Format?

Ответы [ 2 ]

8 голосов
/ 14 марта 2011

Вместо этого используйте параметризованный запрос:

Using conn as new SqlConnection(connString)

    Dim command As new SqlCommand("select x from my_table " + & _
        "where y <> @param1 and z = @param2", conn);

    command.Parameters.Add(new SqlParameter("@param1", otherObj.Y));
    command.Parameters.Add(new SqlParameter("@param2", myObj.Z));

    ' Execute the command and get results

End Using
3 голосов
/ 14 марта 2011

Единственный полностью безопасный способ предотвратить внедрение SQL-кода - не допускать вводимые пользователем данные в ваш фактический оператор SQL.Вместо этого предоставьте переменные данные (например, токены, которые есть в строке формата) через параметры.

Например,

Using cmd As yourConnection.CreateCommand()
    cmd.CommandText = "select x from my_table where y <> @y and z = @z"

    cmd.Parameters.AddWithValue("@y", otherObj.Y)
    cmd.Parameters.AddWithValue("@z", myObj.Z)

    // etc.
End Using

(Использование AddWithValue предполагает, что этоSqlConnection, но для других провайдеров код не сильно отличается, и концепции совпадают)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...