suit: Sicherheit in der Abfrage

Beitrag lesen

Die Abfrage ist, so wie sie da steht, sicher.

Jein ;)

Keine Ahnung, warum alle anderen, die bisher geantwortet haben, und es hätten wissen müssen, dein Cast auf Integer übersehen haben.

Ich hab' ich nicht übersehen, bitte nicht verallgemeinern.

Aber genau dieses (int) vor der Variable sorgt in diesem Fall für ausreichende Sicherheit - das Resultat können nur Integer-Zahlen sein, die dort in den SQL-String gelangen.

Für Sicherheit ja, für ein vernünftiges ergebnis sorgt es aber nicht.

Genauso wie für is_numeric() gilt auch für (int) oder ein explites intval() immer, dass man damit den Sinn der Abfrage entstellen kann - es gibt viele Fälle in denen ein String der nach Integer gecastet wird und ein anderes Ergebnis aufweist, als man eigentlich möchte.

Man muss nur an strings wie '-10', 'foo10' oder '12,3' denken, im ersteren Fall kommt -10 raus, im zweiteren 0 und im dritte Fall 12 - die ersten beiden sind vermutlich in einer herkömmlichen Tabelle nicht als ID vorhanden und würden ein fehlerhaftes (oder kein) Ergebnis liefern.

Man muss hierbei nur an ein UPDATE-Statement denken wo man dann (un)absichtlich einen falschen Datensatz aktualisiert.

"Sicherheit" bedeutet nicht nur, dass etwas vor Injections geschützt ist sondern auch, dass man nicht versehentlich etwas kaputt machen kann.