ubuntuusers.de

Logout Skript (nach Druck auf submit-Button wird der Code nicht ausgeführt)

Status: Gelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

Wolfmann

Anmeldungsdatum:
7. Oktober 2018

Beiträge: 350

Hallo,

Sorry, dass ich euch schon wieder behelligen muss.

Es geht nun um eine Logout-Funktion... Den Login habe ich mit eurer Hilfe nun hinbekommen - mit dem logout klappt es noch nicht.

Das Ziel: Wenn eine Session gestartet wurde, wird ein "abmelden"-Button eingeblendet. Wird dieser gedrückt, soll die session zerstört werden. Leider funktioniert der Button nicht wie erhofft. Nach Klick auf den Button scheint der user zwar nicht mehr angemeldet, aber eventuelle Kontrollausgaben werden nicht angezeigt usw, sprich: der Code wird meiner Ansicht nach nicht ausgeführt. (Sorry, ich kanns nicht besser beschreiben).

Ich habe mal den Code angefügt (sagt ja mehr als 1000 Wörter). Vielleicht kann ein Profi mal draufschauen.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<!DOCTYPE html>
<html>
<head>
<title>Unterrichtsmaterialien Englisch</title>
<link rel="stylesheet" href="style.css" type="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=yes">
<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script type="text/javascript"></script>
</head>

<body>

<header>

<section id="containerbild1">
<img src="feuerwerk.jpeg" id="bild1">
</section>

<section id="ueberschrift">

<h1 class="Standardueberschrift">Uploadbereich</h1>
<h1 class="Ersatzueberschrift">Upload</h1>
</section>

<section id="containerbild2">
<img src="feuerwerk.jpeg" id="bild2">
</section>
</header>

<nav>
	
	
		<ul class="dropdown">
	
	<li> <img src="menu.jpeg" alt="Bild aktivieren">
		<ul class="Submenu">
			<li><a href="index.php">Home</a></li>
			<li><a href="englisch.php">Englisch</a></li>
			<li><a href="franz.php">Französisch</a></li>
			<li><a href="plaene.php">Pläne</a></li>
			<li><a href="termine.php">Termine</a></li>
			<li><a href="impressionen.php">Galerie</a></li>
		</ul>	
	</li>
	</ul>
	
	<ul class ="Standard">
			<li><a href="index.php">Home</a></li>
			<li><a href="englisch.php">Materialien Englisch</a></li>
			<li> <a href="franz.php">Materialien Französisch</a></li>
			<li><a href="plaene.php">Pläne</a></li>
			<li><a href="termine.php">Termine</a></li>
			<li><a href="impressionen.php">Impressionen</a></li>
	</ul>

</nav>


<form method="post" action="">
<input type="text" name="user" placeholder= "Gib deinen Namen ein"> <br />
<input type="password" name="pw" placeholder="Gib dein Passwort ein"> <br />
<input type="submit" name="submit" value="anmelden">
</form>
<br />



<?php

$server = "localhost";
$user= "root";
$kennwort="Netzwerk";
$datenbank="personen";

$verbindung = new mysqli($server, $user, $kennwort, $datenbank);

if ($verbindung->connect_error) {
echo "Einloggen derzeit nicht möglich"."<br />";
}




if (isset($_POST['submit'])) {
	require 'Includes/dbh.inc.php';
	$abfrage = $verbindung->prepare("SELECT * FROM homepage WHERE name = ? AND password = ?");
	$abfrage->bind_param('ss', $_POST['user'], $_POST['pw']);
	$abfrage->execute();
	$search_result = $abfrage->get_result();


	if ($search_result->num_rows == 1) {
	
		$reihe = $search_result->fetch_assoc();
		session_start();
		$_SESSION['upload'] = $reihe['name'];
		
		        if (isset($_SESSION['upload'])) {
			require_once 'login.inc.php';
			
				if (isset($_POST['logout'])) {
                                <form method="post" action="upload.php">
                                <input type="submit" name="logout" value="logout">
                                </form>
			  	echo "logged out";
				session_destroy();}
			}			
			}
	

		}else {
		echo "Falscher Login";
		}
	}	
?>

Für Anregungen danke ich schonmal.

Wolfmann

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2018

Beiträge: 350

Hallo,

Sorry, dass ich euch schon wieder behelligen muss.

Es geht nun um eine Logout-Funktion... Den Login habe ich mit eurer Hilfe nun hinbekommen - mit dem logout klappt es noch nicht.

