Предотвращение SQL-инъекций с помощью «AS QUERY» - PullRequest
0 голосов
/ 24 октября 2019

У меня есть следующий код, который кажется довольно стандартным по номинальной стоимости, однако в запросе есть еще один оператор SQL, поэтому «AS QUERY» находится в конце строки SQL. Я хотел знать, существует ли сложный подход к параметризации следующей команды SQL вместо объединения всего запроса вместе.

Единственное решение, которое я мог бы придумать, состоит в том, чтобы вместо запроса в виде строки иметь его как объект типа SQLCommand и инициировать 2 команды. От 1 до может, а другой - для предварительного просмотра данных.

public static CommandStatus<int> GetQueryRecordCount(SqlConnection connection, String query)
{
    String sql = "SELECT COUNT(1) FROM (" + query + ") AS QUERY";
    SqlCommand cmd = new SqlCommand();
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = sql;
    cmd.Connection = connection;
    cmd.CommandTimeout = GetTimeout();

    try
    {
        SqlDataReader dataReader = cmd.ExecuteReader();
        dataReader.Read();

        String count = dataReader[0].ToString();
        dataReader.Close();

        return new CommandStatus<int>(Int32.Parse(count));
    }
    catch (Exception e)
    {
        return new CommandStatus<int>("Failed to GetQueryRecordCount[" + sql + "]:" + e.Message, e);
    }
}

Строка SQL в конечном итоге будет выглядеть примерно так

"SELECT COUNT(1) FROM (SELECT TOP 20 [RecordID],[Name],[SonsName],[DadsName],[MothersName],[DaughtersName] FROM [dbo].[sample] ) AS QUERY"

1 Ответ

0 голосов
/ 24 октября 2019

Эта функция буквально является SQL-инъекцией.

Белый список SQL-запросы, которые примет эта функция, - единственный способ сделать ее безопасной.

То есть вызывающий абонент не сможет внедрить любой запрос SQL, он сможет выбирать только из фиксированного списка предварительно проверенных запросов. Список может даже быть определен как массив статических строк в функции, которую вы показываете.

Но тогда им не нужно передавать весь запрос в виде строки, им нужно только передать порядковое целое число, чтобы идентифицироватькакой запрос в белом списке выполнить.

...