| Autor |
Beitrag |
JungerIslaender
      
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Do 09.07.09 21:04
Hi Leute ich hab folgenden Code:
Quelltext 1: 2: 3: 4:
| $db_temp = "SELECT user FROM $mysql['db'] WHERE user like 'username'"; $db_user = db_temp; $db_temp = "SELECT user FROM $mysql['db'] WHERE password like 'username'"; $db_password = db_temp; |
Hier kommt folgender Fehler:
| Zitat: | | Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /usr/export/www/vhosts/funnetwork/hosting/essenwiewir/home/login.php on line 17 |
Ich weiß einfach nicht woran das liegt. Ich möchte folgendes machen(ich bin mir nicht sicher ob mein code das machen würde wenn er funktionieren würde): Ich hab ein Benutzerlogin wo die Benutzer mit passwort im quelltext stehen und möchte diese nun in einer mysql datenbank haben. In der tabelle user gibt es dann die spalten user und passwort.
MFG JungerIslaender
Moderiert von Narses: Quote-Tags ergänzt.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 09.07.09 21:25
Wie wäre es mit: SQL-Anweisung 1:
| $db_temp = "SELECT user FROM user WHERE user = $username AND passwort = $password"; | So ungefähr sollte das gehen, wobei es relativ unübersichtlich ist, wenn du die Tabelle wie die Spalte nennst...
(Wobei $username und $password die Variablen damit sind.)
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Fr 10.07.09 07:54
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| $db_temp = "SELECT count(ID) as anzahl from ".$mysql['db']." WHERE user = '".$username."' and passwort = '".$passwort."'"; $result = mysql_query($db_temp) or die('Fehlerhaftes Query');
if ($result) { $row = mysql_fetch_array($result); if ($row['anzahl'] == true) { echo "Logindaten korrekt"; } else { echo "Logindaten falsch"; } } |
Logindaten immer nur in ihrer Kombination abfragen und niemals mit 'like' sondern mit '='.
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
Äfan
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 10.07.09 08:19
dein script macht probleme mit den hochkommas bei bei dem $mysql array.
du solltest sowieso auf derartige variablenverwendungen verzichten! schreibe es lieber so:
Quelltext 1:
| $db_temp = 'SELECT user FROM '.$mysql['db'].' WHERE user like "'.$username.'"'; |
das läuft ersten viel perfomanter, da er keine variablen parsen muss und zweitens findet man syntaxfehler schneller... und die variablen werden im editor schön bunt
des weiteren würde ich auch den tip von zeitgeist87 beherzigen:
ZeitGeist87 hat folgendes geschrieben : |
Logindaten immer nur in ihrer Kombination abfragen und niemals mit 'like' sondern mit '='. |
BTW: niemals strings in sql statements direkt übergeben! stichwort mysql-injections 
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 10.07.09 08:36
1. In deinem Beispiel ganz oben fehlt jeweils in den geraden Zeichen bei db_temp ein $.
2. Die jetzige Art der PW-Abfrage eröffnet eine SQL-Injection. Bitte korrekt escapen ODER
3. Prepared Statements verwenden.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Fr 10.07.09 08:38
Und noch ein Tipp: Funktion md5(string); anschauen.
Hasht das Passwort über MD5 und macht es somit "sicher" (Rainbowtables und dergleichen lassen wir jetzt außen vor).
Das Passwort solltest du dann gehasht in die Datenbank eintragen und ebenfalls genauso abfragen. Natürlich musst du vorher deine Passwortvariablen entsprechend präparieren.
BenBE hat folgendes geschrieben : | 1. In deinem Beispiel ganz oben fehlt jeweils in den geraden Zeichen bei db_temp ein $.
2. Die jetzige Art der PW-Abfrage eröffnet eine SQL-Injection. Bitte korrekt escapen ODER
3. Prepared Statements verwenden. |
BenBE meint natürilch in Punkt 1 Zeilen 
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
Zuletzt bearbeitet von ZeitGeist87 am Fr 10.07.09 08:41, insgesamt 1-mal bearbeitet
|
|
Äfan
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 10.07.09 08:45
|
|
JungerIslaender 
      
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Mi 15.07.09 16:47
Hab es jetzt so gemacht(und funktioniert):
Quelltext 1: 2: 3:
| $abfrage = "SELECT user, password FROM konten WHERE user LIKE '$username' AND password LIKE '$password' LIMIT 1"; $ergebnis = mysql_query($abfrage); $row = mysql_fetch_object($ergebnis); |
Ich hab jetzt nur nicht verstanden warum ich um die variablen noche ein "" machen soll sowie ein =. md5 benutze ich ^^.
Was kann ich jetzt noch besser machen? Vorallem wegen sichherheit, und wann lohnt es sich https zu benutzen.
Und welchen fehler mache ich hier obwohl es fast identisch mit dem obigen ist:
Quelltext 1: 2: 3:
| session_register('useremail'); $abfrage = "SELECT email FROM konten WHERE user LIKE '$username'"; $useremail = mysql_query($abfrage); |
echo $useremail ergibt aber 0
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 15.07.09 17:56
Bitte Prepared Statements verwenden ODER alle Nutzerdaten escapen!!!
Bitte erst einmal dies korrigieren, dann schau ich weiter ... Hab aber schon eine Vermutung ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
JungerIslaender 
      
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Mi 15.07.09 18:42
Ich habe keine Ahnung wovon du redest und auch google hat mir da nicht geholfen.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 15.07.09 19:50
Siehe devzone.zend.com/article/686 ... War eine Sache von einmal "MySQL Prepared Statements" bei Google eingeben ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Mi 15.07.09 21:59
Also:
1. Du kannst in PHP Strings entweder in '' einschließen, oder in "". letzteres erlaubt es dir, noch Variablen da rein zu schmuggeln (das kann aber unübersichtlich werden) Deshalb die favorisierte Lösung: ' '
2. Username und Passwort solltest du nicht, nie, mit like suchen. Im schlimmsten Fall landet UserA im Account von UserB beim Versuch sich einzuloggen.
3. Escapen oder prepared Statements verwenden. Escapen dürfte für den Anfang besser zu verstehen sein.
Damit wird aus C#-Quelltext 1: 2: 3:
| $abfrage = "SELECT user, password FROM konten WHERE user LIKE '$username' AND password LIKE '$password' LIMIT 1"; $ergebnis = mysql_query($abfrage); $row = mysql_fetch_object($ergebnis); | das hier: C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| $abfrage = 'SELECT user, password FROM konten WHERE user = "' . mysql_real_escape_string($username) . '" AND password = "' . mysql_real_escape_string($password) . '"';
$ergebnis = mysql_query($abfrage) or die('Fehlerhaftes Query: ' . mysql_error());
if (mysql_num_rows($ergebnis) < 1) die("Kein User gefunden, kritischer Fehler");
if (mysql_num_rows($ergebnis) > 1) die("Mehr als ein User gefunden, kritischer Fehler");
$row = mysql_fetch_object($ergebnis); |
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 16.07.09 05:44
Bei jeglichen Befehlen für MySQL IMMER das Connection-Handle angeben! mysql_real_escape_string beachtet nämlich den Verbindungscharset, um wirklich alle benötigten Zeichen zu erwischen. Ohne das Connection-Handle geht's nämlich nicht (zumindest nicht sauber). Bei MySQLi ist das durch das OOP-Interface eh immer gegeben und wird dadurch um einiges logischer.
Gewöhn dich aber nicht zu sehr an die MySQL-Extension und steig lieber auf MySQLi um. Das ist nicht nur sicherer, sondern auch performanter und kann mehr.Und ehrlich gesagt: Ich finde Escaping wesentlich unübersichtlicher als Parameter zu binden, grad weil man beim escapen SCHNELL mal eine Stelle vergisst.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
JungerIslaender 
      
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Do 16.07.09 19:02
Alles klar, und wie mach ich das mit dem Parameter binden?
Und außerdem:
| Zitat: |
Was kann ich jetzt noch besser machen? Vorallem wegen sichherheit, und wann lohnt es sich https zu benutzen.
Und welchen fehler mache ich hier obwohl es fast identisch mit dem obigen ist:
Quelltext 1: 2: 3:
| session_register('useremail'); $abfrage = "SELECT email FROM konten WHERE user LIKE '$username'"; $useremail = mysql_query($abfrage); |
echo $useremail ergibt aber 0
|
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 16.07.09 19:20
Ich gleich mal kurz den Stand ab:
[X] Du hast den Link gelesen
[ ] Du hast den Link verstanden
[ ] Du kannst Beispiele sehen, wenn sie dich in einem Link anspringen?
Okay, ich bin mal nicht so und geb mal eben zwei Beispiele:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| <?php $mysqli = new mysqli('localhost', 'user', 'password', 'world');
if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); }
$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)"); $stmt->bind_param('sssd', $code, $language, $official, $percent);
$code = 'DEU'; $language = 'Bavarian'; $official = "F"; $percent = 11.2;
$stmt->execute();
printf("%d Row inserted.\n", $stmt->affected_rows);
$stmt->close();
$mysqli->query("DELETE FROM CountryLanguage WHERE Language='Bavarian'"); printf("%d Row deleted.\n", $mysqli->affected_rows);
$mysqli->close(); ?> |
und
Beispiel 2 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| <?php $mysqli = new mysqli("localhost", "user", "password", "world");
if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); }
if ($stmt = $mysqli->prepare("SELECT Code, Name FROM Country ORDER BY Name LIMIT 5")) { $stmt->execute();
$stmt->bind_result($col1, $col2);
while ($stmt->fetch()) { printf("%s %s\n", $col1, $col2); }
$stmt->close(); }
$mysqli->close();
?> |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Do 16.07.09 19:23
JungerIslaender hat folgendes geschrieben : |
Und außerdem:
Was kann ich jetzt noch besser machen? Vorallem wegen sichherheit, und wann lohnt es sich https zu benutzen. |
Bei deinem derzeitigen Code lohnt es sich definitiv nicht
JungerIslaender hat folgendes geschrieben : | Und welchen fehler mache ich hier obwohl es fast identisch mit dem obigen ist:
Quelltext 1: 2: 3:
| session_register('useremail'); $abfrage = "SELECT email FROM konten WHERE user LIKE '$username'"; $useremail = mysql_query($abfrage); |
echo $useremail ergibt aber 0
|
Mach das mal so:
Quelltext 1: 2: 3:
| session_register('useremail'); $abfrage = "SELECT email FROM konten WHERE user LIKE '$username'"; $useremail = mysql_query($abfrage) or die('Fehler: ' . mysql_error()) |
Dann sagt er dir nämlich, was schiefgelaufen ist  (Und eine Fehlermeldung ist der erste Schritt zur Fehlererkennung)
Außerdem solltest du das Mysql-Result nicht in einer Session speichern. Wenn mich nicht alles täuscht ist die Ressourcenkennung eh wertlos, sobald das Skript abgearbeitet wurde.
Aber machs ruhig mit mysql i das sieht echt gut aus  (Sollte ich mir auch mal angucken, wenn ich wieder was mit PHP mache)
|
|
JungerIslaender 
      
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Do 16.07.09 21:53
ich benutze den usernamen und email in einer anderen php datei die in der selben session genutzt wird. Mit dem Usernamen geht es mit der email allerdings nicht.
Or die hab ich eingefügt: $useremail ergibt 0.
Auch wenn es sich nicht lohnt, was kann ich noch in punkto sichherheit tun.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 16.07.09 22:42
MySQLi und Prepared Statements nutzen ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
JungerIslaender 
      
