Regina Schaukrug: Experiment: Sessiontransfer

Beitrag lesen

Ich bin zwar mit beiden Domains beim gleichen Hoster aber dieser meinte es kann innerhalb von einem Account auch sein, dass eine Domain auf Server A und die zweite auf Server X liegt.

Das innerhalb eines Accounts zwei Domains auf zwei verschiedenen Servern liegen dürfte hinsichtlich der Account- und Domainverwaltung aus technischen Gründen technisch ziemlich schwierig zu händeln sein. Das geht schon bei disk-quotas (die ja für den vertrag und also den Account gelten) los. Ansonsten müsste man sich darüber unterhalten, was mit "Server" gemeint ist, und da würde ich von der Kiste ausgehen, die den eigentlichen Webserver (häufig: Apache) beherbergt.

Was gibt denn

<pre><?php
echo $_SERVER['DOCUMENT_ROOT']
     . "\n"
     . $_SERVER['SERVER_ADDR'];
?>

auf den jeweiligen Domains aus?

Die IP Adresse von einem Client aus via DNS aufzulösen bringt nichts, weil da Proxys dazwischen sein können. Sowohl auf der Clientseite als auch auf der Serverseite kann das "transparent" geschehen, also so dass im öffentlichen DNS der Domainname auf die IP des Proxys zeigt. So kann z.B. ein "halbes Rechenzentrum" nach außen die öffentliche IP eines Proxys haben, der dann die Requests nur an die eigentlichen Server - mit vielleicht sogar privaten IPs (z.B. aus dem Adressbereich 10.x.x.x/8) verteilt. Insofern kann die Auflösung also die Täuschung erwecken, dass die Webseiten zweier oder mehr Domains auf dem gleichen Server liegen.

  • $_SERVER['SERVER_ADDR'] zeigt Dir also die "endgültige" IP aus Serversicht. Die wäre hier womöglich aussagekräftiger.

Kommen wir zur eigentlichen Session und zum Experiment

Ich hab damit ein wenig rumgespielt, das Folgende hat nur Testcharakter, es soll Dich zum Weiterdenken animieren, es ist kein fertiger Code!

Der Krempel wird dann funktionieren,

  • wenn beide Domains auf dem gleichen Server liegen
  • und das Verzeichnis für die Session-Dateien identisch ist
  • und Du musst Dich ggf. noch um CORS-Einträge kümmern.

Liegen die Session-dateien nicht auf den gleichen Server muss beim Session-Transfer dafür gesorgt werden, dass die Session-Datei vom Server A zum Server B kopiert wird. Das geht mit PHP eigentlich ganz einfach.

$sessTransferKey hat (noch) keine Bedeutung.

A) Erzeugung der Session auf Domain A:

<?php
#https://home.fastix.org/Tests/session_start.php
$serverA='https://home.fastix.org';
$serverB='https://home.fastix.org';

if (! session_id() ) { 
	session_start();
}

if ( ! isset( $_SESSION['foo'] ) ) {
	$_SESSION['foo'] = 'bar';
}

if ( ! isset( $_SESSION['TransferKey'] ) ) {
	$_SESSION['TransferKey'] = generateTransferKey();
}

$sessionFileName = ini_get('session.save_path') . '/sess_' . session_id() ;

echo '<p>Session-ID: ' . session_id() . '</p>';
echo '<p>Session-File: ' . $sessionFileName . '</p>';

echo '<hr><pre>' . htmlspecialchars( file_get_contents ( $sessionFileName )  ) . '</pre></hr>';
echo '<p>Gehe zu <a href="' . $serverB . '/Tests/session_use.php">' . $serverB . '/Tests/session_use.php</a></p>';

function generateTransferKey() {
	$blob = '';
	for ( $i=0; $i<160; $i++ ) {
		$blob .= chr( random_int( 1,126 ) );
	}
	return base64_encode( $blob );
}

b) "Antelefonieren" der Session von einer Seite von Domain B aus mit Javascript