Das Ziel: Wenn eine Session gestartet wurde, wird ein "abmelden"-Button eingeblendet. Wird dieser gedrückt, soll die session zerstört werden. Leider funktioniert der Button nicht wie erhofft. Nach Klick auf den Button scheint der user zwar nicht mehr angemeldet, aber eventuelle Kontrollausgaben werden nicht angezeigt usw, sprich: der Code wird meiner Ansicht nach nicht ausgeführt. (Sorry, ich kanns nicht besser beschreiben).

Ich habe mal den Code angefügt (sagt ja mehr als 1000 Wörter). Vielleicht kann ein Profi mal draufschauen.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<!DOCTYPE html>
<html>
<head>
<title>Unterrichtsmaterialien Englisch</title>
<link rel="stylesheet" href="style.css" type="text/css">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=yes">
<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script type="text/javascript"></script>
</head>

<body>

<header>

<section id="containerbild1">
<img src="feuerwerk.jpeg" id="bild1">
</section>

<section id="ueberschrift">

<h1 class="Standardueberschrift">Uploadbereich</h1>
<h1 class="Ersatzueberschrift">Upload</h1>
</section>

<section id="containerbild2">
<img src="feuerwerk.jpeg" id="bild2">
</section>
</header>



<form method="post" action="">
<input type="text" name="user" placeholder= "Gib deinen Namen ein"> <br />
<input type="password" name="pw" placeholder="Gib dein Passwort ein"> <br />
<input type="submit" name="submit" value="anmelden">
</form>
<br />



<?php

$server = "localhost";
$user= "root";
$kennwort="Netzwerk";
$datenbank="personen";

$verbindung = new mysqli($server, $user, $kennwort, $datenbank);

if ($verbindung->connect_error) {
echo "Einloggen derzeit nicht möglich"."<br />";
}




if (isset($_POST['submit'])) {
	require 'Includes/dbh.inc.php';
	$abfrage = $verbindung->prepare("SELECT * FROM homepage WHERE name = ? AND password = ?");
	$abfrage->bind_param('ss', $_POST['user'], $_POST['pw']);
	$abfrage->execute();
	$search_result = $abfrage->get_result();


	if ($search_result->num_rows == 1) {
	
		$reihe = $search_result->fetch_assoc();
		session_start();
		$_SESSION['upload'] = $reihe['name'];
		
		        if (isset($_SESSION['upload'])) {
			require_once 'login.inc.php';
			       <form method="post" action="upload.php">
                                <input type="submit" name="logout" value="logout">
                                </form>
				if (isset($_POST['logout'])) {
			  	echo "logged out";
				session_destroy();}
			}			
			}
	

		}else {
		echo "Falscher Login";
		}
	}	
?>

Für Anregungen danke ich schonmal.

Moderiert von ChickenLipsRfun2eat:

Das Thema ist mit diesem zusammengeführt worden. Bitte erstelle nur ein Thema pro Fragestellung!

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11265

Wohnort: München

Wenn du den Logout Post-Request sendest, sind Benutzername und Passwort nicht gesetzt, damit dürfte die Datenbankabfrage nichts zurückgeben und dadurch die if-Bedingung in Zeile 65 nicht greifen und der Code wird gar nicht erst ausgeführt.

Dein Code prüft auch nicht auf eine bestehende Session und dürfte nur unmittelbar nach dem POST-Request wie gewünscht den Logout-Button anzeigen, aber nicht mehr, wenn du dich auf der Seite weiterbewegst...

Schau dir z.B. mal https://www.php-einfach.de/php-tutorial/php-sessions/ mit dem Beispiel am Ende an, wie man sowas im einfachsten Fall umsetzen könnte. Bevor man das außerhalb einer Testumgebung nutzt, lohnt es sich vermutlich https://www.php.net/manual/de/book.session.php durchzuarbeiten, damit man nicht aus Versehen ungewollte Sicherheitslücken einbaut.

Wolfmann

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2018

Beiträge: 350

So, ich habe mal ein wenig gebastelt und deine Anleitung durchgearbeitet. Ich habe das jetzt so gelöst, dass die Verlinkung nicht durch das Formular selbst, sondern durch den header-Befehl vollzogen wird. Auf der Seite, auf die verlinkt wird, klappt der Logout nun auch. Ich musste aber dazu nochmal auf die gleiche Seite verlinken, da man sonst den Button zweimal drücken muss, um ausgeloggt zu werden.

Ich poste nochmal die beiden Dateien. Vlt. kann man ja noch was verbessern, auch wenn die Grundfunktion erstmal das macht, wie geplant.

