PHP Login

som3

Lieutenant
Registriert
Jan. 2010
Beiträge
992
Hallo.
Ich bräuchte mal eure hilfe.
Ich habe eine Datenbank wie folgt:
[TABLE="width: 500"]
[TR]
[TD]ID[/TD]
[TD]Login[/TD]
[TD]Passwort[/TD]
[TD]Name[/TD]
[TD]E-mail[/TD]
[/TR]
[TR]
[TD]1[/TD]
[TD]vega[/TD]
[TD]mfdkgjf[/TD]
[TD]Max[/TD]
[TD]max@musterman.de[/TD]
[/TR]
[TR]
[TD]2[/TD]
[TD]Tegra[/TD]
[TD]nfgjugb[/TD]
[TD]Bert[/TD]
[TD]bert@musterman.de[/TD]
[/TR]
[/TABLE]

Dann habe ich eine Login seite und die eigentliche Seite wo eine Datenbank angezeigt wird mit weiteren Informationen.
Jede Person (also Max und Bert) haben jeweils eine eigene Datenbank die nach dem einloggen gezeigt werden soll.

Ich bin mir nicht ganz sicher wie ich es umsetzen soll und vor allem bin ich noch nicht ganz fit mit dem Thema PHP+SQL

Ich habe mir so das in etwa so gedacht:
Wenn Login name = Login name aus DB ist und Password = Password stimmt dann gehe auf eigentlicheseite.html.
Über die Methode post würde ich dann die ID mit geben und dann einfach Zeige db mit dem namen der id

 
Du brauchst PHP Sessions, damit brauchst du keine POST IDs oder solche Sachen.

Und hier hast du schon deine erste Sicherheitslücke. Glückwunsch!
und Password = Password stimmt

Was du stattdessen machst ist, du speicherst einen Hash des Passworts. Wenn der User sein Passwort eingibt hashst du das gleichermaßen und vergleichst dann die Hashes. Niemals die Passwörter direkt speichern. Idealerweise benutzt du auch noch ein Salt, aber da würde bei deinem derzeitigen Stand wohl zu weit führen.
 
Jo, war auch geplant die Passwörter zu hashen.
Muss mir nur mal angucken wie das geht.
Okay PHP Sessions gucke ich mir auch mal an.
​Danke :)
 
Das funktioniert zwar so, aber ist natürlich eine riesige Sicherheitslücke!

Ich kann direkt die "eigentlicheseite.html" aufrufen und _POST Parameter selbst bestimmen, so kann ich jede Datenbank einlesen :D

Passwörter immer gehashed (+salt) speichern, hoffe du hast Plaintext nur zu testzwecken. Vor dem speichern/vergleichen einfach z.B. md5(WERT) aufrufen und schon ist es gehashed.

Mit PHP sessions geht das ganze auch komfortabler.

- Du musst z.B. auf der Anmelden Seite ein Formular einbinden, welches action="login.php" hat.
- login.php prüft _POST user + pass und erstellt die Session
- Wenn richtig eingeloggt, lädst du in der login.php die Datenbankinhalt

Hier musst du aber vielleicht auch auf ne SQL Injection verhindern... ich empfehle dir, such nach einem Tutorial mit nem Login Beispiel oder ein gutes Buch. Gibt auch kostenlose E-Books.
Google 1. Treffer
http://en.wikibooks.org/wiki/PHP_Programming/User_login_systems
 
kryptonite schrieb:
Passwörter immer gehashed (+salt) speichern, hoffe du hast Plaintext nur zu testzwecken. Vor dem speichern/vergleichen einfach z.B. md5(WERT) aufrufen und schon ist es gehashed.
MD5 ist keine akzeptable Crypto.
Nutzt wenigstens crypt(), ist schließlich eine Core-Funktion von PHP 5.
 
// Geschafft war nur ein Schreibfehler ^^
 
Zuletzt bearbeitet:
Magst Du deinen Code vielleicht nochmal hier posten, damit wir nochmal drüberschauen können? Ich würde fast wetten, dass Du > 1 kritische Sicherheitslücke drin hast ;-)
 
