ColdFusion 9: int i type = „numeryczny” nieprzyjemny błąd?

Właśnie doświadczyłem zachowania, które przeczy wszelkiej logice i może potencjalnie prowadzić do poważnych problemów i zastanawiałem się, czybył to błąd lub jeśli zachowanie zostało wprowadzone i jakie są najlepsze praktyki, aby obejść ten problem? Jeśli to błąd, czy jest łatka?

Oto dwa dziwne zachowania, które razem stanowią zagrożenie dla integralności danych każdego systemu.

int('1 2') ->41276isValid('numeric', '1 2') ->true

Czemu? Więc, zobaczmy...

<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')>

Tutajtype="numeric" walidacja argumentów (która może opierać się na tym samym algorytmie coisValid?) nie rzuca z'1 2'. Nawet gorzej,cfqueryparam cfsqltype="cf_sql_integer" wydaje się używaćint przekształcić wartość, która skończy się41276.

Innymi słowy,deleteSomething('1 2') usunie obiekt o identyfikatorze41276 zamiast rzucać wyjątek od wartości1 2 oczywiście nie jest numeryczny.

Teraz jedyna poprawka, o której myślałem, to wykonanie dodatkowej walidacji argumentów za pomocąisValid('integer', ... lub wyrażenie regularne, ale to prawdziwy ból, a poza tym nigdy nie rozumiałem, dlaczego nie wdrożylitype="integer"?

Oczywiście zawsze też przyjmowałem fałszywe założeniecfqueryparam type="cf_sql_integer" sprawdzi, czy przekazana wartość jest poprawną liczbą całkowitą.

EDYTOWAĆ:

Wydaje się, że nawetisvalid('integer', ... jest również niezawodny, jak widzimy
Dlaczego jest poprawna („liczba całkowita”, „1,5”) = TAK?

EDIT2:

Wiem, że mogę dodać dodatkowe sprawdzanie argumentów dla każdego oczekiwanego argumentu liczby całkowitej w każdej funkcji, jednak wymagałoby to naprawienia ogromnej bazy kodu w moim przypadku i jest również bardzo podatne na błędy. Sprawia również, że wbudowana walidacja argumentów jest w tym przypadku całkowicie bezużyteczna.

Wolałbym raczej rozwiązanie, w którym mógłbymutwórz i zastosuj nieoficjalną łatę. Czy to realistyczna opcja? Jeśli tak, chciałbym zwrócić uwagę we właściwym kierunku.

EDIT3: Nie rozwiązuje wszystkich problemów, ale CF11 dodał obsługę astrictNumberValidation konfiguracja poziomu aplikacji.

„Zaczynając od ColdFusion 11, funkcja ta ocenia bardziej rygorystycznie. Ustawienie tej wartości na false powoduje, że funkcja isValid zachowuje się w starszy sposób. To ustawienie wpływa na tagi cfargument, cfparam i cfform wszędzie tam, gdzie używana jest walidacja liczb całkowitych i liczbowych. to ustawienie sprawdza również poprawność tych znaczników. ”

questionAnswers(2)

yourAnswerToTheQuestion