Archiv verlassen und diese Seite im Standarddesign anzeigen : MySQL-Error
linuxjohnny
26-03-2008, 22:04
Hi,
Wie ihr bestimmt sehen könnt bin ich neu hier, hoffe aber das ich keine Fehler mache was das erstellen von Threads betrifft :-)
Also mein Problem:
Ich habe begonnen php zu lernen und habe bereits einen Fehler den ich nicht beheben kann vielleicht wisst ihr ja weiter.
$sql = "SELECT "."id, user, password"."FROM "."auth"."WHERE "."(user = '".$_POST["user"]."') AND "."(password = PASSWORD ('".$_POST["password"]."'))";
Wenn ich das Forumlar aufrufe sag er mir in dieser Zeile sei ein Fehler:
FehlerYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(user = 'khaag') AND (password = PASSWORD ('fad'))' at line 1
Ich währe euch sehr dankbar wenn ihr mir helfen könnt.
Vielen Dank schon mal
MFG
Kevin Haag
In deinem SQL-Statement fehlen einige Leerzeichen. Nebenbei bemerkt: du musst nicht jedes Feld mit . an den String anhängen. So sollte es funktionieren (ungetestet):
$sql = "SELECT id, user, password FROM auth WHERE (user = '".$_POST["user"]."') AND (password = PASSWORD ('".$_POST["password"]."'))";
linuxjohnny
27-03-2008, 10:12
Hi,
Vielen Dank für deine Hilfe ich glaube nun funktioniert das mit der SQL Abfrage.
Jetzt habe ich leider ein weiteres Problem:
<?php
include 'config.php'; //include config file
connect(); //connect database
select_db_login(); //select database
//Login prüfen
$sql = "SELECT id, user, password FROM auth WHERE (user = '".$_POST["user"]."') AND (password = PASSWORD ('".$_POST["password"]."'))";
$result = mysql_query ($sql);
echo $result;
echo "<br>";
if (mysql_num_rows ($result) > 0)
{
header ("Location: loged_in.html");
}
else
{
echo "Fehler";
}
?>
Wenn das Script ausgeführt wird also wenn das Formular abgschickt wurde kommt die Medldung.
(Wird durch echo $sql hervorgerufen)
Resource id #4
Den Benutzer den ich aber vorhin im Formular eingegeben habe existiert in der Datenbank also sollte ich doch auf die Seite loged_in.html weitergeleitet werden, oder?
Jetzt wird einfach nur echo "Fehler"; ausgegeben.
Wenn die Information zu spärlich sind bitte einfach melden
MFG
Kevin Haag
Vor einem header(...) befehl darf kein Output stattfinden. Also alle echo vor dem header(...) streichen.
BLUESCREEN3D
27-03-2008, 13:52
include 'config.php';
Benutz bei wichtigen Dateien require statt include (Unterscheid steht im PHP-Manual).
$sql = "SELECT id, user, password FROM auth WHERE (user = '".$_POST["user"]."') AND (password = PASSWORD ('".$_POST["password"]."'))";
Hier verlässt du dich darauf, dass "Magic Quotes" aktiviert sind. Da du gerade erst mit PHP anfängst und Magic Quotes in PHP 6 abgeschafft werden, solltest du dich am besten gleich daran gewöhnen, das deaktivieren und jeweils ein addslashes() um die $_POST-Daten schreiben, um die zu escapen.
Ansonsten hast du eine Sicherheitslücke: http://de.wikipedia.org/wiki/SQL-Injektion
Außerdem solltest du dir das mal angucken: http://www.php.net/manual/de/security.php
Wenn das Script ausgeführt wird also wenn das Formular abgschickt wurde kommt die Medldung.
Resource id #4
Das ist der Inhalt der Variable $result - hast du per echo ausgegeben.
linuxjohnny
27-03-2008, 15:11
Also ich habe nun den echo vor dem header(); gestrichen nun sieht der Code so aus:
<?php
require ("config.php"); //include config file
connect(); //connect database
select_db_login(); //select database
//Login prüfen
$sql = "SELECT id, user, password FROM auth WHERE (user = '".$_POST["user"]."') AND (password = PASSWORD ('".$_POST["password"]."'))";
$result = mysql_query ($sql);
if (mysql_num_rows ($result) > 0)
{
header ("Location: loged_in.html");
}
else
{
header ("Location: login.html");
}
?>
Leider werde ich einfach nicht auf die Seite loged_in.html weitergeleitet, an was könnte das liegen?
Wenn ich jetzt aber ein echo(); vor dem Header haben will was kann ich da machen?
@BLUESCREEN3D
Wenn ich das ändern möchte müsste es dann so aussehen (laut wiki):
$abfrage = "SELECT spalte1 FROM tabelle WHERE
spalte2 = '".mysql_real_escape_string($_POST['spalte2Wert'])."'";
Und wie meinst du das mit der Funktion addslashes() um die $_POST-Daten
Könntest du mir ein Beispiel mit dem oben gennanten Code von Wiki machen, danke.
MFG
Kevin Haag
BLUESCREEN3D
27-03-2008, 16:23
Leider werde ich einfach nicht auf die Seite loged_in.html weitergeleitet, an was könnte das liegen?
Schreib mal ganz an den Anfang des Skriptes folgendes:
error_reporting(E_ALL);
Ansonsten wäre die einfachste Möglichkeit, nach dem Fehler zu suchen, erstmal die header()-Aufrufe auszukommentieren und stattdessen da per echo eine Meldung auszugeben.
Und wenn alles nichts hilft: Einen Packet-Sniffer nutzen, um zu sehen, was wirklich vom Server zum Browser gesendet wird.
Wenn ich jetzt aber ein echo(); vor dem Header haben will was kann ich da machen?
header("Location: ...") teilt dem Browser mit, dass er eine andere Seite abrufen soll. Wozu also eine Ausgabe, wenn der Browser sofort zu der anderen Seite wechselt?
Und wie meinst du das mit der Funktion addslashes() um die $_POST-Daten
Das addslashes sollte dahin, wo in dem Beispiel "mysql_real_escape_string" steht. mysql_real_escape_string() macht das gleiche wie addslashes(), escapet aber noch ein paar Zeichen mehr, damit der String auch in Logdateien in eine Zeile passt.
Welche von beiden Funktionen du nutzt, ist in deinem Beispiel egal.
linuxjohnny
27-03-2008, 16:39
Ok ich habe mal error_reporting(E_ALL); am Anfang hingeschriben aber was könnte mir das helfen sprich sollte irgendwo eine Meldung kommen wenn etwas falsch ist?
Ich habe nun die header(); durch ein echo(); ersetzt kommt aber immer das echo vom else.
Sprich das Login funktioniert nicht warum auch immer???
MFG
Kevin Haag
BLUESCREEN3D
27-03-2008, 20:26
D.h. der Query wählt 0 Zeilen aus. Es gibt also keinen User mit dem von dir angegebenen Passwort.
Lass dir $sql ausgeben, prüf, ob das so aussieht wie es sollte. Wenn alles in Ordnung ist, kannst du den Fehler weiter eingrenzen, indem du z.B. die WHERE-Bedingung password=... weglässt.
linuxjohnny
27-03-2008, 21:49
Also ich habe nun einen Benutzer ohne Passwort erstellt wenn ich mich mit dem angemolden habe funktioniert es perfekt und ich wurde auf die gewünschte Seite weitergeleitet.
Ich weiss das es nun daran liegt, dass das Passwort das ich übermittle nicht mit dem übereinstimmt mit dem das in der MySQL steht.
Irgendwie funktioniert das mit dem:
(password = PASSWORD ('".mysql_real_escape_string($_POST['password'])."'))
nicht.
Aber wie könnte ich diesen Fehler beheben?
MFG
Kevin Haag
BLUESCREEN3D
27-03-2008, 22:20
Mit welchem Query legst du denn neue Benutzer an?
linuxjohnny
27-03-2008, 22:26
$sql = 'INSERT INTO `login`.`auth` (`id`, `user`, `password`) VALUES (NULL, \'test4\', PASSWORD(\'test\'));';
Ausgabe von PHP-Code durch phpmyadmin
BLUESCREEN3D
27-03-2008, 22:38
Das stimmt so weit.
Hat das hier was ergeben?
Lass dir $sql ausgeben, prüf, ob das so aussieht wie es sollte.
linuxjohnny
27-03-2008, 23:00
Meinst du echo $sql;
SELECT id, user, password FROM auth WHERE (user = 'test4') AND (password = PASSWORD('test'))
linuxjohnny
27-03-2008, 23:04
Wenn ich echo $result; ausgebge kommt folgendes:
Resource id #4
BLUESCREEN3D
28-03-2008, 00:00
Bist du sicher, dass die Auswahl der Datenbank klappt?
Könntest mal testweise den SELECT-Query so umbauen: ... FROM login.auth ...
Und was gibt dieser Befehl aus (vor das "if" packen)?
var_dump(mysql_num_rows($result));
linuxjohnny
28-03-2008, 07:44
Ja das bin ich mir sicher denn wen ich mich mit einem User ohne Passwort anmelde funtioniert es.
Könntest mal testweise den SELECT-Query so umbauen: ... FROM login.auth ...
Sorry hab ich nicht ganz verstanden was du meinst.
var_dump(mysql_num_rows($result));
Das gibt ein
int(0) zurück.
linuxjohnny
28-03-2008, 07:48
Jetzt habe ich auch noch herausgefunden:
Wenn ich einen neuen Eintrag in die MySQL mache bei dem das Passwort unverschlüsselt ist funktioniert es auch sprich es liegt irgendwie an der verschlüsslung.
Hier nochmals der Code:
<?php
error_reporting(E_ALL);
require ("../config.php"); //include config file
connect(); //connect database
select_db_login(); //select database
//Login prüfen
$sql = "SELECT
id,
user,
password
FROM
auth
WHERE
(user = '".mysql_real_escape_string($_POST['user'])."')
AND
(password =PASSWORD('".mysql_real_escape_string($_POST['password'])."'))
";
$result = mysql_query ($sql);
if (mysql_num_rows($result) > 0)
{
header("Location: loged_in.html");
}
else
{
echo "fehler";
//header ("Location: style.css");
}
?>
BLUESCREEN3D
28-03-2008, 16:29
Welchen Datentyp hat in der MySQL-Tabelle die Spalte "password"?
linuxjohnny
28-03-2008, 17:45
varchar(30)
BLUESCREEN3D
28-03-2008, 18:20
varchar(30)
Dann kann das ja nicht gehen ...
Wie hier steht http://dev.mysql.com/doc/refman/5.0/en/password-hashing.html sind die Hashes von PASSWORD() immer 41 Byte lang. Und wenn du 41 Zeichen in ein 30-Zeichen-Feld einträgst, wird der Rest verworfen.
Abgesehen davon soll man PASSWORD() ja eh nicht nutzen: http://dev.mysql.com/doc/refman/5.0/en/encryption-functions.html#function_password
Und da du das nun eh umschreibst, kannst du auch gleich einen Salted Hash - siehe http://de.wikipedia.org/wiki/Salted_Hash - nehmen (hierfür die Spalte password auf varchar(40) ändern, da SHA1 20 Byte lang ist, also hexadezimal angegeben 40 Byte):
... WHERE
(user = '".mysql_real_escape_string($_POST['user'])."')
AND
(password ='".sha1($_POST['password'] . SALT)."')
SALT wird in der config.php definiert:
define('SALT', 'hier irgendeine zufällige Zeichenfolge eintragen');
Noch sicherer ist es, wenn jeder User einen anderen Salt hat, also kannst du das auch gleich noch machen:
Die Tabelle auth kriegt eine zusätzliche Spalte salt (z.B. irgendein varchar). Beim Anlegen eines Users und bei jeder Passwortänderung wird diese mit einem zufälligen String gefüllt. Die Abfrage würde dann so aussehen:
... WHERE
(user = '".mysql_real_escape_string($_POST['user'])."')
AND
(password = SHA1(CONCAT(salt, '".sha1($_POST['password'] . SALT)."')))
Damit hättest du also zwei Salts und doppeltes Hashing (eines durchgeführt in PHP, damit das Passwort nicht in Klartext an den SQL-Server übertragen werden muss).
Neuen User anlegen:
$salt = zufallsfunktion();
$hash = sha1($salt . sha1($password . SALT));
query("INSERT INTO ... VALUES (..., '".mysql_real_escape_string($salt)."', '$hash')");
linuxjohnny
01-04-2008, 16:55
Hi,
Vielen Dank erst mal für eure Antworten ich werde das bei Gelegenheit mal ausprobieren.
Wenn's nicht klappt melde ich mich wieder:D
MFG
Kevin Haag
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.