Zur zuletzt besuchten Seite weiterleiten?!

uafsc

Erfahrenes Mitglied
Wenn der Besucher auf meiner Website auf Inhalt zugreifen will, für den man registriert sein muss, wird er direkt zum Login Formular weitergeleitet bzw. wenn die Session abläuft. Doch wie kann ich es nun bewerkstelligen, dass der Benutzer nach dem Login auf die Seite weiter- bzw. zurückgeleitet wird, auf der er vor dem Login war.
 
Du könntest mit dem Referrer ($_SERVER['HTTP_REFERER']) arbeiten, jedoch ist das nicht ganz unproblematisch, da manche Browser das Modifizieren dieses erlauben. Ansonsten kannst du vor Aufrufen der Login ja eine Session-Variable mit der URL zur aktuellen Seite setzen, so etwa:
PHP:
session_start();
$_SESSION['redirect-to'] = $_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING'];

// Login.php:
session_start();
// Loginvorgang...
header('Location: ' . $_SESSION['redirect-to']);
 
Es gibt folgenden Fehler:
Die aufgerufene Website leitet die Anfrage so um, dass sie nie beendet werden kann.

* Dieses Problem kann manchmal auftreten, wenn Cookies deaktiviert oder abgelehnt werden.

In der Adresszeile vom Browser steht in jedem Fall immer index.php?case=dsp_login, da man vorher immer auf Login ist. Ich verstehe Deine Lösung, doch muss man auf meiner Seite eingeloggt sein, um überhaupt irgendwas zu sehen (abgesehen vom Login). Deshalb ist immer die dsp_login die zuvor aufgerufene Datei.

Ich wollte dies nur als kleine Verschönerung, doch notwendig ist es ja überhaupt nicht, bei einer Website, die komplett für unregistrierte Benutzer gesperrt ist. Eigentlich hätte ich besser .htaccess verwendet, doch wollte ich ein schöneres Login und wollte ich nicht, dass die Benutzer manuell in der .htusers / .htpasswd Datei erstellt werden müssen.

Ich werde mir diese Lösung merken für den Fall, dass mein Login mal nicht für die gesamte Website gelten sollte.

habe nun zum Referrer weitergeleitet, da es ja nicht sooo wichtig ist; nur wüsste ich noch gerne, was denn passiert, wenn der Referrer modifiziert wurde? Wird dann einfach zu einer möglicherweise externen Seite weitergeleitet oder entstehen dabei zusätzliche Sicherheitslücken?
 
Nun habe ich folgenden Code, der ausgeführt wird, falls die Logindaten korrekt sind:

PHP:
if(!isset($_SERVER['HTTP_REFERER'])){
	header("Location: index.php?case=dsp_overview");
} else {
	header("Location: ".$_SERVER['HTTP_REFERER']);
}

Doch wenn ich direkt auf die Seite gehe - also wohl ohne Referer - kommt erneut die Meldung
Die aufgerufene Website leitet die Anfrage so um, dass sie nie beendet werden kann.

* Dieses Problem kann manchmal auftreten, wenn Cookies deaktiviert oder abgelehnt werden.

Wieso kommt da nicht index.php?case=dsp_overview
 
Zeig mal die login.php und die index.php, denn vielleicht hat sich da ein kleiner Fehler eingeschlichen, dass die ganze Zeit zwischen den beiden Seiten hin und her geleitet wird :)
 
die index.php:
PHP:
ob_start();
session_start();

include('includes/config.php');
if(get_magic_quotes_gpc()) {
  array_stripslashes($_GET);
  array_stripslashes($_POST);
  array_stripslashes($_COOKIE);
}
include('templates/'.TEMPLATE_DIR.'/index.php');

ob_flush();

In der config.php werden functions.php, constant.php & db_connect.php. In der functions.php sind einige Funktionen, die fürs Login verwendet werden.

