2015-04-03 4 views
3

Чтобы защитить от внедрения sql, я прочитал во введении к ColdFusion, что мы должны использовать тег cfqueryparam.С хранимыми процедурами требуется cfSqlType?

Но при использовании хранимых процедур, я передаю мои переменные, соответствующие объявления переменных в SQL Server:

DROP PROC Usr.[Save] 
GO 
CREATE PROC Usr.[Save] 
(@UsrID Int 
,@UsrName varchar(max) 
) AS 
UPDATE Usr 
SET UsrName = @UsrName 
WHERE [email protected] 
exec Usr.[get] @UsrID 

Q: Есть ли какое-либо значение в том числе cfSqlType, когда я звоню хранимую процедуру? Вот как я сейчас делаю это в Lucee:

storedproc procedure='Usr.[Save]' { 
    procparam value=Val(form.UsrID); 
    procparam value=form.UsrName; 
    procresult name='Usr'; 
} 
+3

Всегда данные задают ваши параметры. –

+3

Согласовано. [Существует несколько причин для типизации параметров] (http: // stackoverflow.ком/вопросы/27049918/ColdFusion-параметризующий-а-querie/27066113 # 27066113). Хотя это относится к параметрам запроса, те же проблемы относятся к хранимым процессам. – Leigh

+0

Это действительно действительно хорошая идея для проверки ваших параметров перед передачей их в запрос. Возможно, вы это делаете, но я обычно добавляю параметры 'form' (а также' url' в область 'variables', как только они будут проверены. –

ответ

4

Этот вопрос пришел косвенно в другом потоке. Этот поток был посвящен параметрам запроса, но те же самые проблемы относятся к процедурам. Подводя итог, да, вы всегда должны вводить параметры запроса и proc. Перефразируя другой ответ:

Поскольку cfsqltype не является обязательным, его значение часто недооценивается:

  • Validation: ColdFusion использует выбранный cfsqltype (дата, номер, и так далее) для проверки " стоимость". Это происходит до любой sql всегда отправляется в базу данных . Поэтому, если значение «value» недействительно, например «ABC» для типа cf_sql_integer, вы не теряете почтовый вызов базы данных на sql, который никогда не работал . Когда вы опускаете cfsqltype, все равно представлено в виде строки, и вы теряете дополнительную проверку.

  • Точность: Using an incorrect type may cause CF to submit the wrong value to the database. Выбор правильного cfsqltype гарантирует, что вы отправили правильное значение - и - отправив его в недвусмысленном формате , база данных будет интерпретировать то, как вы ожидаете.

    Опять же, технически вы можете опустить cfsqltype. Однако, что означает, что CF отправит все в базу данных в виде строки. Следовательно, база данных будет выполнять implicit conversion (обычно нежелательно). При неявном преобразовании интерпретация строк оставлена ​​полностью до базы данных - и она может быть не всегда придумывать ответ, который вы ожидаете.

    Представление дат как строк, а не объектов даты, является основным примером . Как ваша база данных будет интерпретировать строку даты, например «05/04/2014»? Как 5 апреля или 4 мая? Смотря как. Измените базу данных или настройки базы данных, и результат может быть полностью .

Единственный способ обеспечить стабильные результаты, чтобы указать соответствующий cfsqltype. Он должен соответствовать типу данных целевого столбца/функции целевого (или, по крайней мере, эквивалентного типа).

+1

В редких случаях неявное преобразование также может отрицательно влиять на производительность запросов. В некоторых случаях оптимизатор может решить, что для выполнения сравнения необходимо присвоить значения индексированного столбца разному типу. Это может привести к плохим планам выполнения. Оптимизаторы обычно достаточно умны, чтобы этого избежать, но .. это может случиться по случаю. Использование правильного типа позволяет избежать проблемы вообще. – Leigh

+1

Означает ли это, что мы также должны вводить параметры запроса, которые не будут меняться как целые числа? например

+2

@TusharBhaware - IMO, no. Использование явного 'cast/convert' более подходит для статических значений, чем использование cfqueryparam. Основная цель параметров запроса - помочь кэшу ядра базы данных выполнить план выполнения запроса, значения которого могут измениться. Когда значения статичны, базы данных, такие как SQL Server, будут кэшировать план в любом случае, даже без cfqueryparam. Итак, IMo, вам лучше использовать явный 'cast/convert'. Честно говоря, я не всегда использую 'cast' для простых' бит' или 'int', т.е. 1/0, но я делаю это для двусмысленных значений, таких как строки даты, десятичные числа и т. Д. – Leigh

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