Ja klaro.

Hier die login.php
PHP:
<?php session_start();
$connect = mysql_connect('localhost', 'dbname', 'pw')or die("Ups something went wront (1)"); mysql_select_db("bromedsql5") or die ("Ups something went wront (2)"); 
$netname = $_POST["netname"]; $password = $_POST["password"]; 
$ask = "SELECT netname, passw FROM Networks WHERE netname LIKE '$netname' LIMIT 1"; $got = mysql_query($ask); $row = mysql_fetch_object($got); 
$ask2 = "SELECT id, name, contact, paypal FROM Networks WHERE netname LIKE '$netname' LIMIT 1"; $got2 = mysql_query($ask2); $row2 = mysql_fetch_object($got2); 
$id = $row(id);$name = $row(name);$contact = $row(contact);$paypal = $row(paypal);
if($row->passw == $password)     {     $_SESSION["netname"] = $netname;     echo "Login erfolgreich. <br> <a href=\"index.php\">Geschützer Bereich</a>";     } else     {     echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>";     } 

?>
password hash baue ich noch ein.
würde es dann so machen:

PHP:
if (crypt($password) == $row->passw)   {     $_SESSION["netname"] = $netname;     echo "Login erfolgreich. <br> <a href=\"index.php\">Geschützer Bereich</a>";     } else     {     echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>";     }

Dazu auch noch eine frage, wie kann ich automatisch von der login.php im Erfolgs falle auf die index.php weiterleiten und bei einem Fehler zurück auf die login.html und dort eine Fehlermeldung anzeigen?

login.html und login.php zusammen führen

und die action vom login form auf login.php legen?
und dann in der if abfrage if($row->passw == $password) beim erfolg via meta refresh weiterleiten und beim Fehler einer Leeren Variable die unter dem Formular steht einen text zu geben?

und die index.php


PHP:
<?php session_start();if(!isset($_SESSION['netname']))    {    include "login.html";   exit;    }    $_SESSION['netname'] = $netname;?>
 
PHP:
$ask = "SELECT netname, passw FROM Networks WHERE netname LIKE '$netname' LIMIT 1"; $got = mysql_query($ask);

Das hier ist ziemlich fies. Wenn nun jemand in die netname-Variable beispiel ein
Code:
foo';GO EXEC cmdshell('shutdown /s')--
reinschreibt, schickst du folgendes Query an deinen MySQL-Server:
Code:
SELECT netname, passw FROM Networks WHERE netname LIKE 'foo';GO EXEC cmdshell('shutdown /s')--'
Alles, was nach einem ";" kommt, sieht der MySQL-Server als neues Kommando, ein GO EXEC cmdshell 'shutdown' würde Dir (vergleichsweise harmlos) deinen Server herunterfahren.

Sowas nennt man dann SQL-Injection.

Beheben kannst du es entweder über die mysql_real_escape_string()-Funktion oder über Prepared-Statements.
 
Hmm der Webhoster kann sich gegen so etwas nicht schützen?
Ich würde das ja Zugern einfach zum Spaß mal ausprobieren^^
Werde mal vesuchen das ganze mit real escape strings zu machen.
​Danke
 
Und zum anderen Thema: ein funktionierender PDO-Code würde ungefähr so aussehen (ich hab's nicht ausprobiert):
PHP:
<?php
	$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
	$username, $password;
	$passwd = crypt($password);
	
	$stmt = $dbh->prepare("SELECT * FROM Networks WHERE (netname=:username) AND (passw=:passwd)");
	$stmt->bindParam(':user', $username);
	$stmt->bindParam(':passwd', $passwd);
	$stmt->execute();
	
	var_dump($stmt->fetch());
?>
 
Kanibal schrieb:
Alles, was nach einem ";" kommt, sieht der MySQL-Server als neues Kommando, ein GO EXEC cmdshell 'shutdown' würde Dir (vergleichsweise harmlos) deinen Server herunterfahren.

In der Theorie richtig, in der Praxis erlaubt PHP nicht mehrere SQL-Kommandos in einem PHP-Funktionsaufruf auszuführen, das war mal wieder deren Idee man müsse den Entwickler vor Fehlern beschützen...
Eine SQL-Injection bleibt es natürlich trotzdem.
 
Hmmm jetzt geht es irgendwie gar nicht mehr.

PHP:
<?php 
session_start();
ini_set('error_reporting', E_ALL); //Zum testen

if(isset($_POST['submit'])) {

$connect = mysql_connect('localhost', 'db', 'pw')or die("Ups something went wrong (1)"); 
mysql_select_db("bromedsql5") or die ("Ups something went wrong (2)"); 

$netname = mysql_real_escape_string(stripslashes($_POST["netname"]));
$password = mysql_real_escape_string(stripslashes($_POST["password"]));

$sql = mysql_query("SELECT netname, passw FROM Networks WHERE netname = '$netname' AND passw = '$password'") or die('Server Error' . mysql_error());

$row = mysql_num_rows($sql);
if($row->passw == $password)     
{    

 $_SESSION["netname"] = $netname;     
echo "Login erfolgreich. <br> <a href=\"index.php\">Geschützer Bereich</a>";     
} 

else     
{     
echo "Benutzername und/oder Passwort waren falsch. <a href=\"login.html\">Login</a>";     
}

}
else{    echo "??";

};

?>

Ausgabe:

Notice: Trying to get property of non-object in /var/customers/webs/bromed/lab/CMS/login.php on line 15 Call Stack: 0.0002 687304 1. {main}() /var/customers/webs/bromed/lab/CMS/login.php:0 Benutzername und/oder Passwort waren falsch. Login
 
Zuletzt bearbeitet:
PHP:
$row = mysql_num_rows($sql);
if($row->passw == $password)
Wie willst du aus der Anzahl der Zeilen das Passwort auslesen?
Das ist zwar nicht der in der Fehlermeldung beschriebene Fehler, aber wenn du diesen hier gelöst hast, sollte deiner auch verschwinden.
 
Zumal ne Objekt-Notation (->) hier nix zu suchen hat, wenn doch ansonsten prozedural programmiert wird.

Auch hier der Tip: abreißen, neu bauen. Verwende direkt PDO, schmeiß die alte prozedurale Notation direkt auf den Müll und verwende direkt die moderne Objektnotation. Sie ist schneller, sicherer und flexibler.
 
Naja die Seite ist nicht für die Öffentlichkeit gedacht.
Der login ist ja jetzt einigermaßen okay. Er Funktioniert. Sicherer machen kann man es später immer noch.

Habe jetzt aber ein Problem.

Wenn man sich einloggt kann man über ein Formular Daten zu einer Datenbank hinzufügen.

Ein bestimmter anderer Account sieht sieht diese Datenbank bei sich und kann auf ja oder nein klicken Wenn man auf ja klickt wird ein wert in der Datenbank von dem einen Eintrag zu ja bzw wenn man ein nein klick zu nein geändert.

Das ganze geht aber nicht so wirklich.
Habe hier jetzt auch mit GET links gearbeitet anstelle von Sessions weil sie Session die ganze zeit gespeichert sind. Wenn ich per session mit gebe das es ein error gibt, bleib dieser wert und damit die error anzeige bis man sich ausloggt.


Hier mal alle relevanten Dateien:
addchannels.php Formular zum hinzufügen von Datensätzen
PHP:
<?php 
session_start();
ini_set('error_reporting', E_ALL);

if(!isset($_SESSION['netname']))
    {
    include "login.php";
   exit;
    } 

$geterror = $_GET['error'];
$error1 = "
<div class='alert alert-success alert-block'> <a class='close' data-dismiss='alert' href='#'>×</a>
<h4 class='alert-heading'>Success!</h4>
The channel has been successfully added to the CMS. The channel will be confirmed and partnert in the next 24 hours.   </div> ";
$error2 = "<div class='alert alert-error alert-block'>
<a class='close' data-dismiss='alert' href='#'>×</a> 
<h4 class='alert-heading'>Error!</h4>
Something went wrong. Try again or contact your Partner manager!</div> ";
          

 if($geterror == "1"){    $error = $error1;    }
elseif($geterror == "2"){    $error = $error2;    }
else {    $error = " ";    }   

$netname = $_SESSION['netname'];

?> 
<form action="addchannelscript.php" method="post" class="form-horizontal">            
<div class="control-group">              
<label class="control-label">Legal Name : </label>              
<div class="controls">                
<input type="text" class="span11" placeholder="Legal Name" name="legalname">              
</div>           
 </div>            
<div class="control-group">              
<label class="control-label">Channel Name : </label>              
<div class="controls">                
<input type="text" class="span11" placeholder="Channel Name" name="channelname">              
</div>            
</div>            
<div class="control-group">              
<label class="control-label">E-mail : </label>              
<div class="controls">                
<input type="email" class="span11" placeholder="E-Mail" name="email">              
</div>            
</div>            
<div class="control-group">              
<label class="control-label">PayPal E-mail : </label>             
<div class="controls">                
<input type="email" class="span11" placeholder="PayPal E-mail" name="paypalmail">              
</div>            
</div>            
<div class="control-group">              
<label class="control-label">Contract ID : </label>              
<div class="controls">                
<input type="text" class="span11" placeholder="Contract ID" name="contractid">              
</div>            
</div>                        
<div class="form-actions">              
<button type="submit" class="btn btn-success" name="submit">Add</button>            
</div>          
</form>
<?php print $error; ?>

addchannelsscript.php eigentliches PHP Script zum hinzufügen von Datensätzen
PHP:
<?php 
session_start();
ini_set('error_reporting', E_ALL);
if(!isset($_SESSION['netname']))    
{   
 include "login.php";   
exit;    
}    

$netname = $_SESSION['netname'];

if(isset($_POST['submit'])) {    
$dbconnection = mysql_connect('localhost', 'bromedsql5', 'PW');                
if (!$dbconnection) {    
die('Can not connect : ' . mysql_error());    
}   
$db_selected = mysql_select_db('bromedsql5', $dbconnection);
if (!$db_selected) {    die ('An error has occurred : ' . mysql_error());    }       

$channelname = mysql_real_escape_string(stripslashes($_POST["channelname"]));    
$legalname = mysql_real_escape_string(stripslashes($_POST["legalname"]));    
$email = mysql_real_escape_string(stripslashes($_POST["email"]));    
$paypalmail = mysql_real_escape_string(stripslashes($_POST["paypalmail"]));    
$contractid = mysql_real_escape_string(stripslashes($_POST["contractid"]));        

$query = "INSERT INTO `bromedsql5`.`$netname` (`ID`, `name`, `channel`, `vpd`, `subscriber`, `views`, `earnings`, `paypayl`, `accepted`, `contractid`, `mail`) VALUES (NULL, '$legalname', '$channelname', '0', '0', '0', 'n/a', '$paypalmail', 'in progress', '$contractid', '$email')";       

 if (mysql_query($query, $dbconnection))        
{                    
header("Location: http://url.com/addchannel.php?error=1");            
exit;                
}        
else         
{            
header("Location: http://url.com/addchannel.php?error=2");            
exit;        
}

}
?>


carequest.php Formular zum ändern von Datensätzen
PHP:
<?php 
session_start();
eini_set('error_reporting', E_ALL);

if(!isset($_SESSION['netname']))    
{    include "login.php";   exit;    }    
$netname = $_SESSION['netname'];
$canetname = $_GET['netname'];

$link = mysql_connect('localhost', 'bromedsql5', 'PW');
if (!$link) {               
die('Verbindung nicht möglich : ' . mysql_error());            
}                        
$db_selected = mysql_select_db('bromedsql5', $link);            
if (!$db_selected) {                
die ('Kann bromedsql5 nicht benutzen : ' . mysql_error());            
}                        

$sql = "SELECT * FROM $canetname WHERE accepted LIKE 'in progress'";                     
$db_erg = mysql_query( $sql );            
if ( ! $db_erg )           
 {            
die('Ungültige Abfrage: ' . mysql_error());            
}            
echo '<table class="table table-bordered data-table">';            
echo '<thead><tr><th>ID</th><th>Legal Name</th><th>Channel Name</th><th>PayPal E-mail</th><th>Contract ID</th><th>Contact Mail</th><th>Accept?</th></tr></thead><tbody>';            

while ($zeile = mysql_fetch_array( $db_erg, MYSQL_ASSOC))            
{            
echo '<tr class="gradeA">';            
echo '<td>'. $zeile['ID'] . "</td>";            
echo "<td>". $zeile['name'] . "</td>";            
echo "<td>".$zeile['channel'].'<a target="_blank" class="btn btn-inverse btn-mini float" href="http://youtube.com/'.$zeile['channel'].'">Open in a New tab</a>'."</td>";            
echo "<td>". $zeile['paypal'] . "</td>";            
echo "<td>". $zeile['contractid'] . "</td>";            
echo "<td>". $zeile['mail'] . "</td>";            
echo '<td><a class="btn btn-inverse" href="./carequestscript.php?netname=' . $canetname . '&status=yes&id=' . $zeile['ID'] .'">Yes</a>&nbsp;&nbsp;&nbsp;&nbsp;<a class="btn btn-inverse" href="./carequestscript.php?netname=' . $canetname . '&status=no&id=' . $zeile['ID'] .'">No</a></td>';            echo "</tr>";            }            
echo "</tbody></table>";                        

mysql_free_result( $db_erg );                

?>


carequestscript.php eigentliches PHP Script zum ändern von Datensätzen
PHP:
<?php 
session_start();
ini_set('error_reporting', E_ALL);

if(!isset($_SESSION['netname']))
    {
    include "login.php";
   exit;
    }

$netname = $_SESSION['netname'];
$canetname = $_GET['netname'];
$status = $_GET['status'];
$id = $_GET['id'];

$dbconnection = mysql_connect('localhost', 'bromedsql5', 'PW'); 

 if (!$dbconnection) {    die('Can not connect : ' . mysql_error());    }    
$db_selected = mysql_select_db('bromedsql5', $dbconnection);

if (!$db_selected) {    die ('An error has occurred : ' . mysql_error());    }

if($status == "yes")
{    
$chnage = "UPDATE $canetname Set accepted = 'Yes' WHERE ID = '$id'";
$update = mysql_query($chnage );
}
elseif($status == "no")
{    
$chnage  = "UPDATE $canetname Set accepted = 'No' WHERE ID = '$id'";    
$update = mysql_query($chnage );
}
else
{    
echo "Upppppss";
}
?>
 
Zuletzt bearbeitet:
<||><Som3><||> schrieb:
Wenn ich per session mit gebe das es ein error gibt, bleib dieser wert und damit die error anzeige bis man sich ausloggt.
Oder du löscht die Info wieder, nachdem der Fehler ausgegeben wurde.

Da ich jetzt keine konkrete Frage/Problem aus dem Post lesen kann hier ein paar allgemeine Tipps:
Mit CamelCase kann man Variablen & Co. besser lesbar machen: addChannelsScript.php statt addchannelsscript.php
Code einrücken fördert die Lesbarkeit ungemein.
"$chnage" Gesundheit!
 
Es ist eigentlich alles eingerückt.
Aber wenn ich es hier im Forum einfüge macht er einfach alles weg.

das Problem ist das folgende:

AddChannelScript.php funktionert nicht.

Am ende habe ich ja eine If abfrage ob das hinzufügen in die Datenbank funktioniert hat.
Dabei kommt aber immer raus nein hat nicht funktioniert. (also der else befehl)
 
Zurück
Oben