mysql_real_escape_string
Der fette Mo
- php
-2 Tom-1 Der fette Mo0 Tom0 Der fette Mo0 Tom0 Rouven0 Der fette Mo
0 Alexander Brock0 Der fette Mo0
dedlfix
-1 Tom
$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?
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

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

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

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
Wie wäre es denn, wenn Du die Abfrage änderst:
SELECT
idFROMpasswordWHEREnick= 'admin' andpass= ' 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
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
--

[VMenü - Ein Klasse in PHP, mit der man beliebig tief verschachtelte (x)HTML-Menüs erstellen kann.](http://alexanderbrock.de/vmenue/)
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!
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";
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
passwordWHERE ...
=)=)=)
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!
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";
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
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???
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";
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

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
