PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Erstes PHO - Script (sehr simpel?)



MolLy
27.06.2010, 21:31
Guten Abend,

ich bin ein totaler Neulig in PHP und habe nun versucht mir einen kleinen Loginscript zu erstellen...
Jetzt wollte ich mal fragen, was ihr davon haltet, bzw. welche Tipps ihr mir geben könnt, um mich zu verbessern.


Hier mal die einzelnen Dateien...

Der "Loginbereich"


<?php
session_start();
error_reporting(0);
include("inc/config.php");
include("loginformular.html");
if($_POST['send'] == "1")
{

if(isset($_POST['loginnutzername']) && isset( $_POST['loginkennwort']))
{
$username = $_POST['loginnutzername'];
$kennwort = $_POST['loginkennwort'];

}


if(empty($_POST['loginnutzername']) || empty($_POST['loginkennwort']))
{
print("Bitte geben Sie Ihren Nutzernamen/Kennwort ein!");
exit();
}


$selectuser = mysql_query("SELECT username, passwort FROM user WHERE username LIKE '$username' LIMIT 1");
$fetch = mysql_fetch_object($selectuser);
if($fetch->passwort == $kennwort)
{
print("Herzlich Willkommen " . ucfirst($username) . ". <br /> Sie haben sich erfolgreich eingeloggt<br /> <a href=\"access.php?name=$username\">Memberbereich</a>");
$_SESSION['access'] = TRUE;

}
else
{
print("Ihre eingaben sind Falsch!");

}

}
?>
Die Registrierung:



<?php
error_reporting(0);
include("inc/config.php");
include("registerformular.html");



if($_POST['send'] == "1")

{

if(empty($_POST['nutzername']))
{
print("<br />Bitte geben Sie einen Benutzernamen ein!<br />");
exit();
}
else
{
$nutzername = htmlspecialchars($_POST['nutzername']);

}

if(strlen($_REQUEST['kennwort']) < 8){
print'Ihr Passwort muss mehr als 8 Zeichen haben!<br />';
exit();

}


if(empty($_POST['kennwort']))
{
print("<br />Bitte geben Sie einen Kennwort ein!<br />");
exit();
}
else
{
$kennwort = htmlspecialchars($_POST['kennwort']);

}



if(empty($_POST['kennwort2']))
{
print("<br />Bitte wiederholen Sie Ihr Passwort<br />");
exit();
}
else
{
$kennwort2 = htmlspecialchars($_POST['kennwort2']);

}




if(empty($_POST['email']))
{
print("<br />Bitte geben Sie einen E-Mail ein!<br />");
exit();
}
else
{
$mail = htmlspecialchars($_POST['email']);

}




if($_POST['kennwort'] != $_POST['kennwort2'])
{
print("<br />Die beiden Passwoerter stimmen nicht ueberein!!<br />");
exit();
}



$checkmail = mysql_query("SELECT email FROM user WHERE email LIKE '$mail' LIMIT 1");
$checkmailrow = mysql_num_rows($checkmail);

if($checkmailrow == 1)
{
print("Die eingegebene E-Mail ist leider schon vorhanden!");
exit();
}



$checkuser = mysql_query("SELECT username FROM user WHERE username LIKE '$nutzername' LIMIT 1");
$checkuserrow = mysql_num_rows($checkuser);

if($checkuserrow == 1)
{
print("Der eingegebene Benutzername ist leider schon vorhanden!");
exit();
}

elseif($iplog == 1)
{
$ip = $_SERVER['REMOTE_ADDR'];
$adduser = mysql_query("INSERT INTO user (username, passwort, email, regdate, aktiv, code,ip) VALUES ('$nutzername','$kennwort','$mail','$date','NEIN', '$rand','$ip')");
mail($mail, $subject, $url. "/aktiv.php?name=".$nutzername."&code=.$code");
print("<br /> Ihr Benutzeraccount wurde erfolgreich hinzugef&uuml;gt. <br />Bitte &uuml;berpr&uuml;fen Sie Ihr Postfach, um Ihren Account zu aktivieren!");




}
else

{

$adduser = mysql_query("INSERT INTO user (username, passwort, email, regdate, aktiv, code) VALUES ('$nutzername','$kennwort','$mail','$date','NEIN', '$rand')");
mail($mail, $subject, $url. "/aktiv.php?name=".$nutzername."&code=.$code");
print("<br /> Ihr Benutzeraccount wurde erfolgreich hinzugef&uuml;gt. <br />Bitte &uuml;berpr&uuml;fen Sie Ihr Postfach, um Ihren Account zu aktivieren!");



}




}
?>

Die E-Mail Aktivierung:



<?php
include("inc/config.php");

$name= $_REQUEST['name'];
$code = $_REQUEST['code'];



$selectcode = mysql_query("SELECT * FROM user WHERE username LIKE '$name' AND code LIKE '$code' LIMIT 1")
or die(mysql_error());

$fetchobject = mysql_fetch_object($selectcode) or die(mysql_error());
if($fetchobject -> code == $code)
{
mysql_query("UPDATE user SET aktiv = 'JA' WHERE username LIKE '$name' AND code LIKE '$code' ") or die(mysql_error());
print("Sie wurden erfolgreich aktiviert!<br /> Loggen Sie sich <a href=\"login.php\">HIER</a> ein!");

}

