session.referer_check - grundlegende Funktionsweise

Hallo,

mich interessiert der session.referer_check welcher eine SitzungsID ungültig machen soll, wenn kein Referer vorhanden ist oder er nicht übereinstimmt. Leider klappt es garnicht.

Ist diese Schreibweise korrekt?
ini_set(„session.auto_start“, 0);
ini_set(„session.use_strict_mode“, 1);
ini_set(„session.use_only_cookies“, 0);
ini_set(„session.use_trans_sid“, 1);
ini_set(„session.use_cookies“, 0);
ini_set(„session.trans_sid_tags“, „a=href,area=href,frame=src,form=“);
// ini_set(„session.trans_sid_hosts“, $_SERVER[„HTTP_HOST“] . „,meineseite.bplaced.net“);
ini_set(„session.referer_check“, „127.0.0.1,localhost,test-pc,meineseite.bplaced.net“);
ini_set(„session.cache_expire“, 1800); // 30 Minuten
ini_set(„session.name“, „SID“);
ini_set(„session.sid_length“, 190);

Ich finde einfach nicht die entsprechende Dokumentation im Netz.
PHP.net ist an dieser Stelle leider etwas knapp:

session.referer_check string
session.referer_check enthält die Zeichenkette, auf die Sie jeden HTTP-Referer überprüfen wollen. Wenn der Referer vom Client gesendet und die Zeichenkette nicht gefunden wurde, wird die eingebettete Session-ID als ungültig gekennzeichnet. Grundeinstellung ist eine leere Zeichenkette.

Wie wird die Session-ID als ungültig gekennzeichnet?

Danke für Eure Hilfe!
Gruß Markus

