CPO 4.1.5: CSRF check failed

Dieses Forum enthält Diskussionen zu Bugs in ConPresso 4 und deren Lösungen.
Benutzeravatar
Mr. Magpie
ConPresso-Profi
Beiträge: 1004
Registriert: 01.01.1970 01:00
Wohnort: Wuppertal
Hat sich bedankt: 274 Mal
Danksagung erhalten: 59 Mal

Beitrag von Mr. Magpie »

Passiert das unabhängig vom Browser? Falls nicht, hast du mal Balus Ansatz verfolgt und getestet welches PlugIn oder welche Browser-Erweiterung Schuld sein könnte?
Günther Ludwig
dutch
ConPresso-Experte
Beiträge: 547
Registriert: 04.07.2007 17:12
Hat sich bedankt: 27 Mal
Danksagung erhalten: 7 Mal

Beitrag von dutch »

Hallo Mr. Magpie,

ja, unabhängig vom browser, getestet in FF, IE, Chrome und Opera.
Im backend bekomme ich den Fehler (bei der 4.1.6) nicht, nur beim frontend login.

Gruß,
dutch
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7361
Registriert: 01.01.1970 01:00
Hat sich bedankt: 110 Mal
Danksagung erhalten: 933 Mal
Kontaktdaten:

Beitrag von MarkusR »

eine Seite mit cpo 4.1.6 erstellt, inkl. frontend login
Frontend-Login via member.php oder eigenes Formular?

Mit eigenen Formularen (wie im Handbuch beschrieben) geht das nicht mehr, weil das anticsrf-Token fehlt.

Hier
http://community.conpresso.de/viewtopic ... 7339#27339
habe ich ein Workaround mittels mod_functions beschrieben.
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
dutch
ConPresso-Experte
Beiträge: 547
Registriert: 04.07.2007 17:12
Hat sich bedankt: 27 Mal
Danksagung erhalten: 7 Mal

Beitrag von dutch »

Hallo Markus,

