Im Format UTF-8 speichern! Ggf. im Browser - Darstellung Textcodierung auf Unicode (UTF-8) stellen


<?php
/*
Erweiterung zum Gebrauch im Event-Kalender - generateaccesslink.php (utf-8)
© RaHa

Dieses Script wird verteilt ohne irgendeine Garantie und Gewährleistung oder Eignung für einen
bestimmten Zweck. Weitere Informationen finden Sie in der GNU General Public License.
Siehe Datei: license.txt - http://www.gnu.org/licenses/gpl.html

Diese Datei ist urheberrechtlich geschützt (c) 2020 ralph-hahn.net alle Rechte vorbehalten.
Sie können diese Datei unter den Bedingungen der GNU General Public License frei verwenden und weiter
verbreiten.


Folgende Ordner sind erforderlich:
accesslink
accesslink/registration
accesslink/verified

im Ordner accessliknk eine .htaccess mit folgendem Inhalt anlegen:
<Files "*.*">
Deny from all
</Files>

*/

// entsprechend anpassen
$domain="event-kalender.checkip.net";

// Pruefung ob Aufruf von zulaessiger IP/DYNDNS erfolgt
// ggf. die Zeilen auskommentieren!
if (!isset($argv[0])) {
     $dynsallow['1']="remote-xxx.dyndns.checkip.net";
     $dynsallow['2']="mobile-xxx.dyndns.checkip.net";
     
     $i = 0;
     $doaction=false;     
     foreach ($dynsallow as $dynallow) {
          $i++;
          $ipremote=$_SERVER["REMOTE_ADDR"];
          $hostip=gethostbyname($dynallow);
          if ($ipremote==$hostip) { $doaction=true; break; }
     }
     if ($doaction === false) { echo "NO"; exit; }
}


function myencrypt($string) {
     $key="KA76LrumR0cNfdyjXW2pMcvzSIwx/suCcMdCDUGlDEk=";
     $method="aes-128-cbc";
     $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($method));
     $pass2 = openssl_encrypt($string, $method, $key, 0, $iv);
            
     $pass=base64_encode($pass2 . '::' . $iv);
     return rtrim( strtr( $pass, '+/', '-_'), '=');
}

function accesss_str() {
     $requesttime=strval($_SERVER["REQUEST_TIME_FLOAT"]);
     $requesttime_pos=strpos($requesttime, ".")+1;
     $requesttime_mircotime=substr("0000".substr($requesttime,$requesttime_pos), -4);
     $requesttime_time=substr($requesttime,0,$requesttime_pos-1);
    return "ACCESSLINK-CHECKIP-".$requesttime_time.$requesttime_mircotime.bin2hex(random_bytes(7));
}

if (isset($_REQUEST['name'])) {
$benutzername=$_REQUEST['name'];
if ($benutzername=="") { echo "<h1>Bitte Benutzername/Kürzel/Code in der URL angeben! (?name=)</h1>", exit; }
} else { echo "<h1>Bitte Benutzername/Kürzel/Code in der URL angeben! (?name=)</h1>", exit; }


// Sind die erforderlichen Ordner vorhanden, wenn nicht anlegen
if (!file_exists('accesslink/registration/')) { echo "Der Ordner accesslink/registration/ existiert nicht, bitte anlegen"; exit;}
if (!file_exists('accesslink/verified/')) { echo "Der Ordner accesslink/verified/ existiert nicht, bitte anlegen"; exit;}


// Einen Link erzeugen
// 

$dateiname=accesss_str();
$accesspass=myencrypt($benutzername."|".$dateiname);

$accesslink='<a href="https://'.$domain.'/?access='.$accesspass.'">LINK</a>';

echo $dateiname." für interne Zwecke!<br><br>";
echo $accesslink." dem Benutzer übergeben!";

// für chekip.net direkt nach verified, sonst erst mal in registration
$filepass="accesslink/verified/".$dateiname;
if (($IntFileOpenHandle = fopen($filepass, "a")) !== FALSE) {
     $StrOutput=$benutzername."\n".$accesslink."\n";
     fputs($IntFileOpenHandle, $StrOutput);
     fclose($IntFileOpenHandle);
}

/*
$filepass="accesslink/registration/".$dateiname;
if (($IntFileOpenHandle = fopen($filepass, "a")) !== FALSE) {
     $StrOutput=$benutzername."\n".$accesslink."\n";
     fputs($IntFileOpenHandle, $StrOutput);
     fclose($IntFileOpenHandle);
}
*/

// $accespass legen wir als Datei mit $dateiname im Ordner ./accesslink/registration ab
// Das erfolgt zum Beispiel mit einem Abfragescript, dort kann man sich registieren, die Daten werden
// gespeichert und ein Link per E-Mail zur Bestätigung versandt.
//
// Mit der Bestätigung wird die Datei nach ./accesslink/verified verschoben
//
// In der Datei $accesspass stehen zum Beispiel die Daten der Registrierung

// Beispiel erzeugter Accesslink:
// https://event-kalender.checkip.net/?access=WFI3WGFWRW9UL1U4TC8vTFJjR3VWSzN0c0NueTMxeGl1T1lJMkZNaTR0MnRhTTNPaWhyelJWbHcwMXQ5OUp4Uzo6WWa0P64v-xJJ3F_GJEKpzg
//
//Benutzer: ACESSLINK
//Dateiname: ACCESSLINK15843755756626
// diesen benutzen wir zum Zugriff auf den Event-Kalender
exit;

// Nachfolgendes kommt in verbindung.php hinter Verbindung zur Datenbank

function mydecrypt($string) {
     $pass2=strtr( $string, '-_', '+/') . str_repeat('=', 3 - ( 3 + strlen( $string )) % 4 ); 
     list($pass, $iv) = explode('::', base64_decode($pass2), 2);

     $key="KA76LrumR0cNfdyjXW2pMcvzSIwx/suCcMdCDUGlDEk=";
     $method="aes-128-cbc";
     return openssl_decrypt($pass, $method, $key, 0, $iv);
}


if (isset($_SERVER['HTTP_REFERER'])) {
          $accesslink=trim($_SERVER['HTTP_REFERER']);
          $pos=strpos($accesslink, "access=");
          if ($pos!==false) {
               $accesslink=substr($accesslink, $pos+7, strlen($accesslink)-$pos+7);
               $accesslink=mydecrypt($accesslink);
               $pos=strpos($accesslink, "|");
               $benutzername=substr($accesslink, 0, $pos);
              $dateiname=substr($accesslink, $pos+1, strlen($accesslink)-$pos+1);
        
               $filepass="accesslink/verified/".$dateiname;
               if (!is_file($filepass)){
                    echo 'Sie sind nicht berechtigt!';
                    exit;
               }
               unset($_SESSION["name"]);
               $_SESSION["name"] = $benutzername;
               $NAME = $_SESSION["name"]; // wenn der Admin sein soll
          }
}
?>