Login bei meiner Website

Hallo zusammen,

ich bin ganz neu hier und hoffe, dass ihr mir helfen könnt... ich habe meine erste eigene Website mit PHP und CSS gebastelt (oder bin bessergesagt noch dran) und frage mich jetzt, wie sicher sie überhaupt ist...

ich habe einen login, der mittels Sessions arbeitet... bei erfolgreichem login wird in der Session hinterlegt, dass die person eingeloggt ist... Wenn ich mich jetzt aber auf dem lokalen Apache server "einlogge" erscheint unten auf der Seite folgender Text:

Warning: Unknown: Your script possibly relies on a session side-effect which existed until PHP 4.2.3. Please be advised that the session extension does not consider global variables as a source of data, unless register_globals is enabled. You can disable this functionality and this warning by setting session.bug_compat_42 or session.bug_compat_warn to off, respectively. in Unknown on line 0

ich bin aus der ganzen sache nicht besonders schlau geworden, wollte aber mal fragen, ob sich jemand damit auskennt und mir vielleicht sagen kann, ob es leicht wäre auf meiner Seite in meinen Acc. einzusteigen?? ich möchte die sicherheit einigermassen hoch halten, damit sich nicht jeder in die verschiedenen acc. "einhacken" kann, da ich vorhabe dass sich die leute persönliche Mitteilungen schicken können.

das hier ist meine Seite: http://laurentweber.la.funpic.de/reisen/index.php

über geschmack lässt sich soviso streiten, also nichts über das design ;)

Gruss
Lilu
 
danke dir für die Antowrt, aber funktioniert irgendwie nicht... X(

mein "session-code" sieht so aus:

session_start();
session_register('eingeloggt');
session_register('User_Vorname');
session_register('User_Name');
$eingeloggt = $_SESSION['eingeloggt'];
$User_Name = $_SESSION['User_Name'];
$User_Vorname = $_SESSION['User_Vorname'];

nachdem ich die session starte, schreibe ich drei variabeln in die Session (eingeloggt, User_Vorname und User_Name) mittels session_register... diese hole ich anschliessend gleich wieder raus und schreibe sie wieder in normale Variabeln...

laut der beschreibung die ich unter deinem link finde, sollte ich aber nicht session_register benutzen, sondern nur die globale $_SESSION variabel... aber die ist doch nur um variabeln aus der session zu holen und nicht um sie reinzuschreiben, oder sehe ich das falsch??
 
funktioniert leider nicht...

wenn sich jemand einloggt hinterlege ich eine 1 in $eingeloggt, diese wird dann immer wieder geprüft...

wenn ich aber die von dir vorgeschlagene syntax nehme, fliege ich immer wieder raus, heisst also, die variabel wird nicht in die Session geschrieben... auch mit:

$_SESSION['eingeloggt'] = $eingeloggt;

funktioniert es nicht... jedoch mit:

session_register('eingeloggt');

komisch...
 
Die PHP-Dokumentation rät von der Benutzung von session_register() ab und empfiehlt die Nutzung des superglobalen $_SESSION-Arrays.

Vielleicht solltest du mal das Skript posten, welches bei dir das Session-Handling übernimmt, denn die Zuweisung direkt in dieses Array funktioniert normalerweise problemlos.
 
Ist $eingeloggt überhaupt schon mit 1 belegt?
Welche Werte hast du in der Session?
print_r($_SESSION);
Gibt dir diese aus.

Gruss
 
mh...

PHP:
session_start();
if ($username = "username" && md5($password) == md5("passwort"))
{
$_SESSION['eingeloggt'] = true;
$_SESSION['User_Name'] = "nachname";
$_SESSION['User_Vorname'] = "vorname";
}

if ( $_SESSION['eingeloggt'] != true)
echo "Bitte loggen sie sich ein.";
else
echo "Hallo ". $_SESSION['User_Vorname'] . " " . $_SESSION['User_Name'] . ".<br />Sie sind eingeloggt.";

das wär ne SEHR simple version ^^
 
So, ich habs dank eurer Hilfe geschafft, ihr seid gold wert ;)

@bLaCk-DrAg0n: Mein Zeugs sieht ein bisschen komplizierter aus, weiss aber nicht ob es effektiver ist...! :D

@end4win: Danke dir, das mit print_r() war ein super tipp, da bin ich zuvor nicht drauf gekommen...!

@LX: Ja, direkt hat es dann funktioniert ;) hatte vorher eine komische konstellation mit post formular etc. und da sind die variabeln irgendwo dazuwischen verloren gegangen...

Jetzt aber doch nochmals eine frage, die ich schon zu beginn gestellt habe... wie sicher ist das ganze?? Ist es mit einfach mitteln möglich sich als jemand anders anzumelden, ohne dessen passwort zu kennen?? also den Variabeln in der session von aussen irgendwelche werte zuzuweisen (also eben den genannten Nam User_Name, User_Vorname und eingeloggt)?? sollte ich vielleicht noch zusätzlich eine sicherheitsabfrage über die Cookies machen??

Nochmals vielen dank für eure hilfe...!
 
das ist mein script:
Code:
$EMail = $_POST["EMail_login"];
$Passwort = $_POST["Passwort_login"];
if($EMail && $Passwort)
  {
    $Query = "select * from benutzer where EMail = '$EMail'";
    $Eintragen = mysql_query($Query);
    $row = mysql_fetch_row($Eintragen);
    if($row[1] == md5($Passwort))
      {
        $_SESSION['eingeloggt'] = 1;
        $_SESSION['User_Name'] =  $row[3];
        $_SESSION['User_Vorname'] = $row[4];
      }
  }

aber ich glaube es sollte reichen... irgendwie scheint es ein grosser aufwand zu sein, das ganze sicherer zu gestallten...
 
