Mein Loginsystem - (Communitysystem)

Diese Seite kannte ich und ich hatte einen anderen Fehler..
Und das Prob ist schon längst gelöst.. 8)
 
Oh sorry, damn ich hatte was falsch getestet. Klappt doch nicht:
PHP:
$loginnickname = $_POST['nickname'];
$loginpasswort = $_POST['passwort'];
$query = db_query("SELECT nickname,passwort,aktiviert FROM Login WHERE nickname = %s", $loginnickname);
$sql = mysql_query($query) or die(mysql_error());
$ds = mysql_fetch_object($sql);
Fehlermeldung:

Ich komm da durcheinander. Was ist zu nutzten, vsprintf() oder db_query()?
 
Zuletzt bearbeitet:
PHP:
entweder:
$query = sprintf("SELECT nickname,passwort,aktiviert FROM Login WHERE nickname = '%s'", $loginnickname);
$sql = mysql_query($query) or die(mysql_error());

oder 
$sql = db_query("SELECT nickname,passwort,aktiviert FROM Login WHERE nickname = '%s'", $loginnickname);

sprintf(), nicht vsprintf() ...
 
Wenn du ActionScripter's oberen Code nimmst, bistd aber nicht gegen SQL-Injections geschützt.

Jetzt nochmal. Dieser Code funktioniert:
PHP:
$loginnickname = $_POST['nickname'];
$loginpasswort = $_POST['passwort'];
$sql = db_query("SELECT `nickname`, `passwort`, `aktiviert` FROM `Login` WHERE `nickname` = '%s'", $loginnickname) or die(mysql_error());
$ds = mysql_fetch_object($sql);
Beachte, dass der Nickname eine Zeichenkette ist !
Das or die() is natürlich noch böse.
 
Wenn du ActionScripter's oberen Code nimmst, bistd aber nicht gegen SQL-Injections geschützt.

Beachte, dass der Nickname eine Zeichenkette ist !
Das or die() is natürlich noch böse.
[...]

Aha jetzt klappts. Also meinst du das wenn der User einen Nickk wie "123***" macht soll ich Ihn drauf hinweisen es sei nicht erlaubt?Also soll ich das mit dem die() wegmachen wenn ich alles getestet habe oder immer an jede MySql abfrage dran machen?
 
escapen? sql injections?

leute, jetzt muss ich mich echt mal aufregen. ihr tut immer so, als ob ihr die weisheit mit löffeln gefressen hättet.

prinzipiell arbeitet man so, dass man die übergebenen parameter erst prüft und dann übergibt. ergo müsste die prüfung in folgender zeile vonstatten gehen:

PHP:
$loginnickname = $_POST['nickname'];

ein nicht geprüfter parameter hat überhaupt nichts erst in einer sql-anweisung zu suchen. eine prüfung auf sql-injection ist ne nette sache, ist aber bei sauberer programmierung an dieser stelle nicht nötig.

also entweder wollt ihr sauber programmieren, dann prüft die eingaben bei der übernahme oder macht murks und prüft die eingaben erst bei der sql-anweisung. in letzterem falle regt euch aber bitte nicht derart künstlich auf, wenn man in einem einzeiler nicht ständig jeden pups abfängt.

der typ will den kram lernen und verstehen. von daher ist db_query alles andere als geeignet ... wie gesehen versteht er noch nichtmal, was der unterschied zwischen mysql_query und vsprintf ist ... man gibt euch auch nicht shakespeare zum lesen, wenn ihr englisch lernen wollt...

