IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

EDI, CMS, Outils, Scripts et API PHP Discussion :

[phpRegister] Partage d'un script de gestion de comptes


Sujet :

EDI, CMS, Outils, Scripts et API PHP

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 551
    Points : 264
    Points
    264
    Par défaut [phpRegister] Partage d'un script de gestion de comptes
    Bonjour à tous,

    Dans le cadre de développements internes et pour des clients, j'ai développé un script de gestion de comptes avec une infrastructure logicielle qui permet de démarrer facilement une nouvelle plateforme web.
    Le script se veut avant tout facile d'accès et simple à comprendre pour pouvoir le modifier facilement pour l'adapter à ses besoins.
    La liste des fonctionnalités est assez longue. J'ai voulu partager un maximum de ce que j'ai pu développer au fil des années:

    Fonctions et pages par défaut du site Web
    • Création de comptes : Création d'un compte email / mot de passe ou création via les boutons Facebook et Google.
    • Envoyer un email lors de la création du compte pour l'activer. Renvoyer le lien d'activation. Récupérer le mot de passe.
    • Gérer profil : Photo, email, adresses, abonnez-vous à la newsletter.
    • Support utilisateur, ouvrir un ticket, répondre au ticket, fermer un ticket.
    • Supprimer un compte en envoyant un lien de suppression. Supprimer toutes les données utilisateur.
    • Multilingue complet : réécriture d'URL, Metas titre et description, Metas pour les pages Canonical/Alternate.
    • Pages de base : Connexion - Créer un compte - Profil - Support utilisateur - Contact - Qui sommes-nous - Licence (Base des Conditions générales d'utilisation et Politique de confidentialité).
    • 100% responsive avec 2 menus latéraux pour les téléphones.


    Administration
    • Page d'accueil avec graphiques des créations de comptes.
    • Gestion des comptes : rechercher des utilisateurs, afficher les détails d'un utilisateur, gérer les droits d'administrateur d'un utilisateur, envoyer un e-mail à un utilisateur.
    • Gestion de la traduction des pages: rechercher et modifier une variable, modifier le contenu de votre site à la volée avec la fonction "Show Translate Ids".
    • "Login as": fonction qui permet à un administrateur de se connecter en tant qu’un autre utilisateur, en générant un lien unique contenant une clé et avec le mot de passe "Login as".
    • Gestion des tickets du Helpdesk : Répondre à un ticket, marquer un ticket "En cours", fermer ou supprimer un ticket, ré-ouvrir un ticket fermé.
    • Créer des redirections 404 à 301 (Moved Permanently).
    • Gérer les variables de configuration globale de votre environnement.
    • Générer le fichier sitemaps.
    • Créer des comptes au hasard ! Avec cette fonctionnalité, vous pouvez simuler de nombreux comptes créés sur votre site et tester la vitesse du script phpRegister et de votre serveur.


    Dispo à l'adresse: https://phpregister.org

    Merci pour vos commentaire,
    Vincent.

  2. #2
    Membre régulier Avatar de abdennour bouaicha
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2009
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2009
    Messages : 98
    Points : 112
    Points
    112
    Par défaut
    formidable

  3. #3
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour defacta

    J'ai parcouru un peu le code source de ton travail et noté quelques éléments :
    - la gestion du mot de passe est obsolète (SHA1 et le hash est calculé manuellement, ça pique !)
    - purée, le nombre de fonctions que tu utilises pour tout est juste astronomique (je pense que cela serait plus maintenable et facilement abordable si tu optais pour une autre approche).
    - tu abuses des inclusions, à la fin pour savoir où est déclarée telle ou telle variable c'est juste un chemin de croix
    - dans beaucoup de fonctions tu mélanges tout : html, js, sql, code métier...
    - évite de renvoyer des erreurs système directement au navigateur : utilise plutôt un log et envoie un message générique au client
    - à priori, j'ai remarqué que pas mal de valeurs en provenance de $_GET ne faisaient l'objet d'aucun contrôle
    - tu devrais éviter de fermer les fichiers .php avec ?> quand ces derniers ne contiennent que du PHP

    Travail sympa, mais comme c'est mis à dispo de la communauté, tu devrais l'améliorer afin de coller un peu plus aux standards actuels

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 551
    Points : 264
    Points
    264
    Par défaut
    Pour le mot de passe:

    Le mot de passe 'azerty' est dans un premier temps transformé avec une clef défini par le développeur.
    Avec la clef
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $config['KeyPassword'] = '1234';
    le mot de passe base64_encode devient "lauXpaiq" mais avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $config['KeyPassword'] = 'ABCD';
    le mot de passe devient "pbuntbi6". Et c'est cette transformation qui est transformé.
    Le SHA1 du mot de passe devient avec KeyPassword à "1234":
    155186363668e3697b107f5096398514223a7ace
    Le SHA1 du mot de passe devient avec KeyPassword à "ABCD":
    0b10ddbe8e99261e5caa58c77d58e121f5ad8cb5
    Donc ce n'est pas en ayant accès une liste SHA1 des mots de passe que l'on pourra retrouver un mot de passe, il faudra aussi hacker le serveur pour obtenir la valeur de et recréer une liste de mots de passe hashé SHA1. Non ?
    https://korben.info/une-liste-de-15-...-de-passe.html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    /**
     *  Encrypt password
     *  Avoid using sha1 directly
     */
    function hash_password($string) {
        global $config;
     
        $result = '';
        for($i=0; $i<strlen($string); $i++) {
            $char = substr($string, $i, 1);
            $keychar = substr($config['KeyPassword'], ($i % strlen($config['KeyPassword']))-1, 1);
            $char = chr(ord($char)+ord($keychar));
            $result.=$char;
        }
        echo base64_encode($result).'<br>';
        return sha1($result);
     
    }
    Je ne vois pas comment on peut faire un brute force avec un accès aux mots de passe hashé de cette fonction. Moi j'en serais incapable.
    Libre au développeur de modifier cette fonction selon ces besoins. Elle se trouve tout simplement dans le fichier global.inc.php.

    Le nombre de fonction est astronomique, pourtant j'ai fait au minimum et le plus clairement possible. Exemple des variables et fonctions pour afficher la page de contact:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    init_langVars(['Contact', 'Global']);
     
    $page = 'contact-us';
     
    $cssFiles = get_cssFiles(['navbar', 'main', 'contact']);
    $jsFiles = get_jsFiles(['global']);
    $cssPlugins = [];
    $jsPlugins = [];
     
    $headerTitle = lg('Contact Form', NULL, FALSE);
    $headerDesc = 'Meta Description of the contact page ';
     
    show_header();
    show_navbar();
    show_contact();
    show_end();
    Et la fonction show_contact se trouve dans le fichier contact_display.inc.php, tout simplement.

    Le code sql est toujours en amont puis j'appelle les fonctions d'affichage pour avoir un affichage le plus rapide possible, sauf dans la partie Admin/Home...désolé !

    Pour le HTML / JS, on peut aussi créer des fichiers JS et les charger dans le DOM avec la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $jsFiles = get_jsFiles(['global']);
    . Moi je préfère utiliser les variables PHP pour les insérer dans le DOM directement !

    Oui, on peut ajouter dans global.inc.php une boucle contrôlant les valeurs de $_GET. Laquelle en particulier, celle-là par exemple est bien contrôlée?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if(isset($_GET['do']) && ($_GET['do'] == 'passch') ){
            $jsDocumentReady .= '
        $("#ModalPasswordRecover").modal("show");';
        }
    Les standards actuels sont faits pour devenir obsolètes dans qqs années au grand dam des clients mais pour le grand bien des commerciaux!

  5. #5
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    tu te trompes sur SHA1, il a été démontré (théoriquement et informatiquement) qu'il était possible de provoquer des collisions c'est-à-dire que deux valeurs différentes auront le même hash SHA1, inversement et compte tenu des lois mathématiques, à partir d'un hash SHA1 tu peux obtenir de fait théoriquement une infinité de valeurs qui auront le même hash SHA1 (ou même les premiers bits identiques, ce qui augmente drastiquement la surface d'attaque). SHA1 est devenu un trou noir en matière de sécurité.

    Pour l'échappement, je faisais référence au fait que tu passais des valeurs de $_GET directement dans du JSON sans utiliser json_encode() qui lui te garantit que tu n'auras pas de mauvaise surprises.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function showModalPasswordChange() {
      var values = {"do": "showchange", "key_passchange": "'.$_GET['key_passchange'].'" };
    ou ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input id="InputLastname" name="InputLastname" type="text" value="'.$userInfos['lastname'].'" class="form-control input-grey py-sm-4 px-sm-3">
    es-tu sûr que $userInfos['lastname'] est bien échappé ?

    Depuis plus de 10 ans maintenant, utiliser global c'est très mal et ça n'a pas bougé d'un iota. Toute la communauté reste d'accord sur le constat que c'est un problème de design d'application.
    C'est exactement la remarque que je te faisais sur l'abus des inclusions en cascade : tu es très vite perdu. Tu va utiliser des variables mais pour savoir d'où elles proviennent, c'est autrement plus compliqué.
    Tiens regarde une de tes fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    function show_profile() {
        global $config, $configNative, $siteSections, $userInfos, $userAddresses, $countryLangShow, $sessionUser, $jsScripts, $jsDocumentReady, $jsWindowLoaded, $jsWindowResize;
    je veux utiliser directement cette fonction, bah c'est impossible, je dois remonter toute la chaîne pour deviner comment et où sont initialisées ces variables globales. T'imagine...
    ou ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    define('_PATHROOT', '../../');
    require_once (_PATHROOT.'config/config.inc.php');
    require_once (_PATHROOT.'include/php/global_display.inc.php');
    require_once (_PATHROOT.'include/php/global.inc.php');
    require_once (_PATHROOT.'include/php/global_cookies.inc.php');
    include_once (_PATHROOT.'account/account_display.inc.php');
    include_once ('profile_display.inc.php');
    include_once ('profile_sql.inc.php');
     
    init_langVars(['Profile', 'Signup', 'Global']);
    et après tu utilises des variables qui sont à disposition comme tombées du ciel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sql = $dataBase->prepare('SELECT pr__user.email, pr__user.password, pr__user.firstname, pr__user.lastname, pr__user.newsletter,
                                      pr__user.newemail, pr__user.newemail_changedate, pr__user.account_deletekey, pr__user.account_deletedate
                               FROM pr__user
                               WHERE pr__user.id = :id');
    Personnellement, je débarque dans ton code et ben je suis paumé.
    Citation Envoyé par defacta Voir le message
    Les standards actuels sont faits pour devenir obsolètes dans qqs années au grand dam des clients mais pour le grand bien des commerciaux!
    Tu veux rire ? Il est très rare que l'on remette en cause un standard. Généralement ils évoluent, s'améliorent et se renforcent grâce aux retours d'expérience terrain.
    Depuis les 20 dernières années, en matière de développement (web ou en général), certaines tendances sont devenues des standards qui n'ont pas bougé depuis.

Discussions similaires

  1. [Recherche] Script de gestion de fichiers
    Par fpouget dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 10/05/2006, 16h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo