PHP Globale Variabeln -> wie ansprechen?

L

lyzerak

Gast
Hi Leute

Kann mir jemand einen Tipp geben.

Ich habe 3 files:

index.php
login.php
new_user_rating.php

So stelle ich mir das vor:

1. Ich rufe die Homepage auf und lande auf index.php. Dort klicke ich auf "new user rating"
2. Danach prüfe ich ob ich angemeldet bin. Falls nein -> login.php, falls ja -> new_user_rating.php.
3. Nach der Abgabe des Rating, verweise ich zurück auf index.php

Jetzt kommt der "tricky Part". Ich möchte nun erkennen wenn ich angemeldet bin, printe ich einen "Abmelden" link auf der index.php.

Das Problem welches ich habe ist nun, dass der Link immer angezeigt wird, egal ob an- oder abgemeldet.


Codmässig siehts inetwa so aus:

inxed.php

Code:
...
<?php

if ($IsRegistred == true); 
{
	print "<a href='logout.php'>Abmelden</a>"; 	
}
?>
...

login.php

Code:
...
global $IsRegistred;
...
     if ($username == 'test' && $passwort == '123456') {
    	  $_SESSION['angemeldet'] = true;
		  
		  $IsRegistred = true;


Bin absolut nicht der php Profi, hab grad angefangen damit, danke für jegliche Tipps.

Gruss
 
Na, so funktioniert des net.

Ich würde dir raten, mal was wie "PHP variable scope" oder so zu googeln. ;)

Also, das ganze in Kurzfassung: Wenn du eine Funktion erstellst sind diese Variablen lokal in der Funktion und werden nach Ablauf der Funktion gelöscht. Um das zu verhindern kann man globale Variablen nehmen, oder das Schlüsselwort "global".
Eigentlich hier egal, weil: Das ganze funktioniert immer nur in einem PHP-Programm.
D.h. wenn du nacheinander "index.php" aufrufst und danach "login.php", dann ist das ganz einfach ein anderes Programm, d.h. des hat keine Variablen mit der index.php gemeinsam.
Der letzte Satz ist nicht ganz richtig, denn es gibt schon Variablen die man mitnehmen kann, Stichwort Cookies und Sessions. Also google entweder mal danach, oder (was m.Mn. nach besser) wäre: Baue dein Login-Skript in die index ein oder mach ein include, dann funktioniert das.
 
PHP:
if (isset($_SESSION['angemeldet']) != true); 
{
	print "<a href='logout.php'>Abmelden</a>"; 	
}

du nutzt doch schon sessions, also frag sie auch ab!
 
Mexxim schrieb:
erstmal nen ordentlichen loginbereich schreiben, sonst wird das gar nichts:
http://www.php-einfach.de/tuts_mysql_login.php

Verlink so einen Scheiß bitte nicht mehr ohne 1-2 Dutzend Warnhinweise.
Hier mal ein Code-Ausschnitt, mal sehen ob du den Schwachsinn selbst siehst...

PHP:
$username = $_POST["username"];
/* noch mehr Code, der nix zur Sache tut */
mysql_query("SELECT id FROM login WHERE username LIKE '$username'");

Oder wie isses hiermit? Findest du den Fehler?
PHP:
$passwort = md5($passwort);


Insgesamt kann ich hier nur sagen: Sauber von Null anfangen und evtl. mal den Code eines GUTEN und SAUBER STRUKTURIERTEN Open Source CMS zu Rate ziehen. Contao, Joomla oder Drupal wären code-seitig einen Blick wert, von Wordpress sollte man die Finger lassen, außer man steht auf Bad Practice - Beispiele.
 
Huch, MD5 und ungesicherte Werte in einem SQL-Query. Sehr Böse.

Schau dir lieber die Tutorials auf phpBuddy an. Die sind zwar auch nicht mehr ganz auf dem aktuellen Stand aber sind deutlich besser:
http://www.phpbuddy.eu/login-systeme-einfach-bis-profi.html

