it-swarm.com.de

Wie kann verhindert werden, dass das Zurücksetzen des Passworts private E-Mail-Adressen preisgibt?

Das "Passwort vergessen?" Das Formular zum Zurücksetzen des Passworts in Joomla 3.x kann offenlegen, dass eine E-Mail-Adresse auf der Website registriert ist. Dies ist eine Verletzung der Privatsphäre, die nach einigen Datenschutzgesetzen illegal ist.

Das Problem ist, dass die Joomla-Kernfunktion zwei verschiedene Nachrichten und Formate meldet:

  1. "Passwort zurücksetzen fehlgeschlagen: Ungültige E-Mail-Adresse", wenn a
    nicht registriert Adresse wird in das Rücksetzformular eingegeben, und
  2. "Eine E-Mail wurde an Ihre E-Mail-Adresse gesendet. Die E-Mail enthält einen Bestätigungscode. Fügen Sie den Bestätigungscode in das Feld unten ein, um zu beweisen, dass Sie der Eigentümer dieses Kontos sind." wenn eine registriert Adresse eingegeben wird.

Ein Dritter kann daher feststellen, dass eine E-Mail-Adresse für die Site registriert und mit dieser verknüpft ist. E-Mail-Adressen sind allgemein bekannt und haben in vielen Fällen die Form Vorname.Nachname @

Kann dies mit einem Override korrigiert werden, um die obige Antwort Nr. 2 unabhängig vom nicht/registrierten Status der eingegebenen E-Mail-Adresse zurückzugeben?

Wenn nicht, welche Kerndatei (en) müssen geändert werden?

Ich erwähne hier keinen Benutzernamen, da ich ein Plugin verwende, das die Authentifizierung durch E-Mail-Adresse und Passwort anstelle von Benutzername und Passwort ermöglicht.

Bitte beachten Sie! Wenn Sie mit diesen spezifischen Antworten nicht vertraut sind, sind sie unterschiedlich. # 1 ist Text, der in einem Joomla-Fehlerfeld angezeigt wird. # 2 wird als Text oben im Formular angezeigt. Dieses Offenlegungsproblem wird nicht durch eine Überschreibung der Sprachdatei gelöst, wodurch der Text identisch wird.

3
brett

Gute Frage Brett. Dies ist einer der wenigen Kern-Hacks, die ich jemals machen musste. Wenn jemand eine bessere Lösung hat, dann poste sie bitte hier.

In dieser Datei: https://github.com/joomla/joomla-cms/blob/staging/components/com_users/models/reset.php

In der öffentlichen Funktion processResetRequest ($ data)

Wenn überprüft wird, ob der Benutzer vorhanden ist, wird true frühzeitig zurückgegeben. Dies stoppt somit den E-Mail- und Rücksetzprozess, zeigt dem Benutzer jedoch auch die reguläre Erfolgsmeldung an.

Originallinien 398-404

// Check for a user.
    if (empty($userId))
    {
        $this->setError(JText::_('COM_USERS_INVALID_EMAIL'));
        return false;
    }  

Gewechselt zu:

// Check for a user.
    if (empty($userId))
    {
        /* === BEGIN CORE HACK === */
        return true;
        /* === END CORE HACK ===== */

        $this->setError(JText::_('COM_USERS_INVALID_EMAIL'));
        return false;
    }
2
jamesgarrett

Um einen Core-Hack zu vermeiden, gibt es zwei Ansätze. Ich würde vorschlagen, dass Sie entweder ein eigenes Modell erstellen, das UserModelReset erweitert, sodass Sie eine gefälschte Benutzer-ID einfügen können, wenn keine gültige gefunden wird. Oder erstellen Sie eine Überschreibung für /com_users/view/reset/tmpl/default.php und ersetzen Sie Zeile 24, um nicht reset.request im Subcontroller reset.php aufzurufen, sondern einen eigenen Code.

<form id="user-registration" action="<?php echo JRoute::_('index.php?option=com_users&task=reset.request'); ?>" method="post" class="form-validate form-horizontal well">

Oder wenn das von Ihnen erwähnte Plugin etwas ist, das Sie bearbeiten können, würde ich vorschlagen, dass Sie selbst prüfen, ob der Benutzer in der Tabelle com_user vorhanden ist, und wenn nicht, eine gültige, aber gefälschte Benutzer-ID an die reguläre Verarbeitung übergeben, lassen Sie einfach keine Nicht-ID zu -existierender Benutzer übergeben werden. Da ich nicht weiß, wann das Plugin involviert ist, kann ich nicht sicher sein, ob dies eine gültige Option für Sie ist, aber es wäre der einfachste und sauberste Weg, dies zu tun.

Wenn Sie den Vorgang des normalen Zurücksetzens des Passworts befolgen, können Sie sehen, was passiert und warum der von @jamesgarret beschriebene Code-Hack bei Ihnen nicht funktioniert und Sie nicht zur letzten Seite gelangen, die mit der Nachricht "E-Mail gesendet" angezeigt wird. Ich würde vermuten, dass Ihr Plugin processResetRequest direkt aufruft und nicht den Subcontroller reset.request durchläuft.

Wie oben erwähnt, ruft default.php Die Untersteuerung reset.php Und function request Auf. function request Ruft wiederum processResetRequest in com_user/models/reset.php Auf.

