web-dev-qa-db-fra.com

Problème de validation de l'email Joomla 2.5

Il semble y avoir un problème majeur sur plusieurs sites v2.5.7 auxquels on m'a demandé de m'aider, où les courriels ne sont pas validés lorsqu'ils sont entrés dans le composant intégré com_contact d'un formulaire contact-us standard.

Le formulaire de contact affichera une erreur lorsque le TLD utilisé par l'émetteur se termine par une valeur utilisant plus de 4 caractères situés à l'extrémité "point" du nom de domaine ... c'est-à-dire 5 caractères de " .cloud 'ne sera pas accepté, les 3 caractères marqués par' . com 'fonctionneront comme prévu. J'ai vérifié qu'il s'agissait d'un problème pouvant être répété avec chaque formulaire soumis lors de l'utilisation des nouveaux noms de domaine/étendus dans une adresse électronique. Les formes fonctionnent parfaitement.

Ce site ne sera pas encore mis à niveau vers une version plus récente, et le code principal a été fortement corrigé afin de couvrir les bugs et les problèmes de sécurité. Autrement, un nouveau correctif sera nécessaire pour prendre en charge ce problème. En d'autres termes, il est impossible de coder à la main.

D'après ce que j'ai découvert jusqu'à présent, le code de validation responsable de l'adresse électronique elle-même se trouve dans: /libraries/joomla/form/rules/email.php

Le code faisant la validation semble être la regex à la ligne 27 ... et je déteste et ne comprends pas assez sur la regex pour pouvoir proposer un correctif certain.

Est-ce que quelqu'un de familier peut me donner un index sur si mon hypothèse est correcte - qu'il s'agit du code du problème ... ou de l'endroit où il pourrait être localisé si ce n'est pas le bon fichier? Et - si c'est le bon endroit, quels changements peuvent être apportés pour permettre à un TLD beaucoup plus long d'être acceptable dans une adresse e-mail.

Voici le code de fonction complet dans email.php:

class JFormRuleEmail extends JFormRule
{
    /**
     * The regular expression to use in testing a form field value.
     *
     * @var    string
     * @since  11.1
     */
    protected $regex = '^[\w.-]+(\+[\w.-]+)*@\w+[\w.-]*?\.\w{2,4}$';

    /**
     * Method to test the email address and optionally check for uniqueness.
     *
     * @param   JXMLElement  &$element  The JXMLElement object representing the <field /> tag for the form field object.
     * @param   mixed        $value     The form field value to validate.
     * @param   string       $group     The field name group control value. This acts as as an array container for the field.
     *                                  For example if the field has name="foo" and the group value is set to "bar" then the
     *                                  full field name would end up being "bar[foo]".
     * @param   JRegistry    &$input    An optional JRegistry object with the entire data set to validate against the entire form.
     * @param   object       &$form     The form object for which the field is being tested.
     *
     * @return  boolean  True if the value is valid, false otherwise.
     *
     * @since   11.1
     * @throws  JException on invalid rule.
     */
    public function test(&$element, $value, $group = null, &$input = null, &$form = null)
    {
        // If the field is empty and not required, the field is valid.
        $required = ((string) $element['required'] == 'true' || (string) $element['required'] == 'required');
        if (!$required && empty($value))
        {
            return true;
        }

        // Test the value against the regular expression.
        if (!parent::test($element, $value, $group, $input, $form))
        {
            return false;
        }

        // Check if we should test for uniqueness.
        $unique = ((string) $element['unique'] == 'true' || (string) $element['unique'] == 'unique');
        if ($unique)
        {

            // Get the database object and a new query object.
            $db = JFactory::getDBO();
            $query = $db->getQuery(true);

            // Build the query.
            $query->select('COUNT(*)');
            $query->from('#__users');
            $query->where('email = ' . $db->quote($value));

            // Get the extra field check attribute.
            $userId = ($form instanceof JForm) ? $form->getValue('id') : '';
            $query->where($db->quoteName('id') . ' <> ' . (int) $userId);

            // Set and query the database.
            $db->setQuery($query);
            $duplicate = (bool) $db->loadResult();

            // Check for a database error.
            if ($db->getErrorNum())
            {
                JError::raiseWarning(500, $db->getErrorMsg());
            }

            if ($duplicate)
            {
                return false;
            }
        }

        return true;
    }
}
2
J-Extra

Vous avez correctement identifié le problème. Le bogue a été soulevé ici: https://developer.joomla.org/joomlacode-archive/issue-28128.html

Joomla utilise maintenant l'expression régulière suivante.

protected $regex = "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$";

Vous pourriez probablement simplement échanger la ligne regex, mais vous devriez vraiment corriger les sites et ne pas toucher au code principal. Il y a eu beaucoup de correctifs de sécurité depuis la version 2.5, votre site est donc vulnérable.

0
Richard B