Und wie Blackbenji schon gesagt hat: Du nutzt Sessions. Genau dafür sind diese da. Du fragst also Benutzername und Passwort ab und schreibst anschliessend in die Session, dass der Benutzer eingeloggt ist. Anschliessend kannst du auf jeder weiteren Seite bzw. überall wo du es brauchst die Variable $_SESSION['angemeldet']. Bei dir wäre das in etwa so: (Achtung, nur dein Beispiel und nicht wie es üblich ist, so
etwas zu lösen!!)

index.php

Code:
...
<?php
 
if (isset($_SESSION['angemeldet']) && $_SESSION['angemeldet'] === true); 
{
	print "<a href='logout.php'>Abmelden</a>"; 	
}
?>
...


login.php

Code:
...
     if ($username == 'test' && $passwort == '123456') {
    	  $_SESSION['angemeldet'] = true;

Zu beachten ist zusätzlich, dass in jeder Datei wo du Sessions brauchst, GANZ OBEN im Dokument der Befehl session_start() stehen muss. Natürlich nur in den "main-files". Also nicht in den files, die du z.B. includest. :-)
 
Hallo Leute,

Danke vielmals für die Vorschläge. Das mit dem Login, das mach ich auf keinen Fall so. Ich habe ein reddit-php-sdk (github)
Ich habe die simple Lösung mit dem test und 123456 nur als Test gemacht, damit ich das mit der globalen Variable verstehe.

Ich selber werde keine Passwörter o.ä. speichen. Ich mache es über dieses sdk, ich "passe" nur den Benutzername und das PW weiter ans sdk. Dieses macht dann über https eine Anfrage bei reddit und liefert mir ein true oder false wenn Benutzername und PW richtig sind oder nicht. Falls alles OK ist, würde ich dann eben auf new_user_rating weiterleiten.

Im login.php wäre dann irgendwie sowas drinn (nur Prosa):

