peschels: variablenübergabe mit $_Get[]

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?

  1. 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

    --
    __________________________-

    FirefoxMyth
    1. 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

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    2. 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

      1. 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

        --
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
        Terry Pratchett, "Wachen! Wachen!"
        ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
        Veranstaltungsdatenbank Vdb 0.3
  2. 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

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. 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

  3. 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!

  4. 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 ä = &auml; etc...

    bischen googlen dann findeste du einen guten code...aber so ist die Lösung ;-)

    1. 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 ä = &auml; 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

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  5. 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

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. 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!

  6. Hi,

    $name = $_GET['name'];
    "SELECT * from test WHERE name=$name"

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes