Я только что испытал поведение, которое бросает вызов любой логике и потенциально может привести к серьезным проблемам, и задалось вопросом, была ли ошибка , или было ли поведение изменено и какие методы лучше всего обойти проблему? Если это ошибка, есть ли патч?ColdFusion 9: int и type = "numeric" неприятная ошибка?
Вот два поведенческих поведения, которые при объединении представляют собой угрозу целостности данных любой системы.
int('1 2')
->41276
isValid('numeric', '1 2')
->true
Почему? Ну давайте посмотрим ...
<cffunction name="deleteSomething" access="public" returntype="void">
<cfargument name="somethingId" type="numeric" required="yes">
<cfquery datasource="#dsn()#">
DELETE
FROM Something
WHERE id = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.somethingId#">;
</cfquery>
</cffunction>
<cfset deleteSomething('1 2')>
Здесь проверка type="numeric"
аргументы (которые, возможно, основывается на том же алгоритме, как isValid
?) Не бросает с '1 2'
. Хуже того, cfqueryparam cfsqltype="cf_sql_integer"
, кажется, использует int
для преобразования значения, которое в конечном итоге будет 41276
.
Другими словами, deleteSomething('1 2')
удалит объект с id 41276
вместо того, чтобы выбрасывать исключение, поскольку значение 1 2
, очевидно, не является числовым.
Теперь, единственное исправление, о котором я думал, состоит в том, чтобы выполнить дополнительную проверку аргумента с использованием isValid('integer', ...
или регулярного выражения, но это настоящая боль, и, кроме того, я никогда не понимал, почему они не реализовали type="integer"
?
Очевидно, что я всегда делал ложное предположение, что cfqueryparam type="cf_sql_integer"
будет проверять, что переданное значение является действительным целым числом.
EDIT:
Кажется, что даже isvalid('integer', ...
также не надежны, как мы можем видеть в
Why isvalid("integer","1,5") = YES?
EDIT2:
Я знаю, что я мог бы добавить проверку additionnal аргументы для каждого ожидаемого целого аргумент в каждой функции, однако это потребует исправить огромную базу кода в моем случае, и это также очень подвержено ошибкам. Это также делает встроенную проверку аргумента совершенно бесполезной в этом случае.
Я бы предпочёл решение, в котором я мог создать и применить неофициальный патч. Это реалистичный вариант? Если так, я бы хотел, чтобы вас указали в правильном направлении.
EDIT3: он не решает все проблемы, но CF11 добавила поддержку конфигурации уровня приложения strictNumberValidation.
«Начиная с ColdFusion 11, эта функция оценивает на более строгой основе. Установка этого значения ложь делает IsValid функцию ведут себя в старой дороге. Эта настройка эффектов cfargument, cfparam и cfform теги везде, где integer & используется цифровая проверка.На основании этого параметр, проверка отражает в этих тегах, а «
Duplicate question of: http://stackoverflow.com/questions/11535979/why-isvalidinteger-1-5-yes похоже, что adobe не фиксирует это. – Jarede
@ Jarede, Спасибо за ссылку. Однако я считаю, что мой вопрос подчеркивает еще несколько аномалий и не дублирует. – plalx
Если вы посмотрите на соответствующий вопрос SO, он в значительной степени ответит на все, что вы подняли. см. @Mike Causer ответ на специфику. – Jarede