Wenn Sie lesen, was los ist processResetRequest, können Sie sehen, dass ein Datenbankaufruf für die Benutzer-E-Mail-Adresse erfolgt und die Variable $ userId in Zeile 389 zurückgegeben wird.

Gemäß der Antwort von @jamesgarret in Zeile 399 wird nach einem leeren $userId Geprüft, und an diesem Punkt möchten Sie KEINEN leeren $userId Haben Core-Hack von @jamesgarret mit der normalen Verarbeitung, dann bringt Sie return true zurück zu reset.request. Wenn Ihr Plugin jedoch processResetRequest heißt, müssen Sie die Weiterleitung zur richtigen Seite durchführen selbst.

Wenn Sie noch keine gefälschte Benutzer-ID über Ihr Plugin überprüft und übergeben haben, müssen Sie in Zeile 401 eine gültige Benutzer-ID erstellen und an $userId Geben, damit die Verarbeitung mit der gültigen Benutzer-ID fortgesetzt werden kann.

(changing line 401 would be a core hack or in an extended processReserRequest)

Sie müssen eine gefälschte Benutzer-ID in Ihrer com_user-Tabelle erstellen, die kein Superuser ist und eine gültige E-Mail-Adresse hat, die Sie automatisch verwerfen können, wenn sie von Ihrem Mailserver/Konto empfangen wird.

Der Grund, warum Sie diese gefälschte Benutzer-ID benötigen, ist, dass die Verarbeitung abgeschlossen werden kann, eine E-Mail gesendet wird und Sie am Ende der processResetRequest angelangt sind, damit Sie zur Funktion request in der reset Subcontroller. Dies ist es, was Sie zu com_user/views/reset/tmpl/reset.php Weiterleitet. Dies ist der gewünschte Bildschirm mit der richtigen Nachricht, dass eine E-Mail gesendet wurde und alles echt aussieht.

Übrigens die Nachricht, die Sie anzeigen möchten

"Eine E-Mail wurde an Ihre E-Mail-Adresse gesendet. Die E-Mail enthält einen Bestätigungscode. Fügen Sie den Bestätigungscode in das Feld unten ein, um zu beweisen, dass Sie der Eigentümer dieses Kontos sind."

kommt von com_users/models/forms/reset_confirm.xml und ist eine Feldsatzbezeichnung in Zeile 3.

<fieldset name="default" label="COM_USERS_RESET_CONFIRM_LABEL">
2
Irata

Sie können ein Plugin-Ereignis onAfterRoute verwenden, um Controller-Aufgaben in gewissem Sinne zu überschreiben. Es ist nicht perfekt, aber es schlägt Core-Hacking. Das folgende Beispiel ahmt UsersControllerReset:request() nach, leitet jedoch zur Bestätigungsseite weiter, auch wenn das Modell false zurückgibt.

defined('_JEXEC') or die;

use Joomla\CMS\Language\Text;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Router\Route;

class PlgSystemExample extends CMSPlugin
{
    protected $app;

    public function onAfterRoute()
    {
        // Check that we are performing the correct task.
        if ($this->app->input->get('option') === 'com_users' && $this->app->input->get('task') === 'reset.request')
        {
            $this->request();
        }
    }

    protected function request()
    {
        // Check the request token.
        if (!$this->app->getSession()->checkToken('post'))
        {
            $this->app->enqueueMessage(Text::_('JINVALID_TOKEN_NOTICE'), 'error');
            $this->app->redirect(Route::_('index.php?option=com_users&view=reset', false));
        }

        $option = $this->app->input->get('option');

        // Define component paths. The model may need them.
        if (!defined('JPATH_COMPONENT'))
        {
            define('JPATH_COMPONENT', JPATH_BASE . '/components/' . $option);
        }

        if (!defined('JPATH_COMPONENT_SITE'))
        {
            define('JPATH_COMPONENT_SITE', JPATH_SITE . '/components/' . $option);
        }

        if (!defined('JPATH_COMPONENT_ADMINISTRATOR'))
        {
            define('JPATH_COMPONENT_ADMINISTRATOR', JPATH_ADMINISTRATOR . '/components/' . $option);
        }

        // Load com_users language files.
        $this->app->getLanguage()->load('com_users');

        // Register com_users models.
        JModelLegacy::addIncludePath(JPATH_SITE . '/components/com_users/models', 'UsersModel');

        // Fetch the model.
        $model = JModelLegacy::getInstance('Reset', 'UsersModel');

        // Submit the password reset request.
        $data   = $this->app->input->post->get('jform', array(), 'array');
        $return = $model->processResetRequest($data);

        // Check for a hard error. It can occur when sending mail fails.
        if ($return instanceof Exception)
        {
            // Get the error message to display.
            if ($this->app->get('error_reporting'))
            {
                $message = $return->getMessage();
            }
            else
            {
                $message = Text::_('COM_USERS_RESET_REQUEST_ERROR');
            }

            // Go back to the request form.
            $this->app->enqueueMessage($message, 'error');
            $this->app->redirect(Route::_('index.php?option=com_users&view=reset', false));
        }

        // Redirect to confirmation page.
        $this->app->redirect(Route::_('index.php?option=com_users&view=reset&layout=confirm', false));
    }
}
2
Sharky