ja, über eigenes Formular... darum geht es also nicht mehr :(

Wenn ich recht verstehe, funtioniert die Lösung mit mod_functions nur in Seitentemplates bzw. mit der mod-Version 4.2 auf Artikel/-template-Ebene.

Eine Lösung für global_header oder global_footer gibt es nicht zufällig? :wink:

Gruß,
dutch
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7361
Registriert: 01.01.1970 01:00
Hat sich bedankt: 110 Mal
Danksagung erhalten: 933 Mal
Kontaktdaten:

Beitrag von MarkusR »

Grundsätzlich funktionieren ALLE in mod_functions definierten Funktionen auch im PHP-Code!
Im Seitentemplate steht die Funktion dann als
<!-- function: FUNKTIONSNAME; argument1=WERT; argument2=WERT; -->
zur Verfügung, wird aber auch zusätzlich als PHP-Funktion FUNKTIONSNAME($argument1, $argument2) angelegt
Du kannst aber auch einfach mittels

Code: Alles auswählen

$antiCSRF->printInput('dologin');
ein Token erstellen und ein hidden-input ausgeben lassen.

Dazu schaust Du Dir in _include/member.inc.php einfach mal den Block ab

Code: Alles auswählen

case 'login':
an.
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
dutch
ConPresso-Experte
Beiträge: 547
Registriert: 04.07.2007 17:12
Hat sich bedankt: 27 Mal
Danksagung erhalten: 7 Mal

Beitrag von dutch »

Hallo Markus,

danke für den Tipp.

Das müsste dann hier eingebaut werden?

Code: Alles auswählen

 case 'dologin': // {{{
        if (!$antiCSRF->checkToken()) {
            $message[] = ___('Security check failed. Please try again.');
            logaction('login', 'CSRF check failed.');
            break;
        }
Muss die Zeile in die If-Anweisung? - Bin halt kein PHPer ....

Gruß,
dutch
Benutzeravatar
MarkusR
Handbuchversteher
Beiträge: 7361
Registriert: 01.01.1970 01:00
Hat sich bedankt: 110 Mal
Danksagung erhalten: 933 Mal
Kontaktdaten:

Beitrag von MarkusR »

nicht "case: 'dologin':" sondern "case: 'login':"

sieht so aus:

Code: Alles auswählen

    case 'login': // {{{
        include(CPO_BASEDIR.'_include/message.php'); // FIXME STEFFEN, wirklich diese Messages benutzen?
        echo '<form method="post" action="'.htmlspecialchars($_SERVER['PHP_SELF'], ENT_COMPAT, 'ISO-8859-15').'">';
        $antiCSRF->printInput('dologin');
        echo '<input type="hidden" name="rubric" value="'.(int)$GLOBALS['cpoRubric']['id'].'">';
        if (!empty($_nview))
            echo '<input type="hidden" name="nview" value="'.htmlspecialchars($_nview, ENT_COMPAT, 'ISO-8859-15').'">';
        echo ___('Please enter your username and password.', $GLOBALS['cpoRubricSettings']['language']).'<br /><br />';
        echo ___('Login:', $GLOBALS['cpoRubricSettings']['language']).'<br />';
        echo '<input type="text" name="username"><br />';
        echo ___('Password:', $GLOBALS['cpoRubricSettings']['language']).'<br />';
        echo '<input type="password" name="password"> ';

        echo '<input type="submit" class="button" value="'.___('log in', $GLOBALS['cpoRubricSettings']['language']).'">';
        echo '<br />';
        if ($GLOBALS['GLOBALS']['cpoSystem']['send_pw']) {
            echo '<a href="'.htmlspecialchars($_SERVER['PHP_SELF'], ENT_COMPAT, 'ISO-8859-15').'?action=password_reset&rubric=' . (int)$GLOBALS['cpoRubric']['id'] . '">'.__('Reset password', $GLOBALS['cpoRubricSettings']['language']).'</a>';
        }
        echo '</form>';
        break; // }}
Da sieht Du, daß innerhalb des Formulares die Zeile

Code: Alles auswählen

$antiCSRF->printInput('dologin');
steht.

Leider kenne ich Deinen Code nicht.
Ist das ein PHP-Code, dann reicht die Zeile

Code: Alles auswählen

$antiCSRF->printInput('dologin');
Ist das ein HTML-Code dann eben

Code: Alles auswählen

<?php $antiCSRF->printInput('dologin'); ?>
Wäre immer hilfreich, wenn Du Deinen Code postest, denn die Original-ConPresso-Dateien habe ich, aber Deinen Code kenne ich nicht (und auch sonst niemand)...
Ciao Markus
ConPresso-Module

Kein Support per PN!!! Für Fragen und Diskussionen ist das Forum da!

Succi recentis officinalis
Hochwertige Kräutersäfte und -Öle
dutch
ConPresso-Experte
Beiträge: 547
Registriert: 04.07.2007 17:12
Hat sich bedankt: 27 Mal
Danksagung erhalten: 7 Mal

Beitrag von dutch »

Hallo Markus,

ja, blöd, hätte gleich den code mitschicken sollen...
Der sah so aus:

Code: Alles auswählen

<?php
			if (empty($_SESSION['SID_log_login_id'])) {
			echo '<div id="loginVeld">';
			echo '<form method="post" action="/cms/documents/member.php">';
			echo '<input type="hidden" name="action" value="dologin" />';
			echo '<input type="hidden" name="rubric" value="16" />';
			echo 'Username:<br />';
			echo '<input type="text" name="username" />';
			echo 'Password:<br />';
			echo '<input type="password" name="password" />';
			echo '<input type="submit" value="login" class="btnVerzenden" />';
			if ($GLOBALS['cpoSystem']['send_pw']) {
			echo '&raquo; <a href="member.php?action=password_reset&rubric=';
			echo htmlspecialchars($cpoRubric['id']).'">Can\'t remember password?</a>';
			}
			echo '</div>';
			} else {
			echo '<div id="logoutVeld">';
			echo 'Welcome '.htmlspecialchars($_SESSION['SID_user']['name']).'';
			echo '<p class="documents"><a href="/cms/documents/index.php">documents</a></p>';
			echo '&raquo; <a href="member.php?action=logout&rubric=Home">';
			echo '<strong>Logout</strong></a>';
			echo '</div>';
			}
		?>

Jetzt sieht er so aus, und damit klappt's!:

Code: Alles auswählen

<?php
			if (empty($_SESSION['SID_log_login_id'])) {
			echo '<div id="loginVeld">';
			echo '<form method="post" action="/cms/documents/member.php">';

         $antiCSRF->printInput('dologin');

			echo '<input type="hidden" name="action" value="dologin" />';
			echo '<input type="hidden" name="rubric" value="16" />';
			echo 'Username:<br />';
			echo '<input type="text" name="username" />';
			echo 'Password:<br />';
			echo '<input type="password" name="password" />';
			echo '<input type="submit" value="login" class="btnVerzenden" />';
			if ($GLOBALS['cpoSystem']['send_pw']) {
			echo '&raquo; <a href="member.php?action=password_reset&rubric=';
			echo htmlspecialchars($cpoRubric['id']).'">Can\'t remember password?</a>';
			}
			echo '</div>';
			} else {
			echo '<div id="logoutVeld">';
			echo 'Welcome '.htmlspecialchars($_SESSION['SID_user']['name']).'';
			echo '<p class="documents"><a href="/cms/documents/index.php">documents</a></p>';
			echo '&raquo; <a href="member.php?action=logout&rubric=Home">';
			echo '<strong>Logout</strong></a>';
			echo '</div>';
			}
		?>
Vielen Dank für die Hilfe!

Gruß,
dutch
Antworten