我需要此网站的http Post

时间:2019-06-23 18:53:44

标签: laravel curl guzzlehttp

我有很多天无法为以下站点发出http发布请求

http://www.imei.sy/imei

我不知道其背后的原理。我试图使用GuzzleHttp发出请求,然后卷曲。

 $curl = curl_init();

    curl_setopt_array($curl, array(
      CURLOPT_URL => "http://www.imei.sy/imei",
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "UTF-8",
      CURLOPT_MAXREDIRS => 20,
      CURLOPT_TIMEOUT => 60,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "POST",
      CURLOPT_POSTFIELDS => array("_token:evsLRDom2AShHsioY5OyEB7cDU45opx8J0VLgqd2",//TgghCi5gkU6HODTyDwAWq0mvEyHC3ys8dXGskta1",
      "imei:000000000000000"),
      CURLOPT_HTTPHEADER => array(
        "cache-control: no-cache",
        "content-type: application/x-www-form-urlencoded",
        "postman-token: 6a987964-86b8-25db-71a5-7c47822ec59c"
      ),
    ));

    $response = curl_exec($curl);
    $err = curl_error($curl);

    curl_close($curl);

    if ($err) {
      echo "cURL Error #:" . $err;
    } else {
      echo $response;
    }

1 个答案:

答案 0 :(得分:0)

我无法重现该问题,当我运行您提供的代码时,它将执行以下POST请求:

POST /imei HTTP/1.1
Host: www.imei.sy
Accept: */*
Accept-Encoding: UTF-8
cache-control: no-cache
postman-token: 6a987964-86b8-25db-71a5-7c47822ec59c
Content-Length: 295
Content-Type: application/x-www-form-urlencoded; boundary=------------------------4b99e3fabc390822

--------------------------4b99e3fabc390822
Content-Disposition: attachment; name="0"

_token:evsLRDom2AShHsioY5OyEB7cDU45opx8J0VLgqd2
--------------------------4b99e3fabc390822
Content-Disposition: attachment; name="1"

imei:000000000000000
--------------------------4b99e3fabc390822--

这绝对是multipart/form-data格式的POST请求。 (甚至Content-Type标头都错误地声称它为application/x-www-form-urlencoded格式,这使得服务器无法正确解析它。.但是它仍然是一个POST请求,只是一个格式严重的错误。)

但是请注意,该代码绝对不会检查任何IMEI代码,因为在检查代码之前,您必须先获得一个cookie和一个CSRF令牌,否则如果没有cookie,该令牌将无法工作,并且该cookie将无法工作没有令牌,但是每个cookie的令牌都会更改,并且您不能对其进行硬编码,但这正是您的代码正在尝试做的事情,

您的代码无法使用,因为:

  • 它从不创建cookie会话(需要检查IMEI)
  • 它尝试对CSRF令牌进行硬编码,而不是获取动态令牌。 (CSRF令牌与cookie会话绑定。。您的代码从不首先创建。)

..要在此处检查IMEI,首先必须启用curl的cookie处理,这可以使用CURLOPT_COOKIEFILE完成,而且UTF-8也不是有效的传输编码,也没有任何意义,而是: / p>

curl_setopt_array($ch,array(
// emptystring COOKIEFILE tells curl enable cookie-handling and save cookies in-ram
    CURLOPT_COOKIEFILE=>'',
// emptystring encoding tells curl to automatically handle compression with all built-in compression algorithms (usually "gzip" and "deflate"), it makes compressible transfers faster
    CURLOPT_ENCODING=>'',
    CURLOPT_RETURNTRANSFER=>1,
));

接下来,您必须使用正常的GET请求来获取页面,这将为curl提供检查IMEI所需的cookie,并为curl提供检查imei所需的CSRF令牌,

curl_setopt_array($ch,array(
    CURLOPT_URL=>'http://www.imei.sy/imei',
    CURLOPT_HTTPGET=>1
));
$html=curl_exec($ch);
if(empty($html)){
    try{
        throw new \RuntimeException("curl_exec() failed! ".curl_errno($ch).": ".curl_error($ch) );
    }finally{
        curl_close($ch);
    }
}

在获得cookie(由curl自动处理)和HTML中的CSRF令牌之后,您需要从HTML中提取令牌,这可以使用DOMDocument和DOMXPath完成,

$domd=@DOMDocument::loadHTML($html);
$xp=new DOMXPath($domd);
$token=$xp->query("//input[@name='_token']")->item(0)->getAttribute("value");

最后,既然您已经拥有会话cookie和CSRF令牌,则可以执行IMEI查找请求,

curl_setopt_array($ch,array(
    CURLOPT_POST=>1,
    CURLOPT_POSTFIELDS=>http_build_query(array(
        '_token'=>$token,
        'imei'=>'999999999999999'
    ))
));
$html=curl_exec($ch);
if(empty($html)){
    try{
        throw new \RuntimeException("curl_exec() failed! ".curl_errno($ch).": ".curl_error($ch) );
    }finally{
        curl_close($ch);
    }
}
curl_close($ch);

要获取HTML的响应,可以再次使用DOMDocument,

$message=(@DOMDocument::loadHTML($html))->getElementById("sts")->textContent;
var_dump($message);

产生:

$ php wtf2.php
string(100) " مُعرف الجهاز المُدخل غير صالح، الرجاء التحقق من الرقم "

因为999999999999999不是有效的IMEI码。