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')
удалит сущность с идентификатором41276
вместо того, чтобы генерировать исключение, так как значение1 2
явно не числовой.
Теперь единственное исправление, о котором я подумал, - это проверка дополнительных аргументов с помощьюisValid('integer', ...
или регулярное выражение, но это настоящая боль и, кроме того, я никогда не понимал, почему они не реализовалиtype="integer"
?
Очевидно, я также всегда делал ложное предположение, чтоcfqueryparam type="cf_sql_integer"
подтвердит, что переданное значение является допустимым целым числом.
РЕДАКТИРОВАТЬ:
Кажется, что дажеisvalid('integer', ...
также не является надежным, как мы можем видеть в
Почему isvalid ("integer", "1,5") = YES?
EDIT2:
Я знаю, что я мог бы добавить проверку дополнительных аргументов для каждого ожидаемого целочисленного аргумента в каждой функции, однако это потребовало бы исправления огромной базы кода в моем случае, и это также очень подвержено ошибкам. Это также делает проверку встроенного аргумента совершенно бесполезной в этом случае.
Я бы предпочел решение, где я могсоздать и применить неофициальный патч, Это реалистичный вариант? Если это так, я хотел бы указать в правильном направлении.
EDIT3: он не решает все проблемы, но CF11 добавил поддержкуstrictNumberValidation настройка уровня приложения.
«Начиная с ColdFusion 11, эта функция оценивается более строго. Если установить для этого значения значение false, функция isValid будет работать по-старому. Этот параметр влияет на теги cfargument, cfparam и cfform везде, где используется целочисленная и числовая проверка. На основе этот параметр проверки также отражается в этих тегах. "