Динамический запрос и SQL инъекций - PullRequest
1 голос
/ 17 февраля 2010

У меня есть хранимая процедура, которая получает строковый параметр "OrderByColumn" и соответственно строит динамический запрос.
Это часть моего кода хранимой процедуры:

ROW_NUMBER() OVER (ORDER BY 
  CASE WHEN @OrderByColumn='Date' AND @OrderDirection=0 THEN tbl_Docs.Date END ASC,
  CASE WHEN @OrderByColumn='Count' AND @OrderDirection=0 THEN tbl_Docs.Count END ASC,

И в моем коде функции, которая вызывает процедуру сохранения, у меня есть:

cmd.Parameters.Add("@OrderByColumn", SqlDbType.NVarChar).Value = orderByColumn;
cmd.Parameters.Add("@OrderDirection", SqlDbType.Int).Value = orderDirection;

Пользователь устанавливает параметр OrderByColumn, щелкая заголовок столбца gridviews, чтобы не было прямого ввода данных пользователем, так как я вижу, что нет никакой возможности ввести что-либо ...

В книге они также проверяют строку orderByColumn, я не понимаю, зачем это нужно, потому что, как я заметил, пользователь не может вводить прямое выражение.

Мой вопрос:

это безопасно?

Я также читал в одной книге, что предложение ORDER BY не поддерживает использование параметров.
Что это значит?

Ответы [ 4 ]

1 голос
/ 17 февраля 2010

безопасно?
Да, это выглядит хорошо. Значение не объединяется в строку SQL для последующего выполнения, плюс вы фактически проверяете явную проверку на наличие определенных допустимых значений.

Я также читал в одной книге, что предложение ORDER BY не поддерживает использование параметров. Что это значит?
Это означает, что вы не можете сделать (например, "ORDER BY @SomeVariable", где @SomeVariable - столбец для упорядочения). Следовательно, вам нужно использовать подход CASE, как вы делаете.

1 голос
/ 17 февраля 2010

Это кажется достаточно безопасным для использования.

Я не полностью следую этому разделу

Я также читал в одной книге, что предложение ORDER BY не поддерживает использованиепараметры.

Вы имеете в виду ЗАКАЗ (ASC / DESC) или столбец?

Если вы ссылаетесь на столбец, вы можете достичь этого.Что-то вроде

DECLARE @Table TABLE(
        ID INT,
        Val INT
)

INSERT INTO @Table SELECT 1, 3
INSERT INTO @Table SELECT 2, 2
INSERT INTO @Table SELECT 3, 1

DECLARE @FieldNumber INT

SELECT @FieldNumber = 1

SELECT *
FROM    @Table
ORdER BY 
            CASE @FieldNumber 
                WHEN 1 THEN ID
                WHEN 2 THEN Val
            END

SELECT @FieldNumber = 2

SELECT *
FROM    @Table
ORdER BY 
            CASE @FieldNumber 
                WHEN 1 THEN ID
                WHEN 2 THEN Val
            END
0 голосов
/ 17 февраля 2010

Я считаю, что это также безопасно ... Содержимое параметра не включается напрямую в запрос, выданный хранимой процедурой - вы просто тестируете параметр, чтобы решить, что добавить в запрос самостоятельно.

Я думаю, у тебя может быть чистая совесть ...

0 голосов
/ 17 февраля 2010

Проверка не ограничивается атаками SqlInjection, может быть много других причин, по которым нужно проверять ввод.

Parameters обрабатывается аналогично пункту OVER, как constant и игнорируется. поэтому дело не в поддержке параметров, а в полученных вами результатах, на которые не влияет использование

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