MySQL-Webseitenschutz

PHP, CSS und JavaScript lernen. Anwendungen für Webseiten
ezi
Mitglied (Level 2)
Mitglied (Level 2)
Beiträge: 11
Registriert: So 18. Jul 2021, 23:34

MySQL-Webseitenschutz

Ungelesener Beitrag von ezi »

Hallo,
ich habe den MySQL-Webseitenschutz und er funktioniert hervorragend - DANKE an Tommy und Werner für die tolle Arbeit die ihr hier macht!
Bei NetObjectFusion2015 hatte ich aber eine Änderung durch Werner bzw. Tommy hinbekommen:
wenn sich ein Benutzer auf eine geschützte Seite geklickt hat, wird er nachdem er seine Daten eingegeben hatte, direkt auf diese Seite geleitet und kam nicht erst auf die Hauptseite.
Bei den geschützten Seiten wurde der php-Code

Code: Alles auswählen

<?php
/*
 *  Webseitenschutz
 *  Diesen PHP-Code für alle Seiten benutzen
 *  die geschützt werden sollen.
 */
session_start();
if (!isset($_SESSION["login"])) {
 header("Location: ./anmeldung.php");
 exit;
}
?>
abgeändert in

Code: Alles auswählen

<?php
// Weiterleitung bei einer nicht vorhandenen Session: "login" zur Anmeldung.
// In der Session: "referer" wird der absolute Pfad zur Datei gespeichert, dieser wird
// nach einem erfolgreichen Login wieder aufgerufen!

session_start();
if (!isset($_SESSION["login"])) {
 $_SESSION["referer"] = 'https://' . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['SCRIPT_NAME'])). '/' . basename($_SERVER['SCRIPT_NAME']);
 header("Location: ./anmeldung.php");
 exit;
}
?>

Wie gesagt: bei NetObjectFusion hatte dies geklappt, bei Mobirise 5 leider nicht mehr. Kann es vielleicht sein, dass durch die php Version8 dies nicht mehr funktioniert?

Danke für mögliche hilfreiche Tipps.

Viele Grüße Ezi
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 5865
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: MySQL-Webseitenschutz

Ungelesener Beitrag von Tommy Herrmann »

Moin,

... ich habe Deinen Post mal in das Board vom Werner "Werner Zenk - Anwendungen und Skripte" verschoben, in der Hoffnung Werner liest da dann eher, denn ich sehe da jetzt keinen Fehler.

Werner beschreibt das ja hier auf seiner Seite:

https://werner-zenk.de/php/absolute_url_erstellen.php


Wozu Du allerdings diese absolute URL da als SESSION-Variable $_SESSION["referer"] überhaupt setzt, habe ich noch nicht verstanden. Wo verwendest Du diese Variable denn dann überhaupt und wozu? Kannst Du das bitte mal beschreiben und erklären!

Im Original-Skript der Anwendung ist das doch gar nicht vorhanden.

Das ist in PHP 8 nicht irgendwie anders als in PHP 7.

Diese reservierte PHP-Variable $_SERVER funktioniert auch in PHP 8 nicht anders (ich verwende auch PHP 8) und habe das gerade hier mal ausprobiert:

https://www.mobirise-tutorials.com/Test ... te-url.php

Das Skript (unten) könntest Du speichern und zum Testen mal in irgendein Verzeichnis kopieren, ich habe das als Datei mit dem Namen "absolute-url.php" getan und in dieses, mein Verzeichnis, kopiert:

Testseiten/Test/absolute-url.php

Code: Alles auswählen

<?php
    // In der Session: "referer" wird der absolute Pfad zur Datei gespeichert,
    session_start();
    $_SESSION["referer"] = 'https://' . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['SCRIPT_NAME'])). '/' . basename($_SERVER['SCRIPT_NAME']);
    echo $_SESSION["referer"];
?>


Umgeleitet wird einzig und alleine durch diesen Header-Befehl mit dieser relativen Pfadangabe zur Seite:

Code: Alles auswählen

header("Location: ./anmeldung.php");
... wird ja im Fall des falschen Login-Namens umgeleitet zu der Seite "anmeldung.php" im ./ gleichen Verzeichnis. Hier mal meine Beispielseite von der Anwendung "MySQL Webseitenschutz".

