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

PHP & Base de données Discussion :

échapper des valeurs $_POST servant à la connection


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 64
    Par défaut échapper des valeurs $_POST servant à la connection
    Le code suivant est appelé en ajax,

    j'ai besoin de protéger et d'échapper les variables $POST notamment $user_id,

    mais cette variable user_id sert à me connecter, et donc la connection ne peut pas se faire car real_escape_string ne peut se faire sans connection.

    comment securiser autrement $user_id ? merci d'avance

    fichier php :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    <?php
    include ("dbconfig.php");
     
    error_reporting(E_ALL);
    ini_set("display_errors", 1);
    header("Access-Control-Allow-Origin: *");
     
    $user_id = $dbcon ->real_escape_string(strip_tags($_GET['user_id'],ENT_QUOTES));
    $current_file = $dbcon ->real_escape_string(strip_tags($_GET['current_file'],ENT_QUOTES));
    $user_token = $dbcon ->real_escape_string(strip_tags($_POST['user_token'],ENT_QUOTES));
     
     
    $geojson = array(
             'type'      => 'FeatureCollection',
             'features'  => array()
    );
    try {
     
           $dbcon = new PDO("pgsql:host=".$pghost.";port=".$pgport.";dbname=mfy_".$user_id.";user=".$pguser.";password=".$pgpass."");
            $dbcon->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $stmt = $dbcon->prepare("SELECT cat, public.ST_AsGeoJSON(public.ST_Transform((geom),4326),6) AS geojson FROM :current_file._linestring");
            $stmt->bindValue(":currentfile", $current_file, PDO::PARAM_INT);
     
    if($stmt->execute()){
                    $id_count = 0;
                    while($rowset = $stmt->fetch(PDO::FETCH_ASSOC)){
                            $properties = $rowset;
                            unset($properties['geojson']);
                            unset($properties['geom']);
                                    $feature = array(
                                                     'type' => 'Feature',
                                                     'id' => $id_count,
     
                                                     'properties' => $properties,
                                                     'geometry' => json_decode($rowset['geojson'], true)
                                    );
                            array_push($geojson['features'], $feature);
                            $id_count++;
     
     
           }
                    header('Content-Type: application/json');
                    echo json_encode($geojson, JSON_NUMERIC_CHECK);
                    $dbcon = null;
                    exit;
            } else {
                    header('Content-Type: application/json');
                    echo json_encode($geojson, JSON_NUMERIC_CHECK);
                    $dbcon = null;
                    exit;
            }
    } catch (PDOException $e) {
            header('Content-Type: application/json');
            echo json_encode($geojson, JSON_NUMERIC_CHECK);
            $dbcon = null;
            exit;
    }
    ?>


    exemple type d'appel ajax depuis javascript : le traitement de la réponse n'est pas indiqué mais est maitrisé. Ce sont des variables en javascript qui sont envoyés à php.

    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
    19
    20
    21
    22
    function rowcounter() {
    rowcount = $.ajax({
      url: "../crud/dataservice/count_tracks2.php",
      method: "GET",
      dataType: "json",
      data: {
          command: "LINESTRING",
    current_file: current_file,
              cat: "track1",
    user_id: user_id,
      },
      xhrFields: {
          withCredentials: true
      },
      username: null,
      password: null
    });
     
     
    //      response2 = rowcount.responseText;
    //      console.log(response2);
    };
    fichier dbconfig.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $pgconfig = array (
            "_pgsql_db_host_" => "localhost",
            "_pgsql_db_port_" => "5432",
            "_pgsql_db_user_" => "userpg",
            "_pgsql_db_pass_" => "mdpp",
            "_pgsql_db_name_" => "nothing" );
     
         $pghost = $pgconfig['_pgsql_db_host_'];
            $pgport = $pgconfig['_pgsql_db_port_'];
            $pguser = $pgconfig['_pgsql_db_user_'];
            $pgpass = $pgconfig['_pgsql_db_pass_'];
            $pgname = $pgconfig['_pgsql_db_name_'];
    ?>

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 322
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 322
    Billets dans le blog
    17
    Par défaut
    Tu ne confonds pas utilisateur BdD et utilisateur applicatif ?
    Comment tu connectes-tu à ta BdD dans dbconfig.php ?
    Généralement l'utilisateur se connectant au serveur de base de données est paramétré en dur côté applicatif et diffère de l'utilisateur applicatif.
    Si tu reçois vraiment l'utilisateur BdD depuis un formulaire alors tu peux l'utiliser directement pour la connexion sans l'échapper, car il n'y a pas de risque d'injection SQL.
    Ensuite, après connexion et si besoin de l'intégrer à une requête SQL, tu pourras l'échapper de manière habituelle.

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    721
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 721
    Par défaut
    Non, ne faites pas des trucs comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $user_token = $dbcon ->real_escape_string(strip_tags($_POST['user_token'],ENT_QUOTES));
    real_escape_string c'est une méthode du siècle dernier et de toute façon l'utiliser seule ne suffit pas (voir la doc).
    La fonction strip_tags est utilisée de manière abusive et ne sert pas à ça.
    L'essentiel est d'utiliser des requêtes préparées, ce que vous faites.

    Par contre je serais étonnée que la clause FROM accepte un paramètre au lieu d'une valeur "en dur". A mon avis il faut faire du SQL dynamique, en clair concaténer dans ce cas précis et il faut donc faire attention aux injections SQL.

    Vu que n'importe qui peut trafiquer le paramètre user_id et qu'il n"y a pas de contrôle des droits a priori, j'ai des réserves sur la sécurité. Je m'attendrais plutôt à une variable de session.

    On peut aussi éliminer tout le code répétitif. En réalité la gestion d'exception ne sert à rien, elle ne fait rien de spécial qui ne soit pas déjà fait ailleurs. Elle est même nuisible, car elle masque les exceptions qui pourraient intervenir. Il vaudrait mieux alors la supprimer.

  4. #4
    Membre confirmé
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 64
    Par défaut
    Merci beaucoup. J'ai édité ce qui semblait manquer dans mon descriptif : appel en ajax et dbconfig.php

    L'utilisateur applicatif a son propre mot de passe, stocké sur mysql (capture suivante)

    et il y a une autre base de données postgresql qui correspond à l'utilisateur, mfy_numerodutilisateur, dont je suis le seul a avoir le code, et les données sont puisées dedans lorsque l'utilisateur a effectué la connection

    Vu que n'importe qui peut trafiquer le paramètre user_id et qu'il n"y a pas de contrôle des droits a priori, j'ai des réserves sur la sécurité. Je m'attendrais plutôt à une variable de session.
    C'est vrai, en ce moment, il suffit de changer user_id en javascript pour regarder ce que font les autres, la manière que je m'apprete a faire est de faire un contrôle de la valeur du token modifiée dans le tableau des utilisateurs quand l'utilisateur se connecte :

    Nom : screenshot-ee9b5a8b.jpg