Code:
...
     if $RedditResponse = true {
    	  $_SESSION['angemeldet'] = true;
...

Ich werde mich dann auf jeden Fall nochmals einlesen in die Sessions Sache. Beim Logout zerstöre ich die Sessions auch:

Code:
...
     session_start();
     session_destroy();
...

Ich habe diese Loginprozedur von hier.
Ich würde gerne das nun versuchen, und dann meine Lösung hier posten. Ich lerne gerne von Profis. Auch in Sachen Sicherheit bin ich interessiert ein Feedback von euch zu hören.
 
Na ja, bei der Sicherheit gibt es immer Fallstricke. 3 Sachen sind aber immer wieder für einen Schadensfall gut (und alle kamen in dem von mir angemäkelten Code vor)

- Wenn man Passwörter speichert, dann nie als Klartext, sondern immer als gesalzener Hash-Wert. MD5 ist hierbei zu vermeiden, weil es viel zu schnell & effektiv ist. Bei Passwörtern ist langsamer besser, je mehr "sinnlose" Rotationen der Algorithmus fährt, desto besser. Daher: PHP Crypt-API verwenden... Gut, fällt bei dir hier grad flach. Schlechtes Hashing oder gar kein Hashing ist immer wieder beliebt bei gehackten größeren Shops. Zuletzt war da unter anderem Mr. Spex negativ aufgefallen - Klartext-Kundenpasswörter in der Datenbank.
- Niemals Daten, die von einer Fremdquelle (POST, GET, Dateien,...) ungeprüft verarbeiten. Man weiß nie, was ein gemeiner User für ein Schindluder treiben wollte. Über solche Sachen stolpern auch Onlinebanking-Systeme gern, die Folge ist eine XSS-Lücke... Und natürlich ist schlechte Eingabenfilterung der erste Angriffspunkt für SQL Injection.
- Auch dieser Punkt trifft bei dir (noch) nicht zu: Niemals die alte prozedurale Notation von MySQL verwenden. Setz immer auf PDO's. Ja, eine gute PDO-Implementierung zu schreiben ist schwer, aber es lohnt sich. Außerdem macht man das genau ein Mal, danach hat man für spätere Projekte eine wunderschöne Datenbank-Abstraktion zur Hand. Der Vorteil an striktem Einsatz von PDO mit Precompiled Statements: Der Kram ist immun gegen SQL Injection Angriffe. Hätte Sony das mal gewusst, die hätten sich richtig viel Schaden erspart.

Bei deinem speziellen Fall: Na ja, halt dich ans Framework und setze deine Session so wie du es oben ansprichst. Auch wenns nur Prosa ist: immer schön auf == bei Abfragen achten. Es sind schon Entwickler alt und grau geworden über ein fehlendes "=" in ner Abfrage. Ansonsten ist das hier wirklich ein Standard-Spiel mit Sessions. Nix besonderes.

Allgemeiner Tip:
Auch wenn komplexe Design Patterns wie MVC oftmals übertrieben sind, sollte man auch bei kleineren Projekten soweit es geht objektorientiert arbeiten und abstrahieren. Je besser deine Abstraktion, desto leichter kannst du dein Projekt später erweitern oder Teile des Projekts in was neuem verpflanzen. Natürlcih kann man auch im prozeduralen Stil abstrahieren, aber irgendwie geht das im OO etwas leichter von der Hand.
 
Hi Leute

Erstmals, soweit so gut mit der SESSION. Ich kann mich jetzt mit den reddit Benutzernamen und dem PW anmelden.
Ich verweise nun auf das new_user_rating.php. Dort habe ich ein Formular bei welchem man werte abfüllen kann (per POST).
Wenn die Werte abgefüllt sind (keine, Passwörter, E-Mails, Bankverbindungen usw. - nichts sensitives) stelle ich diese auf eine mySQL DB.

Nun muss ich ja eine SQL Verbindung machen. Ich habe da aber ein wenig wie soll ich sagen, Respekt vor dem Sicherheitsaspekt. (zmb. auch SQL-Injection)

Mir ist nicht klar, warum ich in der Connection zur DB den Benutzernamen und das PW in Klartext eintragen muss. Sämtliche How-To's welche ich begutachtet habe sehen in etwa so aus:

Code:
<?php
$db_host = "localhost";
$db_user = "test";
$db_passwort = "123456″;
$db_name = "TestDB";
mysql_connect("$db_host","$db_user","$db_passwort") or die
("Keine Verbindung moeglich");
mysql_select_db("$db_name") or die ("Die Datenbank existiert nicht.");
?>

Macht man das immer noch so? Ich meine die Sachen stehen dann in Klartext auf dem Server. Besteht die Möglichkeit für versierte Anwender dies auszulesen und ggf. in die DB zu gelangen?

Danke vielmals!
 
lyzerak schrieb:
Nun muss ich ja eine SQL Verbindung machen. Ich habe da aber ein wenig wie soll ich sagen, Respekt vor dem Sicherheitsaspekt. (zmb. auch SQL-Injection)
Verwende ausschließlich PDOs mit Prepared Statements. Diese sind immun gegen SQL Injection. Dazu noch etwas allgemeine Datenbereinigung, dann geht das wunderbar.
Lass nur die Finger von all den Tutorials mit der veralteten mysql_connect() - Notation.

Mir ist nicht klar, warum ich in der Connection zur DB den Benutzernamen und das PW in Klartext eintragen muss. Sämtliche How-To's welche ich begutachtet habe sehen in etwa so aus:
Dein PHP-Script muss sich doch bei der Datenbank anmelden. Wie soll es das tun, ohne User+PW? Ja, die Daten MÜSSEN im Klartext vorliegen.

Besteht die Möglichkeit für versierte Anwender dies auszulesen und ggf. in die DB zu gelangen?
Kommt auf das Niveau des Angriffs an, und wie arg du allgemein geschlampt hast.
1.) du könntest deine "config.inc.php" oder wie auch immer du sie nennst, in der die SQL Credentials stehen, außerhalb des Webroots lagern
2.) du könntest (und solltest) Ordner, die solche Config-Dateien enthalten, per .htaccess schützen (falls du einen Apache verwendest)
3.) da darf natürlich nirgendwo ein echo, print_r oder var_dump stehen.. döööh *G*

All das hilft nichts, wenn der Angreifer über deinen FTP-Zugang rein kommt... Dann kann er schalten und walten, wie er lustig ist. Aber dann hast du eh andere Probleme als ne Datenbank mit nicht-sensitiven Daten.
 

Ähnliche Themen

Zurück
Oben