./ = bleibe im gleichen Verzeichnis
../ = gehe ein Verzeichnis höher

In der Seite zur Anmeldung (zum Login) "anmeldung.php" wird doch andererseits die Seite eingetragen, auf die nach erfolgreichem Login weitergeleitet werden soll. In diesem (meinen) Beispiel ist das dann die Seite "hauptseite.php". In meinem Beispiel liegt dann also auch die Seite mit dem Namen "hauptseite.php" im ./ gleichen Verzeichnis, nämlich in der Root des Projektes. Das kann natürlich auch irgendeine andere Seite sein oder diese kann auch einen anderen Dateinamen haben:

Code: Alles auswählen

// Benutzer bereits angemeldet - Weiterleitung zur geschützten Seite
if (isset($_SESSION["login"]) &&
    !isset($_GET["abmeldung"])) {
 header("Location: ./hauptseite.php");
 exit;
}



Wenn Du schreibst, dass das in "NetObjects Fusion" ging, denke ich natürlich gleich an diese relative Pfadangabe, denn in NOF lagen die Unterseiten meist in einem Verzeichnis "html", das ein Verzeichnis tiefer lag - im Gegensatz zu Mobirise, wo sämtliche Seiten im Stammverzeichnis (Root = Wurzelverzeichnis) des Projektes liegen.

Es wäre also (wie immer) schon wichtig Deine Seite im Netz (URL) zu sehen, damit man nicht nur raten muss.

Bitte lies mein Tutorial zum Einbau der Skripte in Mobirise vom "MySQL-Webseitenschutz" hier:

https://www.mobirise-tutorials.com/Seit ... orial.html

Ich vermute, dass Du die Seiten vom Werner in ein Unterverzeichnis kopiert haben könntest, diese gehören aber ebenso in das Stammverzeichnis wie alle anderen Seiten von Mobirise.



P.S.:

... vielleicht interessant für Dich. So sieht das Verzeichnis der Anwendung "MySQL Webseitenschutz" bei mir am Server aus:


Verzeichnis der Anwendung MySQL-Webseitenschutz.jpg
Klaus
Supporter
Supporter
Beiträge: 446
Registriert: Mi 21. Jul 2021, 00:43

Re: MySQL-Webseitenschutz

Ungelesener Beitrag von Klaus »

Alleine durch das Setzen der Session Variablen ($_SESSION["referer"] ) am Anfang der zu schützenden PHP Datei wird nach dem erfolgreichem Login noch lange nicht auf diese Seite (zurück) umgeleitet, das muss dann schon im Skript (anmeldung.php) so vorgesehen sein.

->Guck doch mal in den alten Dateien die Du bei NOF verwendet hast ob da was mit "referer" in der anmeldung.php drinnen steht.
Am Besten verwendest Du die Skripte von NOF einfach weiter ... nicht Alt und Neu mixen, ggf. passt eine alte anmeldung.php und der aktuelle Rest nicht zusammen.
ezi
Mitglied (Level 2)
Mitglied (Level 2)
Beiträge: 11
Registriert: So 18. Jul 2021, 23:34

Re: MySQL-Webseitenschutz

Ungelesener Beitrag von ezi »

Sorry dass ich mich jetzt erst wieder melde und vielen Dank für eure Hilfe, damit habe ich es geschafft 😊
Allerdings gibt es nun ein weiteres problem:

nachdem sich ein User eingeloggt hat, erschein nach dem Domainname 2 Backslashes wie z.B.:
https://www.bundesligatagessieg.de//Tip ... ltag10.php

Hier mal die Daten für einen login

Website: https://www.bundesligatagessieg.de
User: Gast
Passwort: Gast



Hier der Code für den login:

Code: Alles auswählen

<?php
/*
 * Webseitenschutz - anmeldung.php (utf-8)
 * - https://werner-zenk.de
 */

session_start();
require __DIR__ . "/./admin/einstellungen.php";
$fehler = false;

// Benutzer bereits angemeldet - Weiterleitung zur geschützten Seite
if (
  isset($_SESSION["login"]) &&
  !isset($_GET["abmeldung"])
) {
  header("Location: https://www.bundesligatagessieg.de");
  exit;
}