Affichages : 160
Taille : 87,5 Ko

    Cette valeur étant donnée à l'utilisateur dans une variable javascript et renvoyée par ajax. Je veux donc comparer le token du tableau et celui que possède l'utilisateur pour m'assurer qu'il s'est bien connecté avec mot de passe, en comparant le ticket quil me presente et celui que j'ai stocké pour lui.

    Dans beaucoup des pages de mon site, inspiré de Leaflet Crud, l'utilisateur a des formulaires traités en javascript et html, avec des cases dans lequel il peut modifier ce qu'il ya dans les bases postgresql, c'est passé en $_POST

    j'ai cependant ces choses dans $_SESSION , à la connection :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
                        if (password_verify($_POST['user_password'], $result_row->user_password_hash)) {
     
     
    // write user data into PHP SESSION (a file on your server)
     
     
                            $_SESSION['user_name'] = $result_row->user_name;
                            $_SESSION['user_email'] = $result_row->user_email;
                            $_SESSION['user_id'] = $result_row->user_id;
                            $_SESSION['user_login_status'] = 1;
     
     
                            // creates and replaces the token in the database
     
    $sql5 = "UPDATE users SET token = '".base64_encode(random_bytes(10))."' WHERE user_id = ".$_SESSION['user_id'].";
    ";
     
    $query_token3 = $this->db_connection->query($sql5);
     
    // recupere ce token depuis la base de donnees
     
                    $sql6 = "SELECT token
                            FROM users
                            WHERE user_name = '" . $user_name . "' OR user_email = '" . $user_name . "';";
                    $get_token = $this->db_connection->query($sql6);
     
     
                        $result_row2 = $get_token->fetch_object();
     
    // recupere en tant que valeur de session
     
     
    $_SESSION['user_token'] = $result_row2->token;
    Par contre je serais étonnée que la clause FROM accepte un paramètre au lieu d'une valeur "en dur". A mon avis il faut faire du SQL dynamique, en clair concaténer dans ce cas précis et il faut donc faire attention aux injections SQL.
    Je ne maîtrise pas tout ça mais je vais chercher... je souhaite que FROM :current_file_linestring se transforme en FROM fichierdexemple_linestring

    enfin, Le code répetitif, issu de leaflet crud, a effectivement vocation a disparaître.

  5. #5
    Membre confirmé
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 64
    Par défaut
    j'en suis la : mon code exemple est ici. je ne vous ai pas donné le meilleur exemple comme requete sql alors je l'ai modifiee :

    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
    19
    20
    <?php
     
    if(!isset($_SESSION)) {    session_start();  };
    include ("dbconfig.php");
     
    error_reporting(E_ALL);
    ini_set("display_errors", 1);
    header("Access-Control-Allow-Origin: *");
     
    $dbcon = new PDO("pgsql:host=".$pghost.";port=".$pgport.";dbname=mfy_".$_SESSION['user_id'].";user=".$pguser.";password=".$pgpass."");
    $dbcon -> setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
     
    $sql5 = "  UPDATE public.index SET name = ? WHERE name = ?;
            ALTER TABLE public.?_point RENAME TO ?_point;
    ALTER TABLE public.?_linestring RENAME TO ?_linestring;
    ALTER TABLE public.?_polygon RENAME TO ?_polygon;";
    $stmt=$dbcon->prepare($sql5);
    $stmt->execute(array(
            $_POST['newname'], $_POST['current_file'], $_POST['current_file'], $_POST['newname'], $_POST['current_file'], $_POST['newname'],  $_POST['current_file'],  $_POST['newname']));
              ?>


    l'erreur en ce moment apres modification, c'est la presence de guillemets simples :

    2023/07/31 09:34:52 [error] 533814#0: *19589 FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught PDOException: SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "'normandie'"
    LINE 3: ALTER TABLE public.'normandie'_point
    ^ in /usr/share/nginx/html/crud/dataservice/rename_file.php:28
    Stack trace:
    #0 /usr/share/nginx/html/crud/dataservice/rename_file.php(28): PDOStatement->execute()
    #1 {main}

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 322
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 322
    Billets dans le blog
    17
    Par défaut
    $sql5 = " UPDATE public.index SET name = ? WHERE name = ?;
    ALTER TABLE public.?_point RENAME TO ?_point;
    ALTER TABLE public.?_linestring RENAME TO ?_linestring;
    ALTER TABLE public.?_polygon RENAME TO ?_polygon;";
    $stmt=$dbcon->prepare($sql5);
    Tu ne pourras pas utiliser les paramètres d'une requête préparée pour des noms d'objets.
    Ces paramètres ne servent que pour remplacer des valeurs littérales (chaînes/entiers/booléens/(NULL)).
    Il faudra sans doute revoir la modélisation de ta BdD.

  7. #7
    Membre confirmé
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 64
    Par défaut
    Je reviens a cette discussion après plusieurs jours de travail sur le sujet :

    Merci beaucoup de vos conseils, et donc les derniers concernant les guillemets public."

    J'ai maintenant réussi à lier une grande partie des pages à cette nouvelle architecture. Il est vrai qu'un acces a poatgresql nairait pas servi a tous, et je ne voi pas encore bien comme mettre une api en place, je peux y penser plys tard

    et finalement, si les noms de table sont maintenant

    user46_table23_linestring par exemple,
    Quel nom different devrais-je adopter?

Discussions similaires

  1. Récupération des valeurs d'input dans iframe par $_POST
    Par corentinparent dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 26/11/2010, 18h43
  2. Perte des valeurs de $_POST avec onsubmit
    Par tisstt dans le forum Langage
    Réponses: 6
    Dernier message: 20/06/2008, 11h49
  3. Mauvaise récupération des valeurs avec $_POST
    Par Trebor_ dans le forum Langage
    Réponses: 2
    Dernier message: 02/03/2008, 10h33
  4. Réponses: 1
    Dernier message: 25/04/2007, 16h23

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