ColdFusion 9: int und type = "numeric" böser Bug?

Ich habe gerade ein Verhalten erlebt, das jeder Logik widerspricht und möglicherweise zu ernsthaften Problemen führen kann, und habe mich gefragt, obEs war ein Fehler oder wenn das Verhalten geändert wurde und welche bewährten Methoden zur Umgehung des Problems wurden angewendet? Wenn es ein Fehler ist, gibt es einen Patch?

Hier sind die beiden seltsamen Verhaltensweisen, die zusammen eine Bedrohung für die Datenintegrität eines Systems darstellen.

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

Warum? Okay, lass uns nachsehen...

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

Hier dietype="numeric" Argumente Validierung (die vielleicht auf dem gleichen Algorithmus basiert wieisValid?) wirft nicht mit'1 2'. Noch schlimmer,cfqueryparam cfsqltype="cf_sql_integer" scheint zu verwendenint um den Wert zu konvertieren, der am Ende sein wird41276.

Mit anderen Worten,deleteSomething('1 2') löscht die Entität mit der ID41276 anstatt eine Ausnahme seit dem Wert auszulösen1 2 ist offensichtlich nicht numerisch.

Die einzige Lösung, an die ich gedacht habe, ist die Durchführung einer zusätzlichen Argumentvalidierung mitisValid('integer', ... oder ein regulärer Ausdruck, aber das ist ein echter Schmerz und außerdem habe ich nie verstanden, warum sie nicht implementiert wurdentype="integer"?

Offensichtlich habe ich auch immer die falsche Annahme gemacht, dasscfqueryparam type="cf_sql_integer" würde bestätigen, dass der übergebene Wert eine gültige Ganzzahl ist.

BEARBEITEN:

Das scheint sogar soisvalid('integer', ... ist auch nicht zuverlässig, wie wir in sehen können
Warum ist ungültig ("Ganzzahl", "1,5") = JA?

EDIT2:

Ich weiß, dass ich für jedes erwartete Ganzzahlargument in jeder Funktion eine zusätzliche Argumentüberprüfung hinzufügen könnte, dies würde jedoch eine große Codebasis in meinem Fall erfordern und es ist auch sehr fehleranfällig. In diesem Fall ist die integrierte Argumentvalidierung auch völlig unbrauchbar.

Ich würde eher eine Lösung vorziehen, wo ich könnteErstelle und wende einen inoffiziellen Patch an. Ist das eine realistische Option? Wenn ja, möchte ich in die richtige Richtung hingewiesen werden.

EDIT3: Es löst nicht alle Probleme, aber CF11 fügte Unterstützung für ein hinzustrictNumberValidation Konfiguration auf Anwendungsebene.

"Ab ColdFusion 11 wird diese Funktion strenger ausgewertet. Wenn Sie diesen Wert auf" false "setzen, verhält sich die Funktion" isValid "älter. Diese Einstellung wirkt sich überall dort aus, wo Tags" cfargument "," cfparam "und" cfform "verwendet werden. Basierend auf Bei dieser Einstellung spiegelt sich die Validierung auch in diesen Tags wider. "

Antworten auf die Frage(2)

Ihre Antwort auf die Frage