Hi,
versuchs mal per php.ini (siehe https://wiki.bplaced.net/uebersicht-technische-informationen Abschnitt OPcache). Vermutlich ist ein Referer Check aber nicht so sinnvoll, falls du das öffentlich einsetzen willst …
Mfg :wink:

Es ist nett zu wissen, dass bei bplaced.net auch eigene .php.ini möglich ist. Ich bin aber an Referer Überprüfung interessiert.

Muss die Referer Überprüfung noch irgendwie aktiviert werden?
Reicht die Initialisierung an sich aus? Ist diese korrekt?
ini_set(„session.referer_check“, „127.0.0.1,localhost,test-pc,meineseite.bplaced.net“);
Auch diese Einstellung habe ich versucht aber es ist egal was ich eingebe.
ini_set(„session.referer_check“, „http://meineseite.bplaced.net/session.php“);
Bei mir scheint die Session immer gültig zu sein. Auch wenn ich Blödsinn eingebe.
ini_set(„session.referer_check“, „Blödsinn!“);

Wie wird die Session-ID als ungültig gekennzeichnet?

Test: http://th11.bplaced.net/session.php

Hier ist der Testquellkode:

<?php
ini_set('session.auto_start', 0);
ini_set('session.use_strict_mode', 1);
ini_set('session.use_only_cookies', 0);
ini_set('session.use_trans_sid', 1);
ini_set('session.use_cookies', 0);
ini_set('session.trans_sid_tags', 'a=href,area=href,frame=src,form='); /* Standard: 'a=href,area=href,frame=src,form=' */
ini_set('session.trans_sid_hosts', $_SERVER['HTTP_HOST'] . ',th11.bplaced.net,kirmel.de'); /* Standard: $_SERVER['HTTP_HOST'] */
ini_set('session.referer_check', 'Blödsinn!'); // 'http://th11.bplaced.net/session.php' oder 'localhost,panther,th11.bplaced.net,kirmel.de' ??
ini_set('session.cache_expire', 1800); /* 30 Minuten */
ini_set('session.name', 'SID');
ini_set('session.sid_length', 190);

$SID=PostWert('SID');
if ($SID==='') { $SID=GetWert('SID'); }
if ($SID!=='') { session_id($SID); }

$Fehler=array();
if (!session_start())
{ $Fehler[]='Es konnte keine Sitzung erstellt werden.'; }
?>
<!DOCTYPE html>
<html>
<head></head>
<body>
<?php
if (count($Fehler)!==0)
{
?><h3>Es traten Fehler auf:</h3>
<ul><?php
    foreach ($Fehler as $F)
    { ?><li><?php echo $F; ?></li><?php } ?>
</ul><br/><?php
}

if (count($Fehler)===0)
{
$NeueID=boolval(PostWert('NeueID'));
if ($NeueID) { session_regenerate_id(true); }

$SID=session_id();

$Abmelden=boolval(GetWert('Abmelden'));
if ($Abmelden) { session_unset(); session_destroy(); $SID=''; }

$Zähler=SitzungWert('Zähler');
    if ($Zähler==='')
    { $Zähler=0; }
    else
    { $Zähler++; }
$_SESSION['Zähler']=$Zähler;

$Vorname=PostWert('Vorname');
$Nachname=PostWert('Nachname');
if ($Vorname!=='')  { $_SESSION['Vorname']=$Vorname; }
if ($Nachname!=='') { $_SESSION['Nachname']=$Nachname; }

?>
<form method="post" action="./session.php" accept-charset="UTF-8">
<!-- <input type="hidden" name="SID" value="<?=session_id()?>"/> WIRD AUTOMATISCH GENERIERT-->
<fieldset>
<legend>Diese Werte bleiben bestehen solange eine Sitzung existiert.</legend>
<table>
<caption>Aktuelle Sitzungswerte</caption>
<thead>
<tr><th>Variable</th><th>Wert</th></tr>
</thead>
<tbody>
<tr><td>Vorname</td><td><input type="text" name="Vorname" maxlength="50" placeholder="Ihr Vorname" value="<?=TextZuFeld(SitzungWert('Vorname'))?>" /></td></tr>
<tr><td>Nachname</td><td><input type="text" name="Nachname" maxlength="50" placeholder="Ihr Nachname" value="<?=TextZuFeld(SitzungWert('Nachname'))?>"/></td></tr>
<tr><td>Neue ID generieren?</td><td><label><input type="radio" name="NeueID" value="0" checked="checked"/>Nein</label> <label><input type="radio" name="NeueID" value="1"/>Ja</label></td></tr>
<tr><td colspan="2"><input type="submit" value="Speichern bzw. Aktualisieren"/></td></tr>
</tbody>
</table>
</fieldset>
</form>

<b>Seitenaufrufe (nach Erstellung der Sitzung):</b> <?php echo SitzungWert('Zähler'); ?><br/>
<!-- <?='?'.session_name().'='.session_id()?> wird standardmässig an a href angehängt -->
<a href="session.php">Neu aufrufen</a> <a href="session.php?Abmelden=1">Abmelden</a><br/><br/>
Trans SID: <a href="http://kirmel.de/session.php">kirmel.de</a><br/><br/>
<b>Alle Sitzungsgwerte:</b> <?php
var_dump($_SESSION); echo '<br/>';
?><b>SID:</b> <?php echo $SID . '<br/>';

if (isset($_SERVER['HTTP_REFERER'])) { $Referer=$_SERVER['HTTP_REFERER']; } else { $Referer='kein Referer vorhanden'; }
?><b>Referer:</b> <?php echo $Referer; ?><br/>
<b>Zulässige Referer:</b> <?php echo ini_get('session.referer_check'); ?><br/>
<b>Session Status:</b> <?php echo session_status(); ?><br/><?php

session_write_close();    
}
?>
</body>
</html>
<?php
// GET immer fehlerfrei auslesen
function GetWert($GetWert)
{
    if (isset($_GET[$GetWert]))
    {
        if(is_string($_GET[$GetWert]) || is_array($_GET[$GetWert]))
        { return $_GET[$GetWert]; }
    }
return '';
}
// POST immer fehlerfrei auslesen
function PostWert($PostWert)
{
    if (isset($_POST[$PostWert]))
    {
        if(is_string($_POST[$PostWert]) || is_array($_POST[$PostWert]))
        { return $_POST[$PostWert]; }
    }
return '';
}
// SESSION immer fehlerfrei auslesen
function SitzungWert($SitzungWert)
{
    if (isset($_SESSION[$SitzungWert]))
    { return $_SESSION[$SitzungWert]; } // String, Int, Float, Array...
return '';
}
// HTML Hack vermeiden
// Benutzereingabe immer codiert in HTML ausgeben
function TextZuHTML($string)
{
    if (is_string($string))
    { return htmlentities($string, ENT_QUOTES, 'UTF-8'); }
return '';
}
// HTML Formular Hack vermeiden
// Benutzereingabe immer codiert in Formular Feld ausgeben
function TextZuFeld($string)
{
    if (is_string($string))
    { return htmlspecialchars($string, ENT_QUOTES, 'UTF-8'); }
return '';
}
?>

Hi,
die Einstellung scheint wirklich nicht besonders gut dokumentiert, insbesondere wann und wie die Überprüfung erfolgt. Deswegen ist es auch müßig hier zu spekulieren. Du könntest die Funktionalität aber ganz einfach selbst nachprogrammieren. Sicherheitstechnisch relevant ist das Ganze allerdings nicht.
Mfg :wink:

Danke Magier. Genau das versuche ich zu vermeiden. Das Rad wurde bereits erfunden…
Ich könnte eigene RegExp schreiben und den Inhalt von $_SERVER[‚HTTP_REFERER‘] mit $_SESSION[‚Referer‘] vergleichen. Dabei belaste ich leider unnötig den Server, weil ich die Performance niemals nachbilden kann und baue noch womöglich ungewollte Fehler ein.

Ich hoffe immer noch es gebe irgendwo eine funktionierende Anleitung hierfür.

Gruß Markus

Ja viel Sicherheit gibt der Referer nicht aber ich nehme alles was es gibt.

Ein Regexp ist dafür gar nicht notwendig, laut der Doc handelt es sich nur um ein substring. Aus diesem Grund dürfte es auch nicht möglich sein, mehrere URLs/Ausdrücke anzugeben, so wie in deinem ersten Beispiel.

Ich kann es kaum gleuben, es gibt so viele PHP-Entwickler und keiner hat eine Idee…