// Anmeldung
if (
  $_SERVER["REQUEST_METHOD"] == "POST" &&
  $_POST["benutzername"] != ""
) {

  // CSRF-Token überprüfen
  if ($_SESSION["token"] != $_POST["token"]) die;

  // Anmeldeversuche
  if (!isset($_SESSION["versuche"])) {
    $_SESSION["versuche"] = 1;
  } else {
    $_SESSION["versuche"]++;
  }

  // Leerzeichen entfernen
  //  $_POST["benutzername"] = trim($_POST["benutzername"]);
  //  $_POST["passwort"] = trim($_POST["passwort"]);

  // Benutzername, E-Mail, Passwort, letzter Besuch, Anzahl der Besuche und die zeitliche Begrenzung auslesen
  $select = $db->prepare("SELECT `benutzername`, `email`, `passwort`, `sperre`, `letzterbesuch`, `besuche`, `begrenzung`
                                       FROM `" . $TBL_NAME . "`
                                       WHERE `benutzername` = :benutzername OR `email` = :benutzername");
  $select->execute([':benutzername' => $_POST["benutzername"]]);
  $reg = $select->fetch();
  if ($select->rowCount() == 1) {

    // Benutzername (oder E-Mail), Passwort und Anmeldeversuche überprüfen
    if (($reg["benutzername"] == $_POST["benutzername"] || $reg["email"] == $_POST["benutzername"]) &&
      password_verify($_POST["passwort"], $reg["passwort"]) &&
      $reg["sperre"] == "1" &&
      $_SESSION["versuche"] <= $ANMELDEVERSUCHE
    ) {

      // Zeitliche Zugangsberechtigung
      if ($ZEITLICHE_ZUGANGSBERECHTIGUNG == "ja") {
        if (date("Y-m-d") > $reg["begrenzung"]) {
          header("Location: anmeldung.php?zugangsberechtigung");
          exit;
        }
      }

      // Session setzen
      unset($_SESSION["versuche"]);
      session_regenerate_id();
      $_SESSION["login"] = true;
      $_SESSION["benutzer"] = $reg["benutzername"];
      $_SESSION["begrenzung"] = $reg["begrenzung"];
      $_SESSION["Admin"] = ($reg["benutzername"] == $ADMIN_NAME) ? true : false;

      // Letzter Besuch und Anzahl der Besuche
      $_SESSION["letzterbesuch"] = $reg["letzterbesuch"];
      $_SESSION["besuche"] = $reg["besuche"];

      // Aktuellen Besuch eintragen
      $db->query("UPDATE `" . $TBL_NAME . "`
                          SET `letzterbesuch` = NOW(),
                                 `besuche` = `besuche` + 1
                          WHERE `benutzername` = '" . $_SESSION["benutzer"] . "'");

      // Weiterleitung zur geschützten Seite
      header("Location: "  . $_SESSION["referer"]);
      exit;
    } 
  else {
   // Weiterleitung zur Anmeldeseite
   header("Location: ./anmeldung.php");
   exit;
  }
  }
}

// Abmeldung
if (isset($_SESSION["login"], $_GET["abmeldung"])) {

  // Session und Cookies löschen
  unset($_SESSION["benutzer"]);
  $_SESSION = [];
  if (ini_get("session.use_cookies")) {
    $params = session_get_cookie_params();
    setcookie(
      session_name(),
      '',
      time() - 42000,
      $params["path"],
      $params["domain"],
      $params["secure"],
      $params["httponly"]
    );
  }
  session_destroy();

  // Weiterleitung zur Anmeldung
  header("Location: anmeldung.php?abmeldung_ok");
  exit;
}

// CSRF-Token erzeugen
if (!isset($_SESSION["token"])) {
  $min = 1000;
  $max = getrandmax();
  $_SESSION["token"] = rand($min, $max);
}
?>


Danke schonmal für die erneute hilfe
VG
Ezi
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 5865
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: MySQL-Webseitenschutz

Ungelesener Beitrag von Tommy Herrmann »

Moin,

das ist jetzt für mich etwas schwierig, da ich ja nicht in die Dateien gucken kann. Außerdem hat Werner die Skripte komplett umgeschrieben, wahrscheinlich hat er diese auf PHP 8 angepasst.

Ich denke mal, dass Du in der gesicherten Seite:

https://www.bundesligatagessieg.de/Tipp ... ltag10.php

... andere relative Pfadangaben für die Umleitungen eingetragen hast als auf der eigentlichen Seite zur Anmeldung. Rufe ich diese nämlich direkt auf:

https://www.bundesligatagessieg.de/anmeldung.php

... dann kommt diese Fehlermeldung:

Fehlermeldung hat geschrieben:
Warning: Undefined array key "referer" in /homepages/27/d173550065/htdocs/anmeldung.php on line 82

Warning: Cannot modify header information - headers already sent by (output started at /homepages/27/d173550065/htdocs/anmeldung.php:82) in /homepages/27/d173550065/htdocs/anmeldung.php on line 82


Vergleiche bitte die relativen Pfadangaben in den Dateien "Tippen_Spieltag10.php" und "anmeldung.php" ganz genau. Da muss etwas falsch sein.

Hast Du in der Seite "anmeldung.php" vielleicht eine Leerzeile vor dem Script? In den Seiteneinstellungen im Bereich "Before <!DOCTYPE>" darf auf keinen Fall eine Leerzeile oder ein Leerzeichen vor oder nach dem PHP-Script eingetragen sein. Das führt zu falschen Header-Informationen.

Öffne mal die Datei "anmeldung.php" bei Dir mit dem Windows-Editor und gucke was in Zeile 82 genau steht. Kopiere diese Zeile und schreibe sie uns dann hier.

Ich schreibe mal an Werner, in der Hoffnung, dass er hier mal guckt. Er war lange nicht im Forum.
Benutzeravatar
Werner-Zenk.de
Mitglied (Level 10)
Mitglied (Level 10)
Beiträge: 755
Registriert: Di 8. Dez 2020, 19:42
Wohnort: Bamberg
Kontaktdaten:

Re: MySQL-Webseitenschutz

Ungelesener Beitrag von Werner-Zenk.de »

Moin,
// Weiterleitung zur geschützten Seite
header("Location: " . $_SESSION["referrer"]);
exit;

Bei mir wurde schon immer zur direkten geschützten Seite weitergeleitet und nicht was in einem Referrer steht!

// Weiterleitung zur geschützten Seite
header("Location: Tippen_Spieltag10.php");
exit;
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 5865
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: MySQL-Webseitenschutz

Ungelesener Beitrag von Tommy Herrmann »

danke für die Hilfe Werner !

... ah - das ist also so von ihm modifiziert. Das wusste ich gar nicht.
Benutzeravatar
Werner-Zenk.de
Mitglied (Level 10)
Mitglied (Level 10)
Beiträge: 755
Registriert: Di 8. Dez 2020, 19:42
Wohnort: Bamberg
Kontaktdaten:

Re: MySQL-Webseitenschutz

Ungelesener Beitrag von Werner-Zenk.de »

Das Script ist zwar von mir, aber mindestens 10 Jahre alt. Soll ich da für ein so altes Skript noch Hilfe anbieten, nur weil jemand zu bequem ist die aktuelle Version einzubinden!
Benutzeravatar
Tommy Herrmann
Site Admin
Site Admin
Beiträge: 5865
Registriert: So 6. Dez 2020, 07:37
Wohnort: Berlin
Kontaktdaten:

Re: MySQL-Webseitenschutz

Ungelesener Beitrag von Tommy Herrmann »

... meine, persönliche Version ist vom Dezember 2021 und funktioniert wunderbar mit PHP 8.2

Ich hatte vorhin extra die neueste Version von Dir (Februar 2023) herunter geladen und fand eben manche Stellen dort so nicht wieder. Deswegen hatte ich auch gleich nach Deiner Hilfe gerufen :)

Das ist leider bei PHP immer sehr pflegebedürftig.

Deswegen wird sich wohl auch Mobirise so vehement gegen PHP sträuben, denn was Pflege benötigt kostet dann auch wieder viel Geld.
Antworten

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 107 Gäste