Datei mit Formular:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

<?php
session_start();
?>

<form method="post" action="">
<input type="text" name="user" placeholder= "Gib deinen Namen ein"> <br />
<input type="password" name="pw" placeholder="Gib dein Passwort ein"> <br />
<input type="submit" name="submit" value="anmelden">
</form>
<br />


<?php

$server = "localhost";
$user= "root";
$kennwort="Netzwerk";
$datenbank="personen";

$verbindung = new mysqli($server, $user, $kennwort, $datenbank);

if ($verbindung->connect_error) {
echo "Einloggen derzeit nicht möglich"."<br />";
}




if (isset($_POST['submit'])) {
	require 'Includes/dbh.inc.php';
	$abfrage = $verbindung->prepare("SELECT * FROM homepage WHERE name = ? AND password = ?");
	$abfrage->bind_param('ss', $_POST['user'], $_POST['pw']);
	$abfrage->execute();
	$search_result = $abfrage->get_result();


	if ($search_result->num_rows == 1) {
		//echo "Hallo ".$_POST['user'].", du hast dich erfolgreich eingeloggt";
		$reihe = $search_result->fetch_assoc();
		//session_start();
		$_SESSION['upload'] = $reihe['name'];
		//echo $_SESSION['upload'];
		if (isset($_SESSION['upload'])) {
			require_once 'login.inc.php';
			header("Location: ui.php");
			}			
			}
		 }else {
		echo "Falscher Login";
		}

Und die Seite, auf die nach erfolgreichem Login verlinkt wird:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
session_start();
?>


<?php
if (!isset($_SESSION['upload'])) {
echo "Sie sind unberechtigterweise auf dieser Seite";
}else{
echo "Willkommen zurück, ".$_SESSION['upload']."<br>";


echo '<form action ="" method="post">';
echo '<input type ="submit" name="logout" value="logout">';
echo '</form>';


if (isset($_POST['logout'])) {
session_destroy();
header("Location:ui.php");
exit();
}
}
?>

Eine allgemeine Verständnisfrage habe ich noch: Welchen Vorteil hat die Verwendung von sessions? Könnte man das, was die SESSION-Variable macht theoretisch nicht mit jeder anderen globalen Variable auch erreichen?

An dieser Stelle möchte ich auch mal ein herzliches Dankeschön an das Forum und die hilfsbereiten User ausdrücken. Es ist toll, wie ausführlich hier (Linux)-Anfängern geholfen wird. Das ist in vielen Boards (leider) nicht so der Fall.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11265

Wohnort: München

Wolfmann schrieb:

Eine allgemeine Verständnisfrage habe ich noch: Welchen Vorteil hat die Verwendung von sessions? Könnte man das, was die SESSION-Variable macht theoretisch nicht mit jeder anderen globalen Variable auch erreichen?

Das Grundproblem ist ja, dass der Server einen Client über aufeinander folgende HTTP-Requests zuordnen können soll, damit er z.B. weiß, dass er sich erfolgreich angemeldet hat, was er zuletzt gemacht hat bzw. generell berechtigt ist einen bestimmten Teil einer Webseite aufzurufen. Da es unpraktisch ist immer Benutzernamen und Passwort mitzuschicken (Datenbankabfragen zum Überprüfen dieser Informationen sind ja relativ langsam), gibt es die Idee dem Client etwas auszuhändigen, das sich vom Server in Zukunft leichter verarbeiten lässt - das können Cookies, JWT oder ähnliches sein.

sessions bietet eine Abstraktion (vgl. das dazugehörige Kapitel aus der PHP-Dokumentation: https://www.php.net/manual/de/book.session.php), um diesen Informationsaustausch zwischen Server und Client angenehmer nutzen zu können - der Server schickt dem Client standardmäßig Cookies und der Client nutzt diese Cookies bei folgenden Requests, um dem Server zu zeigen, wer er ist. Die $_SESSION-Variable ist dann ähnlich wie $_POST (das die von einem POST HTTP-Request übermittelten Daten aufbereitet) nur eine Abstraktion in Form eines assoziativen Arrays, der den einfachen Zugriff auf diese Daten ermöglicht.

Wolfmann

(Themenstarter)

Anmeldungsdatum:
7. Oktober 2018

Beiträge: 350

Vielen Dank für die Erläuterung und sorry für die späte Rückmeldung. Langsam wird das alles ein bisschen klarer ☺

Antworten |