sorry, musste mal sein :(
 
leutie weisheit mit löfe, jetzt muss ich mich echt mal aufregen. ihr tut immer so, als ob ihr dfeln gefressen hättet.

prinzipiell arbeitet man so, dass man die übergebenen parameter erst prüft und dann übergibt. ergo müsste die prüfung in folgender zeile vonstatten gehen:
[..]

Versteh ich schon den Unterschied..
Also kann ich nun alles manuell escapen? Juhuu, jemand einen Einspruch? Das macht mir auch weniger Arbeit! :p
 
Zuletzt bearbeitet:
Also meinst du das wenn der User einen Nickk wie "123***" macht soll ich Ihn drauf hinweisen es sei nicht erlaubt?
Nein. Du sollst in der Query `feld`='xxx' stehen haben, wenn `feld` ein Textfeld ist.
Also soll ich das mit dem die() wegmachen wenn ich alles getestet habe oder immer an jede MySql abfrage dran machen?
Ganz am Ende handelt deine Klasse die Fehler bzw. kann man das ja in db_query() machen). Ich würd sagen, so lang lass es drinstehen. Ein MySQL-Fehler dürfte eh eigentlich nie auftreten.
prinzipiell arbeitet man so, dass man die übergebenen parameter erst prüft und dann übergibt.
Du willst die Eingaben aber doch nicht schon vorher escapen ? :hö:
der typ will den kram lernen und verstehen. von daher ist db_query alles andere als geeignet ... wie gesehen versteht er noch nichtmal, was der unterschied zwischen mysql_query und vsprintf ist ... man gibt euch auch nicht shakespeare zum lesen, wenn ihr englisch lernen wollt...
Bevor du dem Typen aber in aller Ruhe den Unterschied zwichen mysql_query() und vsprintf() beibringst, servier ich doch lieber ne Zwischenlösung, die ein Erfolgserlebnis bringt. Wie genau der 11-Zeiler jetzt funktioniert, wird er irgendwann schon noch verstehen, wenn es soweit ist.
 
Ne aber im Ernst ich finde es schwieriger und aufwändiger mit dem kleinen Functionen Script zu arbeiten als es mir selbst zu escapen..
Also ich werde es erst selbst escapen.. Dann Vllt später nochmal überholen..

Und nochwas..
Warum sollte ich eine Abfrage so Formatieren:
PHP:
$query = "UPDATE `Login` SET `ip` = '$ip', `lastlogin` = '$date $time' WHERE `nickname` = '$loginnickname'";
Und nicht so:
PHP:
$query = "UPDATE Login SET ip = '$ip', lastlogin = '$date $time' WHERE nickname = '$loginnickname'";

