2010-02-17 2 views
1

У меня есть хранимая процедура, которая получает строковый параметр «OrderByColumn» и строит динамический запрос соответственно.
Это часть моей код хранимой процедуры:Динамический запрос и sql-инъекции

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 header header, поэтому нет прямого ввода пользователем, так что я вижу, что нет никакой возможности вставлять какую-либо вещь ...

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

Мой вопрос:

безопасно?

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

+0

Почему вы не используете орм? – Paco

+0

Заключительная часть вашего вопроса вокруг 'ORDER BY' заключается в том, что вы должны явно определять имена столбцов. – 2010-02-17 11:20:13

ответ

1

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

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

Я также прочитал в какой-то книге, что ЗАЯВКА пункта не поддерживает использование параметров.

Вы имели в виду ORDER (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

Если я делаю «случай», как вы это сделали, я не смогу добавить: ASC/DESC, в конце его. – mariki

0

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

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

0

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

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

1

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

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

Смежные вопросы