variablenübergabe mit $_Get[]
peschels
- php
Hallo zusammen!
Ich habe folgendes Problem:
Ich lese aus einer Datenbank Personendaten aus und möchte dann den Namen über einen Link übergeben
echo"<a href='test.php?name=zeile['name']'>";
Diesen übernehme ich dann und will damit eine neue Datenbankabfrage machen
$name = $_GET['name'];
"SELECT * from test WHERE name=$name"
Dies funktioniert auch soweit ganz gut, solange der Name keine Sonderzeichen enthält.Sobald dies der Fall ist, wird zwar der korrekte Name übergeben, jedoch funktioniert das SELECT - Statement nicht mehr.
Die Abfrage
echo $name; // Ausgabe : Müller
if ( $name != 'Müller') echo " ungleich";
liefert die Ausgabe "ungleich" und verwirrt mich daher immer mehr. Woran kann das liegen?
Grüße,
$name = $_GET['name'];
"SELECT * from test WHERE name=$name"
dafür gehörst du gestraft! bist du dir bewusst, dass an dieser stelle beliebiges code reingeshcleust werden kann? das nciht nru fehler sondern auch schaden produizert?
escape das ganze und konvertiere vltl noch die htmlentities
MFG
bleicher
Hi,
$name = $_GET['name'];
"SELECT * from test WHERE name=$name"dafür gehörst du gestraft! bist du dir bewusst, dass an dieser stelle beliebiges code reingeshcleust werden kann? das nciht nru fehler sondern auch schaden produizert?
escape das ganze und konvertiere vltl noch die htmlentities
NEIN! Keinesfalls HTML-Entities in die Datenbank schreiben. Wenn überhaupt, werden HTML-Entities für die HTML-Ausgabe erzeugt, aber nicht für die Datenbank.
cu,
Andreas
Grüße,
$name = $_GET['name'];
"SELECT * from test WHERE name=$name"dafür gehörst du gestraft!
Danke für die ehrliche Antwort
bist du dir bewusst, dass an dieser stelle beliebiges code reingeshcleust werden kann? das nciht nru fehler sondern auch schaden produizert?
Dessen bin ich mir nicht bewusst ! Wie fange ich dies dann ab?
Danke und Gruß peschels
Hallo
Grüße,
$name = $_GET['name'];
"SELECT * from test WHERE name=$name"dafür gehörst du gestraft!
Danke für die ehrliche Antwort
bist du dir bewusst, dass an dieser stelle beliebiges code reingeshcleust werden kann? das nciht nru fehler sondern auch schaden produizert?
Dessen bin ich mir nicht bewusst ! Wie fange ich dies dann ab?
1. Du prüfst den übergebenen Wert auf Plausibilität.
Das ist aber bei Freitext nicht so einfach. Das ginge aber mit einem regulären Ausdruck.
2. Der Wert muss kontextgerecht behandelt werden.
Es kann Schadcode übergeben werden, hier ein Stück Name mit folgendem Code, der als SQL-Query durchgeht und in deinem Fall ausgeführt wird. Siehe dazu auch Cheatahs Verlinkung. Hier ist der Kontext MySQL, die für Strings zu benutzende Funktion heißt mysql_real_escape_string
, Ganzzahlen sind mit intval
zu behandeln.
3. Das Umkopieren in eine Variable macht, exzessiv angewandt, den Code unübersichtlich.
Irgendwann fügst du irgendwo zusätzlichen Code ein und weißt dann evtl. nicht mehr um die Herkunft von $name
.
$Query = [code lang=sql]"SELECT * from test WHERE name = '". mysql_real_escape_string($_GET['name']) ."'"
;[/code]
Tschö, Auge
Hello,
Ich habe folgendes Problem:
Ich lese aus einer Datenbank Personendaten aus und möchte dann den Namen über einen Link übergeben
echo"<a href='test.php?name=zeile['name']'>";
> Diesen übernehme ich dann und will damit eine neue Datenbankabfrage machen
> ~~~sql
> $name = $_GET['name'];
> "SELECT * from test WHERE name=$name"
>
Dies funktioniert auch soweit ganz gut, solange der Name keine Sonderzeichen enthält.Sobald dies der Fall ist, wird zwar der korrekte Name übergeben, jedoch funktioniert das SELECT - Statement nicht mehr.
Wie sind die Daten denn in die Datenbank gekommen?
Welche Codierung wurde dafür verwendet?
In welcher Codierung arbeitet Dein Webserver?
In welcher Codierung speicherst Du das PHP-File ab?
Müller in ISO8859-1 ist eben nicht gleich Müller in utf-8
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Wie sind die Daten denn in die Datenbank gekommen?
Ich habe die Daten in die Datenbank importiert(mit einer .csv)
Welche Codierung wurde dafür verwendet?
wurde als UTF-8 eingelesen
In welcher Codierung arbeitet Dein Webserver?
läuft grad "nur" unter xampp standard einstellung
In welcher Codierung speicherst Du das PHP-File ab?
auch als UTF-8
Hi!
"SELECT * from test WHERE name=$name"
Dies funktioniert auch soweit ganz gut, solange der Name keine Sonderzeichen enthält.
Kontextwechsel beachten, und das nicht nur aus syntaktischen sondern auch sicherheitstechnischen Gründen.
Lo!
Hi, dann setz doch in dein Formular einfach ein, dass dieses die Daten bevor sie in die Datenbank gespeichert werden die Werte mit html entities utf-8 um...so ist ä = ä etc...
bischen googlen dann findeste du einen guten code...aber so ist die Lösung ;-)
Hi,
Hi, dann setz doch in dein Formular einfach ein, dass dieses die Daten bevor sie in die Datenbank gespeichert werden die Werte mit html entities utf-8 um...so ist ä = ä etc...
Und warum sollte man so einen Unsinn machen?
HTML-Entities gehören allerhöchstens (wenn die Codierung der Seite die Zeichen nicht direkt erlaubt) bei der HTML-Ausgabe eingesetzt, aber keinesfalls für die Datenbank.
Für die Datenbank müssen die Daten datenbank-gemäß escaped werden. Nicht HTML-gemäß.
cu,
Andreas
Hi,
echo"<a href='test.php?name=zeile['name']'>";
> Diesen übernehme ich dann und will damit eine neue Datenbankabfrage machen
> ~~~sql
> $name = $_GET['name'];
> "SELECT * from test WHERE name=$name"
>
Dies funktioniert auch soweit ganz gut, solange der Name keine Sonderzeichen enthält.
Das bezweifle ich.
Oder steht in $name wirklich ein Spaltenname?
Wenn es ein Feldinhalt wäre, bräuchte es (abgesehen vom DB-Escaping) Anführungszeichen außenrum.
cu,
Andreas
Hi!
"SELECT * from test WHERE name=$name"
Oder steht in $name wirklich ein Spaltenname?
Wenn es ein Feldinhalt wäre, bräuchte es (abgesehen vom DB-Escaping) Anführungszeichen außenrum.
Jein, MySQL kennt auch eine Hex-Notation für Strings. Dafür hatte ich aber bisher noch keinen sinnvollen Anwendungsfall. Man könnte es vielleicht für Angriffszwecke nutzen, wenn mit is_numeric() auf Zahlenwert geprüft wird und ein Hex-String dadurch ungeschoren durchkommt.
Lo!
Hi,
$name = $_GET['name'];
"SELECT * from test WHERE name=$name"
Cheatah