• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[ERLEDIGT] ?id=1234abc

Tobi44

Mitglied
Hallo,

zufällig ist mir durch Einsicht eines Logs gerade aufgefallen, dass durch einen Aufruf von ?id=1234abc eine gleiche Behandlung erfolgt wie als würde das "abc" nicht hinter der Zahl stehen.

Ich prüfe mittels Datenbankabfrage, ob ein Eintrag mit der aufgerufenen ID existiert (SELECT id FROM xxx WHERE id = '1234').
Die Ergebnisse werden gezählt, entweder kommt 1 raus wenn der Eintrag existiert oder 0, wenn nicht.

if ($count === 1) { ... } else { gibts nicht }

Es ist mir unbegreiflich, wie $count mit 1 gefüllt werden kann, wenn der aufgerufene Wert in der Datenbank nicht existiert (1234abc).

Ich dachte, so wie ich das seit Jahren handhabe, ist das sicher. Zur Überbrückung habe ich ein zusätzliches is_numeric eingebaut.

Danke
 
Werbung:
Hallo,

zufällig ist mir durch Einsicht eines Logs gerade aufgefallen, dass durch einen Aufruf von ?id=1234abc eine gleiche Behandlung erfolgt wie als würde das "abc" nicht hinter der Zahl stehen.

Ich prüfe mittels Datenbankabfrage, ob ein Eintrag mit der aufgerufenen ID existiert (SELECT id FROM xxx WHERE id = '1234').
Die Ergebnisse werden gezählt, entweder kommt 1 raus wenn der Eintrag existiert oder 0, wenn nicht.

if ($count === 1) { ... } else { gibts nicht }

Es ist mir unbegreiflich, wie $count mit 1 gefüllt werden kann, wenn der aufgerufene Wert in der Datenbank nicht existiert (1234abc).

Ich dachte, so wie ich das seit Jahren handhabe, ist das sicher. Zur Überbrückung habe ich ein zusätzliches is_numeric eingebaut.

Danke

Du solltest zugehörigen PHP Code posten.
Ich vermute mal du hast irgendwo ein "intval".
 
PHP:
$ID = $mysqli->real_escape_string($_GET['id']);

if ($query = $mysqli->query("SELECT * FROM `content` WHERE id = '$ID'")) {
    $count = $query->num_rows;
    $load = $query->fetch_Object();
    $query->close();
}

if ($count === 1) {

// beginne mit der Ausgabe

} else {

echo "gibts nicht!";

}
 
Werbung:
Das kommt davon, wenn man von außen reingetragenen Parametern blind vertraut! Guck mal, was hier rauskommt:

PHP:
<?php

  $string = "1234abc";

  $number = (int)$string;

  echo $number;

?>
 
Danke für die Antworten.

Das beantwortet aber dennoch nicht meine Frage. Wenn ich meine Bauweise betrachte, dürfte $count nicht 1 sein, da der Wert in der Datenbank so nirgendwo existiert.

Und wieso blind vertrauen? In diesem Fall ist die ID tatsächlich eine reine Zahl oder Ziffer, aber in anderen Fällen kann das doch auch etwas vom Benutzer generiertes sein, zB. ein Benutzername.

Also von nun an:
PHP:
$ID = (int)$mysqli->real_escape_string($_GET['id']);

Danke
 
Ähmmmmm, hallo???? Verstehst du das jetzt wirklich nicht? Aus deinem 1234abc wird leider ein 1234, weil es nach Int gecastet wird.

PHP:
<?php

  $string = "1234abc";
 
  $number = (int)$string;
 
  echo $number;
 
  if (is_numeric($string))
      echo "<br>Alles jut";
  else
      echo "<br>Shit";

?>
 
Werbung:
Werbung:
Ähmmmmm, hallo???? Verstehst du das jetzt wirklich nicht? Aus deinem 1234abc wird leider ein 1234, weil es nach Int gecastet wird.....
Wirklich? Wo denn bitte? Und ja, ich verstehe es wirklich nicht!
PHP:
// $_GET['id'] = '123abc'; ist ein String definitiv...
$ID = $mysqli->real_escape_string($_GET['id']);
// nach real_esc_string hoffentlich Immernoch ein String
if ($query = $mysqli->query("SELECT * FROM `content` WHERE id = '$ID'"))
// sollte SELECT * FROM `content` WHERE id = '123abc' ergeben
Wo wird das Casting nach int vorgenommen?

ein var_dump($ID) ergibt bei mir:
PHP:
string(6) "123abc"
Wandelt mysql das nun selbständig um, wenn die Spalte id vom Typ int ist und seit wann?
Ich würde einenen Fehler von mysql erwarten.

PS
Nachtrag:
Uups, habe die Single-Quotes nicht beachtet. Ohne würde es einen Fehler geben.

Code:
SELECT * FROM `tabelle` WHERE `id` = 18abc
LIMIT 0, 25

MySQL meldet: Dokumentation
#1054 - Unknown column '18abc' in 'where clause'
Mit Singe-Quotes gibt es ein Ergebnis
 
Zuletzt bearbeitet:
Wirklich? Wo denn bitte? Und ja, ich verstehe es wirklich nicht!
PHP:
// $_GET['id'] = '123abc'; ist ein String definitiv...
$ID = $mysqli->real_escape_string($_GET['id']);
// nach real_esc_string hoffentlich Immernoch ein String
if ($query = $mysqli->query("SELECT * FROM `content` WHERE id = '$ID'"))
// sollte SELECT * FROM `content` WHERE id = '123abc' ergeben
Wo wird das Casting nach int vorgenommen?
Ein paar Beiträge über dir.
 
SELECT * FROM `tabelle` WHERE `id` = '12abc'

Liefert bei mir einen Datensatz mit der ID 12
 
Werbung:
SELECT * FROM `tabelle` WHERE `id` = '12abc'

Liefert bei mir einen Datensatz mit der ID 12

Ich denke hier liegt mein (Denk-)fehler. Ich hätte erwartet, dass dabei kein Ergebnis kommt, da es den Wert, der mit = ' ' angegeben und gesucht wird, in der Datenbank so nicht gibt. Egal ob die Spalte ID sowieso nur Ziffern kennt oder nicht.

Gruß
 
Nachtrag
SELECT * FROM `tabelle` WHERE `id` = '12abc'
Liefert bei mir einen Datensatz mit der ID 12

Quotes übergeben einen String und mysql wandelt den String dann in INT um, wenn der abgefragte Feldtyp vom Typ INT ist.
Ohne Quotes erwartet mysql offenbar schon im Statement einen INT-Wert und wirft einen Fehler weil das Statement nicht korrekt ist.

SELECT * FROM `tabelle` WHERE `id` = 12
liefert also auch einen korrekten wert

SELECT * FROM `tabelle` WHERE `id` = 12abc
wirft einen Fehler

So aber auch schon in meinem Post oben unter PS geschrieben.
 
Zurück
Oben