Nochwas kleines.. Da ist nochimmer der Wurm drin, manchmal als ich was ändern wollte kam eine Fehlermeldung:
PHP:
CREATE TABLE `login` (
  `id` int(11) NOT NULL auto_increment,
  `lastlogin` datetime NOT NULL,
  `nickname` text collate latin1_general_ci NOT NULL,
  `passwort` varchar(32) collate latin1_general_ci NOT NULL default '',
  `vorname` text collate latin1_general_ci NOT NULL,
  `nachname` text collate latin1_general_ci NOT NULL,
  `mail` text collate latin1_general_ci NOT NULL,
  `aktiviert` char(1) collate latin1_general_ci NOT NULL default '',
  `aktivierungscode` int(15) NOT NULL default '0',
  `ip` varchar(18) collate latin1_general_ci NOT NULL default '0',
  `regtime` datetime NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=9 ;
 
Zuletzt bearbeitet:
Warum sollte ich eine Abfrage so Formatieren:
PHP:
$query = "UPDATE `Login` SET `ip` = '$ip', `lastlogin` = '$date $time' WHERE `nickname` = '$loginnickname'";
Und nicht so:
PHP:
$query = "UPDATE Login SET ip = '$ip', lastlogin = '$date $time' WHERE nickname = '$loginnickname'";

ist reine geschmackssache... wenn du das erste übersichtlicher findest nehm das ersten, wenn du das zweite übersichtlicher findest nehm das zweite. mit variante 1 gehst du bloss den problem von reservierten wörtern aus dem weg... was unter umständen schon wieder von nachteil sein kann. bei nem backup als sql dump musst du immer drauf achten dass du mit quotes exportierst... ansonsten wird das einspielen sehr interessant :ugly: wie gesagt nur geschmachssache...

prinzipiell arbeitet man so, dass man die übergebenen parameter erst prüft und dann übergibt. ergo müsste die prüfung in folgender zeile vonstatten gehen:

ein nicht geprüfter parameter hat überhaupt nichts erst in einer sql-anweisung zu suchen. eine prüfung auf sql-injection ist ne nette sache, ist aber bei sauberer programmierung an dieser stelle nicht nötig.
was hat deiner meinung nach ne pürfung mit escapen zu tun? das sind zwei unterschiedliche sachen...
 
was hat deiner meinung nach ne pürfung mit escapen zu tun? das sind zwei unterschiedliche sachen...

wo bitte hab ich von escapen gesprochen? escape ist sache des query. injections abfangen sache der variablenzuweisung...

ein nickname z.b. hat keine zeichen zu enthalten, die escaped werden müssen. ergo wäre das hier auch nicht nötig, wenn man die zuweisung sauber geprüft hat. ein passwort kann escape-sequenzen enthalten, es wird aber nie im klartext verwendet. durch eine codierung z.b. md5 entsteht wieder ein string, der ebenso nicht escaped werden muss ...

ergo sollte nach ordentlicher prüfung folgende anweisung sicher sein:

PHP:
SELECT x,y,z FROM user WHERE username='$user' AND password='$pass'

ich weiss ja nicht, was du unter escape verstehst, aber hier seh ich keins ...
 
Sehr interessant dieser Thread, aber ihr solltet euch hier net fetzen, sondern php beim lernen helfen.

Ich denke auch, dass er erstmal nicht die DB-Klasse einsetzen sollte - denn so lernt er nichts.

Denn wenn man mal ehrlich ist:

Hat man was programmiert und es funzt wie es soll, schaut man sich das ganze net mehr an. :roll:

Die Frage bei der Klasse is natürlich auch, ob er das Login-System nur schreibt um was zu lernen, oder ob er es später auch einsetzen will...
 
Eventuell für mich selbst aber nur ne kleine HP..
Aber auch wenn dann kann ichs immer noch dazu verändern. (dann lerne ich sogar doppelt :D )
 
wo bitte hab ich von escapen gesprochen? escape ist sache des query. injections abfangen sache der variablenzuweisung...

ein nickname z.b. hat keine zeichen zu enthalten, die escaped werden müssen. ergo wäre das hier auch nicht nötig, wenn man die zuweisung sauber geprüft hat. ein passwort kann escape-sequenzen enthalten, es wird aber nie im klartext verwendet. durch eine codierung z.b. md5 entsteht wieder ein string, der ebenso nicht escaped werden muss ...

ergo sollte nach ordentlicher prüfung folgende anweisung sicher sein:

PHP:
SELECT x,y,z FROM user WHERE username='$user' AND password='$pass'

ich weiss ja nicht, was du unter escape verstehst, aber hier seh ich keins ...

blabla... entschuldige das ich dich auf was hingewissen hab was meiner meinung nach problematisch sein könnte. leider hab ich noch zu wenig ahnung von php und sql um die hoch komplexe prüfung die bei
PHP:
$loginnickname = $_POST['nickname'];
stattfindet zu begreifen. und auch nochmals entschuldigung das ich mir vorher nicht die rfc zu nicknames durchgelsen hab, wo drin beschreiben steht das nicknames keine escapebaren zeichen für mysql enthalten dürfen. schande über mein haupt... ich hoffe du kannst mir nochmal verzeihen. du hast mir auch jedenfall die augen geöffnet, ich weiß jetzt das ich unfähig bin mit php zu arbeiten... wenn ich schon solche wichtigen sachen vergesse wie eine syntaktische prüfung des nicknames bevor ich schaue ob es diesen nickname überhaupt gibt, was vergess ich dann noch?