7
votes

Yii2 Curl Bad Demande (# 400)

Tout en essayant d'utiliser CURL avec la méthode postale de Yii 2, je reçois un code d'erreur 400. XXX PRE>

Ceci est mon code, où j'instécie la classe CurlTool: P>

<?php

namespace common\components;

class CurlTool {

    public static $userAgents = array(
        'FireFox3' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9) Gecko/2008052906 Firefox/3.0',
        'GoogleBot' => 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)',
        'IE7' => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
        'Netscape' => 'Mozilla/4.8 [en] (Windows NT 6.0; U)',
        'Opera' => 'Opera/9.25 (Windows NT 6.0; U; en)'
    );
    public static $options = array(
        CURLOPT_USERAGENT => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
        CURLOPT_AUTOREFERER => true,
        CURLOPT_FOLLOWLOCATION => false,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FRESH_CONNECT => true,
        CURLOPT_COOKIEJAR => "cookies.txt",
        CURLOPT_COOKIEFILE => "cookies.txt",
        CURLOPT_SSL_VERIFYPEER => false,
            //CURLOPT_COOKIESESSION => false,
    );
    private static $proxyServers = array();
    private static $proxyCount = 0;
    private static $currentProxyIndex = 0;
    public static $getinfo;

    public static function addProxyServer($url) {
        self::$proxyServers[] = $url;
        ++self::$proxyCount;
    }

    public static function fetchContent($url, $fields = null, $verbose = false) {
        //print '*'.$fields.'*';
        if (($curl = curl_init($url)) == false) {
            throw new Exception("curl_init error for url $url.");
        }
        if (self::$proxyCount > 0) {
            $proxy = self::$proxyServers[self::$currentProxyIndex++ % self::$proxyCount];
            curl_setopt($curl, CURLOPT_PROXY, $proxy);
            if ($verbose === true) {
                echo "Reading $url [Proxy: $proxy] ... ";
            }
        } else if ($verbose === true) {
            echo "Reading $url ... ";
        }
        //$verbose=TRUE;
        //print_r($fields);
//        debug_print_backtrace();
//url-ify the data for the POST
        $fields_string = '';
        if (is_array($fields))
            foreach ($fields as $key => $value) {
                if (empty($key))
                    continue;
                $fields_string .= $key . '=' . urlencode($value) . '&';
                if ($verbose === true) {
                    echo $key . ": " . $value;
                }
            }
        rtrim($fields_string, '&');

        if (count($fields) > 0) {
            curl_setopt($curl, CURLOPT_POST, count($fields));
            curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string);
        }

        if ($verbose === true) {
            echo "Fields string $fields_string ... ";
        }

        curl_setopt_array($curl, self::$options);

        $content = curl_exec($curl);
        self::$getinfo = curl_getinfo($curl);
        if ($content === false) {
            throw new Exception("curl_exec error for url $url " . curl_error($curl));
        }

        curl_close($curl);
        if ($verbose === true) {
            echo "Done.\n";
        }
        $content = preg_replace('#\n+#', ' ', $content);
        $content = preg_replace('#\s+#', ' ', $content);

        return $content;
    }

}


1 commentaires

Vous devez afficher la valeur CSRF à la demande postale. Suite peut être utile Stackoverflow.com/Questtions/23679332/...


3 Réponses :


15
votes
class Controller extends \yii\base\Controller
{
    /**
     * @var boolean whether to enable CSRF validation for the actions in this controller.
     * CSRF validation is enabled only when both this property and [[Request::enableCsrfValidation]] are true.
     */
    public $enableCsrfValidation = false; <- set this to false

...
be careful, i just found out that if this setting is used within the action itself, it might fail;it might fail within beforeaction;

0 commentaires

0
votes

Y a-t-il une autre façon de le réparer? Peut-être générer un nouveau jeton CSRF et l'envoyer dans les données postales?


0 commentaires

4
votes

Vous pouvez désactiver le CSRF dans Beforeaction xxx


0 commentaires