?>
Und die allg. COnfig:



<?php
$dbhost = "localhost";
$dbuser = "localhost";
$dbpasswort = "localhost";
$db = "login";
$dbconnect= mysql_connect($dbhost, $dbuser, $dbpasswort, $db) or
die("Es gab ein Problem mit der Datenbankverbindung!" . mysql_error());
$sql = mysql_select_db($db, $dbconnect);




$subject = "Aktivierung";
$date = date('d.m.y');
$rand = rand(1, 999999);
$url = "////";
$iplog = "0";


?>



Vielen Dank!

QpL
27.06.2010, 21:38
Was mir direkt ins Auge fällt: Du triffst keinerlei Abwehr für SQL-Injections.
Mach dich da mal ein wenig schlau und überarbeite die Query's.

Zu dem Rest kann ich leider nichts sagen.
Grüße

Apex
27.06.2010, 21:42
Für den Emptyteil würd ich folgendes hernehmen:


If(isset($user,$pw))
{
if($user == "" OR $pw == "")
{
echo "Bitte die Felder füllen!";
}
elseif($user == $user_name AND $pw == $user_pass)
{
$_SESSION['user'] = $user;
$_SESSION['pw'] = $pw;
echo "Erfolgreich eingeloggt.";

...
Und das Formular würde ich auch mit reinpacken ^^ Also in eine Datei



if (!isset($user,$pw))
{
echo '<form name ... >
</form>';
Und dann würde ich eine 2 index.php erstellen und dort abfragen ob der User eingeloggt ist oder nicht

// Edit

Aber wie mein Vorposter gesagt hat, mangelt es überall ein wenig an Sicherheit.

// Edit 2:

Vorallem der Teil hier


$username = $_POST['loginnutzername'];
$kennwort = $_POST['loginkennwort'];
In dem Teil hier könnte alles mögliche drin stehen. Dadurch ist eine SQL Injection sehr einfach möglich.


// Edit 3:

'N kleiner Verbesserungsvorschlag zu Edit 2:

Wenn du alles durch ein Registry Pattern jagst, biste sicher

Also z. B.


if($PostRegistry->get("user"))
{
$user = $PostRegistry->get("user"));


$user ist dadurch escaped und dort können dann keine Sonderzeichen mehr hergenommen werden, was natürlich den Nachteil mit bringt, dass keine Sonderzeichen in Namen erlaubt sind.

MolLy
28.06.2010, 16:59
Okay, Danke schonmal.
Ich werde mich die Tage noch ein bisschen tiefer einlesen und dann hier nochmal meine versuche posten.

stan1986
29.06.2010, 14:20
$selectuser = mysql_query("SELECT username, passwort FROM user WHERE username LIKE '$username' LIMIT 1");
$fetch = mysql_fetch_object($selectuser);
if($fetch->passwort == $kennwort)
{
print("Herzlich Willkommen " . ucfirst($username) . ". <br /> Sie haben sich erfolgreich eingeloggt<br /> <a href=\"access.php?name=$username\">Memberbereich</a>");
$_SESSION['access'] = TRUE;

}
else
{
print("Ihre eingaben sind Falsch!");

}


In der Mysql Query fragst du das Passwort ja gar nicht ab.. d.h. als Passwort kann man eingeben was man will.. Oder uebersehe ich was?

SFX
29.06.2010, 14:26
if($fetch->passwort == $kennwort)

da fragt er das pw ab..

ps:
an deinem script zum reggen ist eine email injection möglich..

MolLy
29.06.2010, 18:50
Also ehrlich gesagt hab ich mich beim ersten Script nicht um die Sicherheit gekümmert.
Daher bin ich froh, hier in Fh ein paar leute zu finden die mir meine Fehler (Sicherheitslücken) aufzeigen.
Kennt ihr zufällig Tutorial Seiten ggn. SQL Injection?

Flic
29.06.2010, 19:51
J0hn.X3r :: Tutorials :: Webseite gegen XSS, SQLi’s, RFI und LFI schützen (http://j0hnx3r.org/?p=334)

kazuya
30.06.2010, 14:09
error_reporting(0); ist ziemlich unschön wie ich finde.
programmier es doch so, dass auch kein error kommt?
achte dabei auch an full path disclosures, typecaste variablen zu nem string wenn du sie in funktionen verwendest. also z.b. so:
mysql_real_escape_string((string)$username);
das gleiche bei SESSIONID's.. wenn man diese id auf "" setzt also nichts kommt ein error like:
Warning: session_start() [function.session-start]: The session id contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in /home/example/public_html/includes/functions.php on line 2
also mach vor session_start(); eine überprüfung, ob die ID auch valide characters hat, am besten geht das mit einem regex.. :)
if(!preg_match('/[a-zA-Z0-9-,]/',$sessid) session_regenerate_id();
wenn du fragen hast frag einfach ;)

err000r
03.07.2010, 08:41
jo, so wenige errors wie möglich ausgeben ;)