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

Web & réseau Delphi Discussion :

Accéder à mon espace membre (BDD + php) depuis une application


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut Accéder à mon espace membre (BDD + php) depuis une application
    salut les développeurs

    j'aimerais créer une application (firemonkey) qui me permettra d'accéder à mon site web, mais plus précisément, à mon espace membre

    déjà, j'ai pensé à tout gérer grâce à Tidhttp ou Tidhttpclient ? en faisant des requêtes http dans des Thread (CreateAnonymousThread) ou Itask ?

    par contre, j'ai une interrogation liée à la sécurité, afin d'éviter qu'un utilisateur mal intentionné profite de mon manque d'expérience pour faire des requêtes dont il n'aurait pas les droits (lire des pm des autres membres par ex)

    donc bien entendu à l'ouverture du logiciel, j'effectue une authentification (pseudo + passe) par requête http : la requête enverra 1 ou 0 si l'authentification a été effectué : un utilisateur peut modifier les variables pour pour s'attribuer un autre pseudo ?

    j'avais pensé aussi à créer des variables de session, mais dans ce cas, la session ne doit pas mourir, coté client, comment est ce que ça fonctionne ?

    habituellement je fais des requêtes http assez simple, pour répondre à une demande, recevoir un résultat : mais ici, il s'agit d'une sorte de navigation

    sinon il existe une autre méthode, plus sûr, mais qui me fera perdre du temps, et surcharger le serveur, c'est qu'à chaque requête, envoyer le couple pseudo + mot de passe, et donc côté serveur faire une authentification pour savoir si c'est bien le mdp qui correspond au pseudo et qu'il a les droits

    que pensez vous ?

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    avec PHP tu as la notion de session qui est généralement gérée par Cookie

    donc tu appelles login.php avec compte et mot de passe, côté PHP tu fais un start_session() et dans la session tu indiques qui tu es, si tu le mot de passe est valide etc...

    pour les requêtes suivantes, il suffit que le Cookie de session soit présent (normalement TidHTTP s'occupe de tout si mon souvenir est bon) pour que PHP retrouve la session

    de façon plus générique, le login peux te retourner un token qui doit être présent dans toutes les requêtes suivantes (c'est la même chose mais sans passer par un cookie)

    et oui, tu ne peux pas simplement utiliser un ID de table...j'ai vu déjà des gens faire cela, tu passes compte mot de passe, et ça te retourne l'ID de l'utilisateur dans la base...et si dans la requête tu remplaces cet ID par une autre valeur, tu te fais passer pour un autre utilisateur...mais bon ces mêmes développeurs affichaient le mot de passe en clair dans la fiche utilisateur...très pratique avec l'astuce précédente pour connaître le mot de passe de n'importe qui...qui avec un peu de chance est le même que celui de sa boîte mail etc...

    il est très facile de créer des trous de sécurités quand on n'a pas l'habitude du web la première chose à savoir, c'est qu'il ne faut jamais croire ce que dis le navigateur, tu attends un entier ? il te balance un bout de SQL pour tenter une SQL Injection, il faut donc vérifier que c'est bien un entier. etc...
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    merci Paul pour ton éclaircissement, sans être un pro du php, je sais comment fonctionne les sessions, j'ai travaillé dessus lorsque j'ai codé mon espace membre
    mon principal problème résidait du fait, de savoir comment mon composant (Idhttp) gérerait la création de session côté serveur
    d'après ce que tu dis, c'est automatique ? je testerai ...
    j'ai revu rapidement mon "schéma" de tête, je pense que le mieux est de ne RIEN envoyé comme paramètre lors des requêtes php :

    ex : je veux afficher la liste des pm de "Paul"
    déjà Paul s'authentifie (et c'est la seule fois que des paramètres seront envoyés, et c'est un peu normal, c'est l'user / pass)
    côté serveur : SI l'authentification est fait, une variable "pseudo" se créé avec dedans "Paul"
    envoie d'une requête simple : afficher liste pm (sans paramètre)
    le serveur web récupère la liste des pm de la variable de session "pseudo"

    ainsi je pense que l'utilisateur mal intentionné ne peut rien transmettre / modifier / usurper ! qu'en penses tu ?

    pour l'envoie de pm, et autre, pareil sauf qu'en paramètre on aura des données non sensibles (objet du msg, corps du msg, ect)

    le seul truc, c'est de réussir à faire en sorte que la session : compo-serveur php soit possible

  4. #4
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    sur IdHTTP tu as AllowCookies et CookieManager
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre émérite
    Avatar de Gouyon
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 1 138
    Billets dans le blog
    5
    Par défaut
    Bonjour

    Une autre solution consiste à crypter les échanges ou à appeler des fonctions php.
    J'ai fait une application delphi android qui fonctionne comme ça.

    J'utilise les composants TNetHTTPClient et TNetHTTPRequest pour la communication avec mon site.

    Par exemple j'ai besoin de voir la liste des membres de mon club plutôt que d'envoyer une requête SQL du genre "SELECT Nom,Prenom FROM tableMembre"
    j’appelle une fonction PHP qui elle va exécuter la requête SQL

    Coté pascal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure Frm.getListeMembre;
    begin
      params.Clear;
      demande := 'fexec=GETLISTE;
      params.Add(demande);
      params.Add('ID=' + id_con);
      params.Add('MDP=' + mdp_con);
     req.Post(urlsite, params);
    end;
    params est un TSringList
    req est un TNetHTTPRequest
    id_con et mdp_con contiennent l'identifiant et le mot de passe de l'utilisateur.

    La récupération de la réponse se fait dans l'évènement OnRequestCompleted

    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
     
    procedure Frm.reqRequestCompleted(const Sender: TObject; const AResponse: IHTTPResponse);
    var
      ret: string;
    begin
      try
        ret := AResponse.ContentAsString(TEncoding.UTF8);
      except
        on E: Exception do
          ret := '';
      end;
    //traitement de ret
     
    //
    end;
    Coté PHP
    Code php : 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
    19
     
    $bdd= new mysqli(...)
    if ($bdd->connect_errno)
    {
     echo "ERREUR:<<CONNEXION IMPOSSIBLE:" . $bdd->error . ">>";
    else {
        $idj = (int) getRefMembre($bdd, $_POST['ID'], $_POST['MDP']);
        // echo "identification=".$idj;
        if ($idj > 0) {
            $fonc2exec = $_POST['fexec'];
     
            if ($fonc2exec == "GETLISTE") {
                $lst = getMembres($bdd);
                echo "OK:LISTE";
                foreach ($lst as $infol) {
                    echo "<<!PRENOM=" . $infol['prenom'] . "PRENOM! !NOM=" . $infol['prenom'] . " " . $infol['nom'] . "NOM!>>;";
                }
            }
    }

    la fonction membre qui contient la requête SQL
    Code php : 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
     
    function getLoueurs($conBDD)
    {
        $l_req = "SELECT nom , prenom FROM `table_membre`";
        $table = array();
        if ($l_resu = $conBDD->query($l_req)) {
            while ($l_ligne = $l_resu->fetch_assoc()) {
                $table[] = array(
                    "nom" => $l_ligne['nom'],
                    "prenom" => $l_ligne['prenom']
                );
            }
            return $table;
        }
        return $table;
    }

    Cette méthode est peut être un peu lourde mais elle a l'avantage d'être assez sécurisée dans la mesure où le pirate ne peut pas mettre directement du code SQL. De plus on peut ajouter de l'analyse de paramètre dans les fonctions afin d'éliminer d'éventuel mots clef SQL.

    On peut ajouter une couche de sécurité supplémentaire en cryptant les paramètres. Dans ce cas il faut utiliser une fonction de cryptage qui fonctionne en PHP et en Pascal. Les paramètres peuvent être groupé en une seule ligne.
    Du coté PHP il faut alors la décrypter puis l'analyser pour renvoyer la réponse correcte. Les composants DEC fonctionnent bien et j'utilise le cryptage AES

  6. #6
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    en fait tu viens de découvrir ce qu'est un WebService
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Remplir un tableau JS à l'aide de php depuis une bdd
    Par djesty dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 01/08/2017, 21h30
  2. Réponses: 1
    Dernier message: 27/03/2013, 12h09
  3. Réponses: 10
    Dernier message: 12/03/2013, 13h23
  4. Réponses: 41
    Dernier message: 27/08/2006, 15h17
  5. Réponses: 1
    Dernier message: 07/07/2006, 14h56

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