<html>
<!-- https://home.fastix.org/Tests/session_use.php /-->
<head></head>
<body>
<p>Session ID: <span id="sessID"></span></p>
<p>Session TransferKey: <span id="sessTransferKey"></span></p>
<p>Session Transfer ausgeführt: <span id="TranferOK"></span></p>
</body>
<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if ( this.readyState == 4 && this.status == 200 ) {
	   vars = JSON.parse( this.responseText );
       document.getElementById('sessID').innerHTML = vars['sessID'];
       document.getElementById('sessTransferKey').innerHTML = vars['sessTransferKey'];
       
       var xhttp2 = new XMLHttpRequest();
	     xhttp2.onreadystatechange = function() {
			 if (this.readyState == 4 && this.status == 200) {
			   document.getElementById('TranferOK').innerHTML = this.responseText;
			 }
		};
		xhttp2.open( "POST", "https://home.fastix.org/Tests/sessiontransfer.php", true );
    xhttp2.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );		
		data = 'sessID='           + encodeURIComponent( vars['sessID'] ) 
		     + '&TransferKey=' + encodeURIComponent( vars['sessTransferKey'] );
		xhttp2.send( data );        
    }
};
xhttp.open( "GET", "https://home.fastix.org/Tests/sessionGetIDandTransferKey.php", true );
xhttp.send(); 
</script>
</html>

C) Und zu guter Letzt die "sessiontransfer.php", für die eigentlich nur mit session_id() die frühere id zu setzen ist, der Rest geht automatisch mit session_start() - Aber nur wenn die Session-Datei vorhanden ist!

<pre>
Postdata: 
<?php
print_r( $_POST );
?>
SESSION:
<?php
# Hier eventuell das Kopieren der Session-Datei von Server A nach Server B
session_id( $_POST['sessID'] );
session_start();
print_r( $_SESSION );
?>
</pre>

wenn Du die Session-Datei kopierst, dann musst Du ferner Sorge dafür tragen, dass im Falle einer Abmeldung das Original und alle Kopien zuverlässig zerstört (gelöscht) werden.

0 66

Login über zwei Domains hinweg

Meowsalot
  • php
  1. 0
    Henry
    1. 0
      Meowsalot
      1. 1

        Unsicherer Ansatz: Passwörter im Klartext

        Regina Schaukrug
        1. 0
          Meowsalot
          1. 0

            Unsichere Passwort-Hasches: Mit sowas landet man in der Zeitung

            Regina Schaukrug
            1. 0

              Unsicherer Ansatz: Passwörter im Klartext

              m.
              1. 0

                Keine unnötige Panikmache

                Regina Schaukrug
                1. 0

                  Unsicherer Ansatz: Passwörter im Klartext

                  m.
                  1. 0

                    "nicht pauschal unsicher"? - Nicht ausreichendes Problembewusstsein!

                    Regina Schaukrug
                    1. 0
                      m.
                      1. 0
                        Regina Schaukrug
                        1. 0
                          m.
                          1. 0
                            Regina Schaukrug
                            1. 0
                              m.
                              1. 0
                                Regina Schaukrug
                                1. 0
                                  m.
                                  1. 0
                                    Regina Schaukrug
                                    1. 0
                                      m.
                                      1. 0
                                        Regina Schaukrug
                                        1. 0
                                          m.
                                2. 0
                                  m.
                                  1. 0
                                    Regina Schaukrug
                                    1. 1
                                      m.
                                      1. -1

                                        Grobe Unsachlichkeiten: Ich beende die Diskussion

                                        Regina Schaukrug
                                        1. 0
                                          m.
            2. 0
              Meowsalot
              1. 0
                m.
                1. 0
                  Regina Schaukrug
                  1. 0
                    m.
              2. 0
                Regina Schaukrug
                1. 0
                  m.
                  1. 0
                    Regina Schaukrug
                    1. 0
                      m.
                      1. 0
                        Regina Schaukrug
                        1. 0
                          m.
                    2. 0

                      DSGVO

                      Meowsalot
                      1. 0

                        Wenn der Topf aber dieses Loch hat, dann gieß ihn aus.

                        Regina Schaukrug
                        1. 0
                          Meowsalot
                          1. 0
                            Regina Schaukrug
                      2. 0
                        m.
                        1. 0
                          Meowsalot
                          1. 0

                            Risiko, Passwort-Reset, DSGVO

                            Regina Schaukrug
                          2. 0
                            m.
                    3. 0
                      MudGuard
                      1. 0
                        Regina Schaukrug
      2. 0
        pl
        1. 0
          Meowsalot
          1. 0
            pl
          2. 0
            m.
          3. 0
            Rolf B
            1. 0
              pl
              1. 0
                Rolf B
                1. 0
                  pl
              2. 0
                Mitleser
  2. 0
    dedlfix
    1. 0
      Meowsalot
      1. 0
        Henry
      2. 0
        dedlfix
  3. 0
    m.
    1. 0
      Meowsalot
      1. 0
        m.
      2. 0

        Experiment: Sessiontransfer

        Regina Schaukrug
        1. 0
          Regina Schaukrug
          1. 0
            Regina Schaukrug
            1. 0
              Meowsalot