Loginfunktionen in der functions.php:
PHP:
function check_user($name, $pass) {
  $sql = "SELECT 
  	UserID
  FROM 
  	users
  WHERE 
  	UserName = '".$name."' AND 
  	UserPass = MD5('".$pass."')
  LIMIT 1";
  $result = mysql_query($sql) or die(mysql_error());
  if(@mysql_num_rows($result) == 1) {
    $user = @mysql_fetch_array($result);
    return $user['UserID'];
  }
  else {
		return false;
	}
}

function login($userid) {
  $sql = "UPDATE 
  	users
  SET 
  	UserSession = '".session_id()."'
  WHERE 
  	UserID = ".$userid;
  mysql_query($sql);
}

function logged_in() {
  $sql="SELECT
  	UserID
  FROM
  	users
  WHERE
  	UserSession = '".session_id()."'
  LIMIT 1";
  $result = mysql_query($sql);
  return(@mysql_num_rows($result) == 1);
}

function logout() {
  $sql="UPDATE
  	users
  SET 
  	UserSession = NULL
  WHERE 
  	UserSession = '".session_id()."'";
	mysql_query($sql);
}

dsp_login.php:
PHP:
if(isset($_POST['login'])) {
  $userid = check_user($_POST['username'], $_POST['passwd']);
  if($userid != false) {
		login($userid);
	} else { ?>
		<p>
			Ihre Anmeldedaten sind nicht korrekt.
		</p>
	<?php }
}
if(!logged_in()) { ?>
	<h1>
		Sie sind hier: <?php echo $breadcrump; ?>
	</h1>
	<p>
		<table class="login">
			<form action="index.php?case=dsp_login" method="POST" class="login">
				<tr>
					<td>
						Benutzername:
					</td>
					<td>
						<input type="text" name="username" id="username" />
					</td>
				</tr>
				<tr>
					<td>
						Passwort:
					</td>
					<td>
						<input type="password" name="passwd" id="passwd" />
					</td>
				</tr>
				<tr>
					<td>
						<input type="submit" name="login" value="Login" />
					</td>
					<td>
						<input type="button" name="lost_passwd" value="Passwort vergessen?" onclick="window.location.href='index.php?case=dsp_lost_passwd'">
					</td>
				</tr>
			</form>
		</table>
	</p>
<?php } else {
	if(isset($_SERVER['HTTP_REFERER'])){
		header("Location: ".$_SERVER['HTTP_REFERER']);
	} else {
		header("Location: index.php?case=dsp_overview");
	}
}



PS: in der index.php wird u.a. auch die cases.php inkludiert, in der sich die "switch-case-Konstruktion" für die Navi befindet.
 
Hm. In der index.php, wo wird denn da geprüft ob man eingeloggt ist? Ersetz dort mal das [phpf]header[/phpf] dann durch [phpf]exit[/phpf] und guck, ob die Sessionvariablen alle befüllt sind ([phpf]var_dump[/phpf]). Und probier noch folgendes bei der login.php:
PHP:
    if(!defined('SID')){
      define('SID', session_name() . '=' . session_id());
    }

    if(isset($_SERVER['HTTP_REFERER'])){
        if(strpos('?', $_SERVER['HTTP_REFERER']) != false){
            header("Location: ".$_SERVER['HTTP_REFERER'] . '&' . SID);
        } else {
            header("Location: ".$_SERVER['HTTP_REFERER'] . '?' . SID);
        }
    } else {
        header("Location: index.php?case=dsp_overview&" . SID);
    }
 
header soll ich in der login durch exit ersetzen?! da ändert sich nix...

mit var_dump() ausgeben kann ich lediglich SID und session_id(). SID gibt
Code:
string(0) ""
aus. und eine $_SESSION['blabla'] variable hab ich ja gar nicht mehr-.-

...und dein code bringt leider auch nichts, ausser dass die weiterleitung nun auch nicht mehr geht, wenn der REFERER gesetzt ist...
 
Hm. Also bei einem [phpf]var_dump[/phpf] auf SID sollte eher etwas in dieser Richtung rauskommen:
Code:
string(42) "PHPSESSID=3772188d83fcc4d2f2d5b0ae402d3f15"
Wo hast du das [phpf]var_dump[/phpf] ausgeführt? Auf der index.php?
 
Zurück