Der fette Mo: mysql_real_escape_string

  
$login = new query;  
$login->connect('user');  
$login->query("SELECT IF ( pass = '".mysql_real_escape_string($_POST['pass'], $login->connection)."', TRUE, FALSE) FROM password WHERE nick = 'admin'");  

Erklärung: query ist eine von mir erstellte Klasse, intern werden mysql_select_db() und mysql_query() aufgerufen. (Bitte jetzt nicht nach dem Sinn fragen!)

Wenn der übergebene Post-Daten-String ein '=' enthält, ist das Ergebnis dieser Abfrage eine MySQL-Fehlermeldung ("YOU HAVE AN ERROR IN YOUR SQL SYNTAX"), das '=' wird also anscheinend nicht maskiert. Was mache ich falsch bzw. was muss ich machen, dass dieses zeichen maskiert wird?

--
Menschen haben keine Probleme, sie schaffen sie sich selbst.
  1. Hello,

    $login = new query;
    $login->connect('user');

    $query = "SELECT IF ( pass = '".mysql_real_escape_string($_POST['pass'] ;

    ^^

    $login->query($query, $login->connection)."', TRUE, FALSE) FROM password WHERE nick = 'admin'");

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau

    1. N Abend,

      netter Versuch, ich hab auch herzlich gelacht aber könntest du mir vielleicht auch nen konstruktiven Tipp geben? Ich verzweifel nämlich grad an meinem Code!!!

      --
      Menschen haben keine Probleme, sie schaffen sie sich selbst.
      1. Hello,

        netter Versuch, ich hab auch herzlich gelacht

        Ich auch

        aber könntest du mir vielleicht auch nen konstruktiven Tipp geben? Ich verzweifel nämlich grad an meinem Code!!!

        Da ist eben aus Versehen was verloren gegangen.
        Aber Alexander hat Dir im Prinzip schon gesagt, was ich sagen wollte.
        Den SQL-String ausgeben lassen und nach dem Query auf jeden Fall mysql_errno($connection) abfragen

        Harzliche Grüße vom Berg
        http://www.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau

        1. Den SQL-String ausgeben lassen und nach dem Query auf jeden Fall mysql_errno($connection) abfragen

          Die protokolliert meine Klasse sowieso mit:

          1064:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE nick = 'admin'' at line 1

          --
          Menschen haben keine Probleme, sie schaffen sie sich selbst.
          1. Hello,

            SELECT IF ( pass = '  z=M2Mzb40cM1', TRUE, FALSE) FROM password WHERE nick = 'admin'

            Wie wäre es denn, wenn Du die Abfrage änderst:

            SELECT id FROM password WHERE nick = 'admin' and pass = '  z=M2Mzb40cM1'

            Und dann fragen, ob

            if(mysql_errno($con) == 0) and mysql_num_rows($con) == 1)
              {
                # Zugang gewähren, Usernummer merken
              }
              else
              {
                # Zugang verwehren
              }

            Zur Sicherheit sollte jeder User auch nur ein Passwort haben können.

            Harzliche Grüße vom Berg
            http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau

            1. Hi,

              ich wollte gerade sagen, die Backticks wären auf jeden Fall mal eine Maßnahme. Zwar listet MySQL 'password' nicht als reserviertes Wort auf, aber zumindest kann es sich per Default was darunter vorstellen.

              MfG
              Rouven

              --
              -------------------
              ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
            2. Wie wäre es denn, wenn Du die Abfrage änderst:

              SELECT id FROM password WHERE nick = 'admin' and pass = '  z=M2Mzb40cM1'

              Und dann fragen, ob

              if(mysql_errno($con) == 0) and mysql_num_rows($con) == 1)
                {
                  # Zugang gewähren, Usernummer merken
                }
                else
                {
                  # Zugang verwehren
                }

              Gut, ich könnte die Abfrage ändern, das is ne Idee. (Allerdings wenn dann mit SELECT COUNT(*), in dieser Tabelle haben die nutzer nämlich (noch) keine ID, hier sind einmalige Passwörter für den ersten Login gespeichert, der innerhalb von 1 Stunde nach Zusendung des Passworts erfolgen muss (Schutz gegen automatisierte Anmeldungen))

              Das ändert aber nichts an meiner Frage: Was mache ich falsch oder was könnte schiefgelaufen sein? Ich habe nämlich x mal solche Konstrukte verwendet (leider aber bis jetzt nie getestet, ob das Escapen richtig funktioniert) und ich müsste jetzt sonst ca. 200 Skripte durchsuchen und jede Abfrage durch so einen umständlichen Workaround ersetzen.

              Trotzdem danke

              --
              Menschen haben keine Probleme, sie schaffen sie sich selbst.
  2. Hallo Freunde des gehobenen Forumsgenusses,

    $login = new query;
    $login->connect('user');
    $login->query("SELECT IF ( pass = '".mysql_real_escape_string($_POST['pass'], $login->connection)."', TRUE, FALSE) FROM password WHERE nick = 'admin'");

      
    PHP-Code ist bei SQL-Problemen (und ein solches hast du) unangemessen.  
    Lasse dir mit echo ausgeben, welche SQL-Query du wirklich absendest und poste das Ergebnis hier.  
      
    
    > Erklärung: query ist eine von mir erstellte Klasse, intern werden mysql\_select\_db() und mysql\_query() aufgerufen. (Bitte jetzt nicht nach dem Sinn fragen!)  
      
    Ich finde das sehr sinnvoll und habe auch eine solche Wrapper-Klasse, um bequem auf MySQL zuzugreifen.  
      
    
    > Wenn der übergebene Post-Daten-String ein '=' enthält, ist das Ergebnis dieser Abfrage eine MySQL-Fehlermeldung ("YOU HAVE AN ERROR IN YOUR SQL SYNTAX"), das '=' wird also anscheinend nicht maskiert. Was mache ich falsch bzw. was muss ich machen, dass dieses zeichen maskiert wird?  
      
    Wie gesagt, erzeuge einen Testfall, der zu dem Fehler führt und poste ihn hier.  
      
    Gruß  
    Alexander Brock
    
    -- 
    ![A](http://alexanderbrock.de/img/pavatar.png)  
    [VMenü - Ein Klasse in PHP, mit der man beliebig tief verschachtelte (x)HTML-Menüs erstellen kann.](http://alexanderbrock.de/vmenue/)
    
    1. PHP-Code ist bei SQL-Problemen (und ein solches hast du) unangemessen.

      Sorry, werde mich bessern!

      Lasse dir mit echo ausgeben, welche SQL-Query du wirklich absendest und poste das Ergebnis hier.

      Mein testscript:

        
      <?php  
      include('protected/query.inc.php');  
      $login = new query;  
      if($_POST['a'])  
      echo(mysql_real_escape_string($_POST['a'], $login->connection));  
      ?>  
      <html>  
      <head><title>test</title></head>  
      <body>  
      <form method="post" action="">  
      <input type="password" name="a" length="30" />  
      <input type="submit" value"test" />  
      </form>  
      </body>  
      </html>  
      
      

      Ergebnis: Passwort bleibt unverändert
      => Die fertige Abfrage müsste so aussehen:
      SELECT IF ( pass = '  z=M2Mzb40cM1', TRUE, FALSE) FROM password WHERE nick = 'admin'

      Ich finde das sehr sinnvoll und habe auch eine solche Wrapper-Klasse, um bequem auf MySQL zuzugreifen.

      Danke dass wenigstens einer das sinnvoll findet!

      --
      Menschen haben keine Probleme, sie schaffen sie sich selbst.
      1. echo $begrüßung;

        Wenn wir jetzt deine vereinzelten Angaben zusammensetzen

        SELECT IF ( pass = '  z=M2Mzb40cM1', TRUE, FALSE) FROM password WHERE nick = 'admin'
        1064:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE nick = 'admin'' at line 1

        wird deutlich, dass nach dem "password" offensichtlich etwas anderes erwartet wird als ein WHERE. Wenn du Namen von Funktionen und andere reservierte Wörter für Bezeichner von Datenbanken, Tabellen, Feldern verwendest musst du diese durch Quoting entschärfen: ... FROM password WHERE ...

        echo "$verabschiedung $name";

        1. wird deutlich, dass nach dem "password" offensichtlich etwas anderes erwartet wird als ein WHERE. Wenn du Namen von Funktionen und andere reservierte Wörter für Bezeichner von Datenbanken, Tabellen, Feldern verwendest musst du diese durch Quoting entschärfen: ... FROM password WHERE ...

          =)=)=)

          Sorry, aber das kann nicht sein.
          Ich habe das Script nämlich vor dem posten (zumindest von der Namensgebung) vor dem posten verändert, um es lesbarer zu machen. Im Originalscript wird kein möglicherweise reservierter Ausdruck verwendet.

          Tschuldigung, dass ich euch hier in die Irre geführt habe. kommt nie wieder vor!!!

          Und danke für deine Hilfe!

          --
          Menschen haben keine Probleme, sie schaffen sie sich selbst.
          1. echo $begrüßung;

            Ich habe das Script nämlich vor dem posten [...] verändert, um es lesbarer zu machen.

            Tschuldigung, dass ich euch hier in die Irre geführt habe. kommt nie wieder vor!!!

            Du kannst solche ärgerlichen Sachen vermeiden, indem du bei Problemen zuerst versuchst, selbige mit dem kleinst möglichen Script - und damit für andere nachvollziehbar - nachzustellen, dann dieses inklusive Nennung der Randbedingungen (welche Parameter müssen noch wie übergeben werden?) und der konkreten ungekürzten Fehlermeldung zur Diskussion stellst.

            echo "$verabschiedung $name";

            1. Hallo Freunde des gehobenen Forumsgenusses,

              Du kannst solche ärgerlichen Sachen vermeiden, indem du bei Problemen zuerst versuchst, selbige mit dem kleinst möglichen Script - und damit für andere nachvollziehbar - nachzustellen, dann dieses inklusive Nennung der Randbedingungen (welche Parameter müssen noch wie übergeben werden?) und der konkreten ungekürzten Fehlermeldung zur Diskussion stellst.

              Ich glaube, dass die Leute, die das machen dadurch sehr schnell selbst herausfinden, was der Fehler ist und deshalb nicht posten. Also kommen hauptsächlich unvollständige Fehlermeldungen im Forum an, die Erstellung einer vollständigen Analyse des Problems führt nämlich in den meisten Fällen zur Lösung.

              Daher ist dein Tipp sehr hilfreich, auch wenn er nicht (unbedingt) zu besseren Problembeschreibungen führt :-)

              Gruß
              Alexander Brock

            2. Du kannst solche ärgerlichen Sachen vermeiden, indem du bei Problemen zuerst versuchst, selbige mit dem kleinst möglichen Script - und damit für andere nachvollziehbar - nachzustellen, dann dieses inklusive Nennung der Randbedingungen (welche Parameter müssen noch wie übergeben werden?) und der konkreten ungekürzten Fehlermeldung zur Diskussion stellst.

              OK, ich werde diese Dinge in Zukunft beherzigen.

              Allerdings habe ich das Script inzwischen bereits bestmöglich gekürzt und die vollständige Fehlermeldung nachgereicht. Rahmenbedingungen habe ich von vorherein nicht ausgelassen. Kann mir jetzt bitte jemand versuchen zu helfen???

              --
              Menschen haben keine Probleme, sie schaffen sie sich selbst.
              1. echo $begrüßung;

                Allerdings habe ich das Script inzwischen bereits bestmöglich gekürzt und die vollständige Fehlermeldung nachgereicht. Rahmenbedingungen habe ich von vorherein nicht ausgelassen. Kann mir jetzt bitte jemand versuchen zu helfen???

                Dann schreibe doch bitte noch einmal kompakt, nachvollziehbar und mit vollständiger Fehlerbeschreibung  in ein Posting was jetzt noch dein Problem ist. Mittlerweile weiß ich nämlich nicht mehr, welche Lösungsvorschläge nicht geholfen haben und welche zwar helfen würden, du sie aber ignoriert oder nicht verstanden hast, oder welche aufgrund deiner Beschreibung nicht die richtigen waren.

                echo "$verabschiedung $name";

                1. Hello,

                  Dann schreibe doch bitte noch einmal kompakt, nachvollziehbar und mit vollständiger Fehlerbeschreibung  in ein Posting was jetzt noch dein Problem ist. Mittlerweile weiß ich nämlich nicht mehr, welche Lösungsvorschläge nicht geholfen haben und welche zwar helfen würden, du sie aber ignoriert oder nicht verstanden hast, oder welche aufgrund deiner Beschreibung nicht die richtigen waren.

                  Das ist der springende Punkt, oder war es ein fehlendes Komma? *g*

                  Harzliche Grüße vom Berg
                  http://www.annerschbarrich.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau

  3. Hello,

    $query = "SELECT IF ( pass = '".
              mysql_real_escape_string($_POST['pass'], $login->connection).
             "', TRUE, FALSE) FROM password WHERE nick = 'admin'";

    Ich stutze immer noch über die Laufzeit-Dynamik.
    Wann wird das denn wie aufgerufen?
    Wann wird z.B. $login->connection ersetzt durch das tatsächliche Handle?

    Das Statement darf ja erst dann zusammengebaut werden, wenn alle variablen Teile bekannt sind.
    Da ich die Hülle nicht kenne, kann ich das aber nicht beurteilen.

    Harzliche Grüße vom Berg
    http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau