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

Langage PHP Discussion :

Api rest ne fonctionne pas en "POST"


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2015
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Api rest ne fonctionne pas en "POST"
    Bonjour,

    J'utilise un script API qui fonctionne très bien en GET , mais pas en POST.

    Il est appelé de cette manière : http://monsite.local/api/signalement...fghdfghdfgh103

    La première étape est de vérifier le coupe login/password. En GET ca roule , mais en post j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <br />
    <b>Notice</b>:  Undefined index: user in <b>/var/www/sport2/api/index.php</b> on line <b>35</b><br />
    <br />
    <b>Notice</b>:  Undefined index: password in <b>/var/www/sport2/api/index.php</b> on line <b>36</b><br />
    Je ne maitrise pas complétement le code suivant; du coup je suis perdu. Merci par avance de vos conseils.

    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
     
     
    class API extends REST {
         /*
         * Public method for access api.
         * This method dynmically call the method based on the query string
         *
         */
     
     
    public function processApi(){
     
    global $apimodels;
     
    $requette= explode("/", $_REQUEST['rquest']);
    $categorie=$requette[0];
    $id=intval($requette[1]); // retourne 0 si ce n'est pas un entier
    $user=$this->_request['user'];
    $password=$this->_request['password'];
     
     //On  verfie si le couple login/password est bon
    $verif=$apimodels->verifIdentifiants($user,$password);  
     if (!$verif){
     
     //$this->response('Erreur de mot de passe',403);
     
     }
     else{  
     
            if (method_exists($this, $categorie)) {
            $resultat=$this->$categorie($id);
     
            // pas de reponse à la requette
        if ($resultat ==NULL) {
             $this->response('pas de contenu',403);
        // marche pas avec204
        // echo"que dalle";
        }else{
         $resultat=$this->json($resultat);           
      // If success everythig is good send header as "OK" return param
        $this->response($resultat, 200);} 
     
            }
            else{
                $this->response('Error code 404, Page not found',404);   // If the method not exist with in this class, response would be "Page not found".
    }}
     
     
            }
    }
    Et voici la classe appelée


    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
     
        class REST {
     
            public $_allow = array();
            public $_content_type = "application/json";
            public $_request = array();
     
            private $_method = "";      
            private $_code = 200;
     
            public function __construct(){
                $this->inputs();
            }
     
            public function get_referer(){
                return $_SERVER['HTTP_REFERER'];
            }
     
            public function response($data,$status){
                $this->_code = ($status)?$status:200;
                $this->set_headers();
                echo $data;
                exit;
            }
     
            private function get_status_message(){
                $status = array(
                            100 => 'Continue',  
                            101 => 'Switching Protocols',  
                            200 => 'OK',
                            201 => 'Created',  
                            202 => 'Accepted',  
                            203 => 'Non-Authoritative Information',  
                            204 => 'No Content',  
                            205 => 'Reset Content',  
                            206 => 'Partial Content',  
                            300 => 'Multiple Choices',  
                            301 => 'Moved Permanently',  
                            302 => 'Found',  
                            303 => 'See Other',  
                            304 => 'Not Modified',  
                            305 => 'Use Proxy',  
                            306 => '(Unused)',  
                            307 => 'Temporary Redirect',  
                            400 => 'Bad Request',  
                            401 => 'Unauthorized',  
                            402 => 'Payment Required',  
                            403 => 'Forbidden',  
                            404 => 'Not Found',  
                            405 => 'Method Not Allowed',  
                            406 => 'Not Acceptable',  
                            407 => 'Proxy Authentication Required',  
                            408 => 'Request Timeout',  
                            409 => 'Conflict',  
                            410 => 'Gone',  
                            411 => 'Length Required',  
                            412 => 'Precondition Failed',  
                            413 => 'Request Entity Too Large',  
                            414 => 'Request-URI Too Long',  
                            415 => 'Unsupported Media Type',  
                            416 => 'Requested Range Not Satisfiable',  
                            417 => 'Expectation Failed',  
                            500 => 'Internal Server Error',  
                            501 => 'Not Implemented',  
                            502 => 'Bad Gateway',  
                            503 => 'Service Unavailable',  
                            504 => 'Gateway Timeout',  
                            505 => 'HTTP Version Not Supported');
                return ($status[$this->_code])?$status[$this->_code]:$status[500];
            }
     
            public function get_request_method(){
                return $_SERVER['REQUEST_METHOD'];
            }
     
            private function inputs(){
                switch($this->get_request_method()){
                    case "POST":
                        $this->_request = $this->cleanInputs($_POST);
                        break;
                    case "GET":
                    case "DELETE":
                        $this->_request = $this->cleanInputs($_GET);
                        break;
                    case "PUT":
                        parse_str(file_get_contents("php://input"),$this->_request);
                        $this->_request = $this->cleanInputs($this->_request);
                        break;
                    default:
                        $this->response('',406);
                        break;
                }
            }       
     
            private function cleanInputs($data){
                $clean_input = array();
                if(is_array($data)){
                    foreach($data as $k => $v){
                        $clean_input[$k] = $this->cleanInputs($v);
                    }
                }else{
                    if(get_magic_quotes_gpc()){
                        $data = trim(stripslashes($data));
                    }
                    $data = strip_tags($data);
                    $clean_input = trim($data);
                }
                return $clean_input;
            }       
     
            private function set_headers(){
                header("HTTP/1.1 ".$this->_code." ".$this->get_status_message());
                header("Content-Type:".$this->_content_type);
            }
        }

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    Il faudrait savoir ce que contient $this->_request et surtout savoir comment il est construit.

    La manière la plus simple de récupérer un paramètre en post ca reste quand même $_POST.

    J’espère au passage que ton api ne demande pas identifiant + mdp dans l'url en http , sinon autant ne pas en mettre ça reviendra au même en terme de sécurité

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2015
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Merci de ta réponse , je viens d'ajouter la classe appelée.

    Cette API n'est pas encore utilisée, je fais des tests . Le mot de passe est crypté en sha1 : ce n'est pas suffisant ?
    Sinon je chercherais une autre solution.

    Bonne journée

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    Si tu appels ton url en POST avec les paramètres dans l'url ca ne peut pas marcher , puisque les paramètres dans l'URL sont par définition du GET.
    Il faut donc les passer dans le body de la requête => ca va dépendre de la techno que tu utilise pour faire la requête.
    Typiquement en web , on fait un formulaire pour passer des paramètres POST.

    En PHP pur ca peut se faire comme ça :

    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
    $postdata = http_build_query(
        array(
            'user' => 'a@b.Com',
            'pass' => 'qsddfgdfh'
        )
    );
     
    $opts = array('http' =>
        array(
            'method'  => 'POST',
            'header'  => 'Content-type: application/x-www-form-urlencoded',
            'content' => $postdata
        )
    );
     
    $context  = stream_context_create($opts);
     
    $result = file_get_contents('http://monapi.com/api', false, $context);
    Le mot de passe est crypté en sha1 : ce n'est pas suffisant ?
    C'est hashé en sha pas chiffré (et encore moins crypté ) Et non ça ne sert à rien puisque dans l'état, la donnée transite en clair sur le réseau.

    Il suffit donc d'intercepter une requête pour savoir quel mot de passe rejouer , Même pas besoin de connaitre sa vraie valeur, suffit de rejouer son hash pour avoir accès à l'API.

    Tu peux aller lire cet article qui aborde de manière clair comment sécuriser une api.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2015
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup, je vais creuser tout ça.

Discussions similaires

  1. Ghostcript API Java ne fonctionne pas
    Par jmmaugis dans le forum Langage
    Réponses: 0
    Dernier message: 19/11/2014, 13h56
  2. Google API : infowindow ne fonctionne pas
    Par diving-seller dans le forum APIs Google
    Réponses: 1
    Dernier message: 25/06/2010, 10h01
  3. [WD12] opacité ne fonctionne pas sur un poste ?
    Par chapeau_melon dans le forum WinDev
    Réponses: 3
    Dernier message: 11/07/2008, 12h02

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