| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

06-12-2011, 20:55
|
|
Alpha0493
Registrierter Benutzer
|
|
Registriert seit: Dec 2011
Beiträge: 14
|
|
Umgehen des Passwortschutzes verhindern?
Hallo,
ich habe folgendes Problem:
ich habe für eine Website einen Passwortschutz eigerichtet der so aussieht:
PHP-Code:
<?php
session_start();
?>
<?php
$verbindung = mysql_connect("xxxx", "xxxx" , "xxxx")
or die("Verbindung zur Datenbank konnte nicht hergestellt werden");
mysql_select_db("xxxx") or die ("Datenbank konnte nicht ausgewählt werden");
$username = $_POST["username"];
$passwort = md5($_POST["password"]);
$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);
$abfrage = "SELECT username, passwort FROM login WHERE username LIKE '$username' LIMIT 1";
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);
if($row->passwort == $passwort)
{
$_SESSION["username"] = $username;
header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/geheim.php');
}
else
{
header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/index.html');
}
?>
Nun wird man danach auf geheim.php weitergeleitet :
PHP-Code:
<?php
session_start();
?>
<?php
$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);
if(!isset($_SESSION["username"]))
{
echo "Bitte erst <a href=\"index.html\">einloggen</a>"; }
else {header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/News.html');}
?>
und dann kommt man zur geschützten Seite.
Jedoch wenn jemand einfach einen Link zu einer der eigendlich geschüzten Seiten, z.b http://...news.html in die Suchleiste des Browsers eingibt so umgeht er die index.html und der Passwortschutz brigt garnichts.
Kann mir jemand einen Tipp geben wie ich das verhindern kann?
Kenne mich leider nicht so gut mit php aus.
Mit freundlichen Grüßen Alpha0493
|

06-12-2011, 21:01
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Die Seite mit PHP ausliefern.
Davon abgesehen hat dein "Passwortschutz" noch einige weitere scheunentorgroße Löcher:
- Verwende nicht LIKE, um den Benutzernamen zu prüfen.
- Du hast SQL-Escaping vergessen (Grundlagen!).
Du prüfst übrigens nirgendwo, ob die Datenbankabfrage erfolgreich war. Was ist, wenn sie mal fehlschlägt?
|

06-12-2011, 21:13
|
|
Alpha0493
Registrierter Benutzer
|
|
Registriert seit: Dec 2011
Beiträge: 14
|
|
Erstmal vielen Dank für die schnelle Antwort.
Wie gesgt bin ein totaler Anfänger mit php
kannst du das mit dem "ausliefern" etwas näher erläutern ? ich nehme an ich muss dazu etwas in den header der einzelnen seiten schreiben?
Was schlägst du denn als Alternative zu 'Like' vor?
Wenn Benutzername und Passwort nicht gefunden werden wird man zurück zur Login Seite geleitet (index.html)
Schonmal Danke im Voraus
Geändert von Alpha0493 (06-12-2011 um 21:16 Uhr)
|

06-12-2011, 21:19
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von Alpha0493
kannst du das mit dem "ausliefern" etwas näher erläutern ? ich nehme an ich muss dazu etwas in den header der einzelnen seiten schreiben?
|
Das hat nichts mit dem Header zu tun.
deliver_page.php
PHP-Code:
session_start();
if (empty($_SESSION['username'])) { header('Location: http://example.org/login.php'); } else { $pageWhitelist = array( 'news', 'foo', 'bar', 'baz' );
if (isset($_GET['page']) && in_array($_GET['page'], pageWhitelist, true)) { include '/www/content_folder/' . $_GET['page'] . '.html'; } }
Und dann die Seite zB. mit ./deliver_page.php?page=news aufrufen
Zitat:
Zitat von Alpha0493
Was schlägst du denn als Alternative zu 'Like' vor?
|
Was spricht gegen "="?
|

06-12-2011, 21:50
|
|
Alpha0493
Registrierter Benutzer
|
|
Registriert seit: Dec 2011
Beiträge: 14
|
|
Ich denke es spricht nichts gegen ein '='
hab den php-code jetzt so :
PHP-Code:
<?php
session_start();
$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);
if (empty($_SESSION['username'])) {
header('Location: http://'.$hostname.($path == '/' ? '' : $path).'index.html');
} else {
$pageWhitelist = array(
'News', 'Gaestebuch', 'Kontakt', 'Links'
);
if (isset($_GET['page']) && in_array($_GET['page'], $pageWhitelist, true)) {
include ('meineSeite' . $_GET['page'] . '.html');
}
}
?>
nur das include funktioniert nicht in zeile 15
kommt eine warnung das der Wrapper ausgeschalten ist in der Server config und das die Adresse nicht gefunden werden kann
warum das?
Danke
Geändert von Alpha0493 (06-12-2011 um 21:57 Uhr)
|

06-12-2011, 23:49
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Du zeigst Fantasiecode und nicht den tatsächlichen. Die Fehlermeldung kann bei diesem Code niemals auftreten.
|

07-12-2011, 09:22
|
|
Alpha0493
Registrierter Benutzer
|
|
Registriert seit: Dec 2011
Beiträge: 14
|
|
So hab das 'meineSeite' (also den path) wegenommen und nun funktioniert es:
PHP-Code:
<?php
session_start();
$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);
if (empty($_SESSION['username'])) {
header('Location: http://'.$hostname.($path == '/' ? '' : $path).'index.html');
} else {
$pageWhitelist = array(
'News', 'Gaestebuch', 'Kontakt', 'Links'
);
if (isset($_GET['page']) && in_array($_GET['page'], $pageWhitelist, true)) {
include ( $_GET['page'] . '.html');
}
}
?>
Wahrscheinlich bin ich einfach nur zu blöd aber was hindert mich den jetzt daran die seite immernoch über http://meineseite/News.html aufzurufen?
|

