web-dev-qa-db-fra.com

PHP CURL & HTTPS

J'ai trouvé cette fonction qui effectue un travail IMPRESSIONNANT (IMHO): http://nadeausoftware.com/articles/2007/06/php_tip_how_get_web_page_using_curl

/**
 * Get a web file (HTML, XHTML, XML, image, etc.) from a URL.  Return an
 * array containing the HTTP server response header fields and content.
 */
function get_web_page( $url )
{
    $options = array(
        CURLOPT_RETURNTRANSFER => true,     // return web page
        CURLOPT_HEADER         => false,    // don't return headers
        CURLOPT_FOLLOWLOCATION => true,     // follow redirects
        CURLOPT_ENCODING       => "",       // handle all encodings
        CURLOPT_USERAGENT      => "spider", // who am i
        CURLOPT_AUTOREFERER    => true,     // set referer on redirect
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
        CURLOPT_TIMEOUT        => 120,      // timeout on response
        CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
    );

    $ch      = curl_init( $url );
    curl_setopt_array( $ch, $options );
    $content = curl_exec( $ch );
    $err     = curl_errno( $ch );
    $errmsg  = curl_error( $ch );
    $header  = curl_getinfo( $ch );
    curl_close( $ch );

    $header['errno']   = $err;
    $header['errmsg']  = $errmsg;
    $header['content'] = $content;
    return $header;
}

Le seul problème que j'ai, c'est que cela ne fonctionne pas pour https: //. Toutes les idées que je dois faire pour que cela fonctionne avec https? Merci!

59

Solution rapide, ajoutez ceci dans vos options:

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false)

À présent, vous ne savez pas à quel hôte vous vous connectez, car cURL ne vérifiera pas le certificat. J'espère que vous apprécierez attaques de type homme au milie !

Ou ajoutez-le simplement à votre fonction actuelle:

/**
 * Get a web file (HTML, XHTML, XML, image, etc.) from a URL.  Return an
 * array containing the HTTP server response header fields and content.
 */
function get_web_page( $url )
{
    $options = array(
        CURLOPT_RETURNTRANSFER => true,     // return web page
        CURLOPT_HEADER         => false,    // don't return headers
        CURLOPT_FOLLOWLOCATION => true,     // follow redirects
        CURLOPT_ENCODING       => "",       // handle all encodings
        CURLOPT_USERAGENT      => "spider", // who am i
        CURLOPT_AUTOREFERER    => true,     // set referer on redirect
        CURLOPT_CONNECTTIMEOUT => 120,      // timeout on connect
        CURLOPT_TIMEOUT        => 120,      // timeout on response
        CURLOPT_MAXREDIRS      => 10,       // stop after 10 redirects
        CURLOPT_SSL_VERIFYPEER => false     // Disabled SSL Cert checks
    );

    $ch      = curl_init( $url );
    curl_setopt_array( $ch, $options );
    $content = curl_exec( $ch );
    $err     = curl_errno( $ch );
    $errmsg  = curl_error( $ch );
    $header  = curl_getinfo( $ch );
    curl_close( $ch );

    $header['errno']   = $err;
    $header['errmsg']  = $errmsg;
    $header['content'] = $content;
    return $header;
}
97
SystemX17

J'essayais d'utiliser CURL pour faire des appels d'API https avec php et j'ai rencontré ce problème. J'ai remarqué une recommandation sur le site php qui m'a permis de démarrer: http://php.net/manual/en/function.curl-setopt.php#110457

S'il vous plaît, arrêtez de définir CURLOPT_SSL_VERIFYPEER sur false ou 0. Si votre PHP installation ne dispose pas d'un ensemble de certificats racine d'autorité de certification, téléchargez celui sur le site Web curl et enregistrez-le sur votre serveur:

http://curl.haxx.se/docs/caextract.html

Puis définissez un chemin d’accès dans votre fichier php.ini, par exemple. sous Windows:

curl.cainfo = c:\php\cacert.pem

Désactiver CURLOPT_SSL_VERIFYPEER permet des attaques de type homme au milieu (MITM), ce que vous ne voulez pas!

33
Gavin Palmer

Une autre option, comme Gavin Palmer, consiste à utiliser le .pem fichier mais avec une option curl

  1. télécharger la dernière mise à jour .pem fichier de https://curl.haxx.se/docs/caextract.html et enregistrez-le quelque part sur votre serveur (en dehors du dossier public)

  2. définissez l'option dans votre code à la place du php.ini fichier.

Dans votre code

curl_setopt($ch, CURLOPT_CAINFO, $_SERVER['DOCUMENT_ROOT'] .  "/../cacert-2017-09-20.pem");

NOTE: définir le cainfo dans le php.ini comme @Gavin Palmer a fait mieux que de le définir dans votre code comme je l’ai fait, car il enregistre un disque IO chaque fois que la fonction est appelée, je le fais simplement comme ceci au cas où vous voulez tester le fichier cainfo à la volée au lieu de changer le fichier php.ini lors du test de votre fonction.

3
Accountant م