Autor Beitrag
JungerIslaender
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Do 09.07.09 21:04 
Hi Leute ich hab folgenden Code:
ausblenden 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 user profile iconNarses: Quote-Tags ergänzt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 09.07.09 21:25 
Wie wäre es mit:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Fr 10.07.09 07:54 
ausblenden 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)
  {
    //Logindaten OK
    echo "Logindaten korrekt";
  }
  else
  {
    //Logindaten falsch
    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



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

ausblenden 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 :D

des weiteren würde ich auch den tip von zeitgeist87 beherzigen:

user profile iconZeitGeist87 hat folgendes geschrieben Zum zitierten Posting springen:


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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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.

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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



BeitragVerfasst: Fr 10.07.09 08:45 
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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.


lol :D punkt 1 is mir garnicht aufgefallen. peinlich :oops:
JungerIslaender Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Mi 15.07.09 16:47 
Hab es jetzt so gemacht(und funktioniert):
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Mi 15.07.09 18:42 
Ich habe keine Ahnung wovon du redest und auch google hat mir da nicht geholfen.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: 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
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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:
ausblenden volle Höhe Beispiel 1
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');

/* check connection */
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;

/* execute prepared statement */
$stmt->execute();

printf("%d Row inserted.\n", $stmt->affected_rows);

/* close statement and connection */
$stmt->close();

/* Clean up table CountryLanguage */
$mysqli->query("DELETE FROM CountryLanguage WHERE Language='Bavarian'");
printf("%d Row deleted.\n", $mysqli->affected_rows);

/* close connection */
$mysqli->close();
?>

und
ausblenden 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();
}

/* prepare statement */
if ($stmt = $mysqli->prepare("SELECT Code, Name FROM Country ORDER BY Name LIMIT 5")) {
    $stmt->execute();

    /* bind variables to prepared statement */
    $stmt->bind_result($col1, $col2);

    /* fetch values */
    while ($stmt->fetch()) {
        printf("%s %s\n", $col1, $col2);
    }

    /* close statement */
    $stmt->close();
}
/* close connection */
$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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Do 16.07.09 19:23 
user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:

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

user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:
Und welchen fehler mache ich hier obwohl es fast identisch mit dem obigen ist:
ausblenden 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:

ausblenden 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 mysqli das sieht echt gut aus ;) (Sollte ich mir auch mal angucken, wenn ich wieder was mit PHP mache)
JungerIslaender Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 427
Erhaltene Danke: 5

Win XP
Delphi 7; Delphi 2005
BeitragVerfasst: Fr 17.07.09 12:49 
user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:

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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Fr 17.07.09 13:00 
user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:
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.