07-12-2011, 09:50
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Gar nichts. Du musst diese Datei in einen nicht öffentlichen Ordner verschieben, der nicht über HTTP erreicht werden kann.
|

07-12-2011, 09:54
|
|
Alpha0493
Registrierter Benutzer
|
|
Registriert seit: Dec 2011
Beiträge: 14
|
|
wie lege ich einen solchen ordner an ?
habe einen ordner erstellt der sich schutz nennt, der kann aber auch ohne probleme erreicht werden
um noch mal auf das sql-escaping zurück zu kommen: reicht es wenn ich das einfach so einfüge unter der Abfrage?
PHP-Code:
mysql_real_escape_string($username);
mysql_real_escape_string($passwort);
|

07-12-2011, 10:02
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Hallo,
google mal nach „htaccess Verzeichnisschutz“.
Zu deiner anderen Frage: Ja, das reicht. In einer Datenbankabfrage rufst du diese Funktion für jede Benutzereingabe auf und kannst das Ergebnis dann sicher verwenden. Besser und auch einfacher sind allerdings Prepared Statements und die Verwendung von PDO.
Gruß,
Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

07-12-2011, 10:02
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.328
|
|
Zitat:
Zitat von Alpha0493
wie lege ich einen solchen ordner an ?
|
Indem du aus dem Document-Root-Ordner rausgehst und einen neuen anlegst?
Zitat:
Zitat von Alpha0493
habe einen ordner erstellt der sich schutz nennt, der kann aber auch ohne probleme erreicht werden
|
Dann hast du ihn an der falschen Stelle erstellt.
Zitat:
Zitat von Alpha0493
um noch mal auf das sql-escaping zurück zu kommen: reicht es wenn ich das einfach so einfüge unter der Abfrage?
PHP-Code:
mysql_real_escape_string($username);
mysql_real_escape_string($passwort);
|
Unter der Anfrage bringts nix. In der Abfrage schon eher.
|

07-12-2011, 10:13
|
Wotan
Master  
|
|
Registriert seit: Sep 2001
Ort: Berlin
Beiträge: 5.348
|
|
Da du ja mit Session arbeitest, setze dir nach dem Erfolgreichen Login einfach eine Session[var] und prüfe diese nach dem vorhanden sein und nach dem Inhalt in deiner news.html, ist die Session[var] nicht vorhanden oder hat den falschen Inhalt, schickst du den User einfach wieder auf die Loginseite zurück, ansonsten zeigst du den User eben die news.html an.
|

07-12-2011, 10:18
|
|
Alpha0493
Registrierter Benutzer
|
|
Registriert seit: Dec 2011
Beiträge: 14
|
|
Kann den das php-script dann noch ohne probleme auf den ordner zugreifen wenn ich ihn mit "htaccess Verzeichnisschutz" versehe?
wenn das geht wäre das eine super möglichkeit
hmm ich benutze zur zeit nur einen kostenlosen server auf cwsurf.de un da habe ich nur zugriff auf ein verzeichnis in welchem sich standarmäßig die ordner "bot", "botconfig" und "useragent" befinden
bisher habe ich meine dateien einfach nur in das selbe verzeichnis gespeichert
soll ich nun verher noch einen root ordner anlegen? oder ist auf dem server ein unerreichbarer ordner nicht realisierbar?
bei login.php sieht nun wie folgt aus :
PHP-Code:
<?php
session_start();
?>
<?php
$verbindung = mysql_connect("dxxxx", "xxxxx" , "xxxx")
or die("Verbindung zur Datenbank konnte nicht hergestellt werden");
mysql_select_db("xxxxx") or die ("Datenbank konnte nicht ausgewählt werden");
$username = $_POST["username"];
$passwort = md5($_POST["password"]);
$hostname = $_SERVER['HTTP_HOST'];
$path = dirname($_SERVER['PHP_SELF']);
$abfrage = "SELECT username, passwort FROM login WHERE username = '$username' LIMIT 1";
mysql_real_escape_string($username);
mysql_real_escape_string($passwort);
$ergebnis = mysql_query($abfrage);
$row = mysql_fetch_object($ergebnis);
if($row->passwort == $passwort)
{
$_SESSION["username"] = $username;
header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/deliver_page.php?page=News');
}
else
{
header('Location: http://'.$hostname.($path == '/' ? '' : $path).'/index.html');
}
?>
ist das nun so richtig mit dem sql-escaping?
Geändert von Alpha0493 (07-12-2011 um 10:23 Uhr)
|

07-12-2011, 10:21
|
|
Alpha0493
Registrierter Benutzer
|
|
Registriert seit: Dec 2011
Beiträge: 14
|
|
@ wotan
aber diese prüfung geschieht doch auch durch ein php.script oder?
kann ich das einfach mit in ein html-dokument schreiben?
Geändert von Alpha0493 (07-12-2011 um 10:25 Uhr)
|

07-12-2011, 10:24
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
Zitat:
|
Kann den das php-script dann noch ohne probleme auf den ordner zugreifen wenn ich ihn mit "htaccess Verzeichnisschutz" versehe?
|
.htaccess Dateien werden vom Webserver gelesen und ausgewertet.
Dem PHP sind die völlig wurscht.
Zitat:
|
ist das nun so richtig mit dem sql-escaping?
|
Nein!
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|