Kommt darauf an was du schützen willst.

Ein CMS - dann graut es mir.
Ein paar extra Bilder von deinen Reisen - dies musst du entscheiden.

zumindest die POST Daten solltest du validieren bevor du sie verwendest.

Gruss
 
PHP:
$EMail = $_POST["EMail_login"];
$Passwort = $_POST["Passwort_login"];
if($EMail && $Passwort)
  {
    $sql = "select `User_Name`, `User_Vorname`, `password` from benutzer where EMail = '" . $EMail . "' LIMIT 1;";
    $query = mysql_query($sql);
    $row = mysql_fetch_assoc($query);
    if($row['password'] == md5($Passwort))
      {
        $_SESSION['eingeloggt'] = 1;
        $_SESSION['User_Name'] =  $row['User_Name'];
        $_SESSION['User_Vorname'] = $row['User_Vorname'];
      }
  }

machs lieber so...

lass aber email vorher escapen...
wenn bei dir magic_quotes_gpc on is (mit "if (get_magic_quotes_gpc()) " prüfbar) einfach nen $string = stripslashes($string);, oder du machst es mit mysql_real_escape_string($string).
bei letzterem darfs aber glaub kein integer sein,also kein numerischer wert... sollte aber bei ner email eh nich der fall sein ^^.
ohne escapen richten einträge wie:

'; TRUNCATE `tabelle`;

in dem email feld großen schaden an ^^

brauch ned so viel ressourcen bei mysql..
is doch schwachsinn ne ganze zeile zu selecten wenn du nur den wert einer einzigsten spalte brauchst...
das "limit 1" dient dazu fehlern aus den weg zu gehen wenn du die spalte nich auch "UNIQUE" hast...
 
Original von end4win
(...)

zumindest die POST Daten solltest du validieren bevor du sie verwendest.

@end4win: Meinst du mit validieren, ich sollte zuerst prüfen, dass auch wirklich nur buchstaben und keine sonderzeichen oder Zahlen in die Felder geschrieben werden? Dann sollte ich das wohl auch bei meinem Anmeldeformular machen, denke ich... ;) Funktionsfähig machen ist eine sache, aber an all diese Sicherheitsvorkehrungen denken ist schon etwas ganz anderes... das problem ist wohl, dass ich selber nicht weiss, was man alles bösartges anstellen kann und wie, denn sonst würde ich wohl versuchen das zu unterbinden... ;) aber für etwas habe ich ja euch... :)

@bLaCk-DrAg0n: ok, den code werde ich von dir übernehmen, wenn ich wieder zu hause bin... was du aber mit dem escapen meinst, habe ich nicht ganz verstanden... der stripslashes(); bewirkt doch (so wie ich das gelesen und verstanden habe), dass die backslashes vor sonderzeichen die der addslashes(); macht wieder entfernt werden... was bringt mir denn das ganze?? also bei einer einwandfreien e-mail addi wohl soviso nichts, da es dort keine sonderzeichen hat, aber auch bei dem
'; TRUNCATE `tabelle`;
würde doch nichts geschehen, oder steh ich da auf dem schlauch??

nochmals danke euch beiden...!

PS: was das HTTP Request zeugs macht, von dem ich nur Bahnhof verstehe versuche ich mit meinem (lausigen) databecker buch zu verstehen... ;)
 
Hallo,
kleiner Tipp am Rande: Verwende lieber Prefixe für die Session:

Also NICHT:

PHP:
$userid = $_SESSION['userid'];

if($userid == 1)
//...

Sondern:
PHP:
$userid = $_SESSION['ses_userid'];

if($userid == 1)
//...

Wenn die Keys des Session-Arrays als Variablen verwendet werden, führt dies zu ungeahnten Komplikationen bei register globals = on, bsp:

PHP:
<?php 
$userid = $_SESSION['userid'];

if($userid == 1)
  //Du bist nur Gast


//Wer ist der neuste User
$sql = "SELECT id, username FROM user ORDER BY id DESC LIMIT 1";
$erg = mysql_query($sql);
$row = mysql_fetch_row($erg);

$userid = $row[0];
$username = $row[1];

echo "Neuster User: <a href='profil.php?id=$userid'>$username</a>";
?>

Schon steht die userid des neusten User in der Session (sofern register globals = on)
 
bei euch kann man ja ne menge lernen... lauter nützliche tipps, das habe ich gerne ;)
vielen dank...!

edit:

so, zuhause habe ich mich mal hingesetzt und eine meiner Abfragen editiert:

Code:
if(get_magic_quotes_gpc()) 
  {
    $Passwort = stripslashes($_POST["Passwort_login"]);
    $EMail = stripslashes($_POST["EMail_login"]);
  } 
else 
  {
    $EMail = $_POST["EMail_login"];
    $Passwort = $_POST["Passwort_login"];
  }
if($EMail && $Passwort)
  {
    $Query = sprintf("select * from benutzer where EMail = '%s'",
    mysql_real_escape_string($EMail));
    $Eintragen = mysql_query($Query);
    $row = mysql_fetch_row($Eintragen);
    if($row[1] == md5($Passwort))
      {
        $_SESSION['eingeloggt'] = 1;
        $_SESSION['User_Name'] =  $row[3];
        $_SESSION['User_Vorname'] = $row[4];
      }
  }

ich habe einfach den Code von php net einwenig abgeändert... jetzt frage ich mich aber, ob das ganze sicherer ist?? das mit den stripslashes(); verstehe ich immernoch nicht, addslashes(); würde doch mehr sinn machen, oder nicht??

wenn ich das jetzt richtig sehe, sollte ich nur noch die eingaben zuerst validieren und dann habe ich mehr oder weniger sichere eingabefelder was sql injections betrifft??

danke euch...!
 
Zurück
Oben