Beiträge: 427
Erhaltene Danke: 5
Win XP
Delphi 7; Delphi 2005
|
Verfasst: Fr 17.07.09 12:49
JungerIslaender hat folgendes geschrieben : |
Or die hab ich eingefügt: $useremail ergibt 0.
|
Wie kann den eine Abfrage 0 ergeben wenn eigentlich ein wert in der db steht?
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Fr 17.07.09 13:00
JungerIslaender hat folgendes geschrieben : | ich benutze den usernamen und email in einer anderen php datei die in der selben session genutzt wird. Mit dem Usernamen geht es mit der email allerdings nicht.
Or die hab ich eingefügt: $useremail ergibt 0. |
Also $useremail sollte entweder eine Mysql-Ressourcenkennung enthalten oder das die() sollte anschlagen und dir eine Fehlermeldung ausspucken.
Es sei denn, du gibst die Variable nicht direkt aus sondern in einer anderen Datei, wo die Variable nicht initialisiert ist.
Wenn du die E-Mail Adresse des Benutzers in der Session speichern willst, ist das kein problem. Du musst aber schon die E-Mail Adresse an sich speichern und keine Ressourcenkennung, die auf ein Ergebnis verweist, in dem die Adresse irgenwann mal drin war.
JungerIslaender hat folgendes geschrieben : | | Auch wenn es sich nicht lohnt, was kann ich noch in punkto sichherheit tun. |
Überspitzt formuliert: Solange du nicht MySQLi mit prepared Statements verwendest oder das Zeug escapst (vorzugsweise ersteres) hast du quasi einen großen roten Selbstzerstörungs-Knopf an der Außenseite des Panzers, den jeder drücken kann. Und solange der nicht weg ist, ist es sinnlos über eine bessere Panzerung nur nachzudenken.
|
|
|