当我发送 POST 请求时被禁止 403

Posted

技术标签:

【中文标题】当我发送 POST 请求时被禁止 403【英文标题】:403 Forbidden when I send POST request 【发布时间】:2019-09-03 23:02:36 【问题描述】:

晚上好,我想通过 twitter 使用 cURL 连接到 https://accounts.nintendo.com/ 站点,所以我首先在任天堂站点连接页面上发出 GET 请求以获取 csrf_token,然后向任天堂的操作 url 发出 POST 请求网站表单,以便通过 twitter 进行连接。

通常,当一切顺利时,应答请求应将我发回:302 找到然后通过 twitter 连接我的 oAuth 链接。

我尝试修改 userAgent 和 Header

<?php
include('simple_html_dom.php');

// SHOW THE PAGE TO GET CSRF TOKEN
$ch = curl_init();

$url = 'https://accounts.nintendo.com/login';



curl_setopt_array($ch,
  array(
     CURLOPT_URL => $url,

     CURLOPT_CAINFO => dirname(__FILE__)."/cacert.pem",
     CURLOPT_COOKIESESSION => false,
     CURLOPT_USERAGENT => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36",
     CURLOPT_HTTPHEADER => array(
       'Host: accounts.nintendo.com',
       'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
       'Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3',
       'Pragma: ',

       'Connection: keep-alive',

     ),
     CURLINFO_HEADER_OUT => true,
     CURLOPT_COOKIEFILE => dirname(__FILE__) . "/cookies.txt",
     CURLOPT_COOKIEJAR => dirname(__FILE__) . "/cookies.txt",
     CURLOPT_FRESH_CONNECT => false,


    // The data to transfer with the response.

    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_RETURNTRANSFER => true,


  )
);


$data = curl_exec($ch);


// PARSER THE TOKEN CSRF
$dom = new simple_html_dom();

$html = $dom->load($data);


foreach($html->find('li[class="LoginForm_snsButton LoginForm_snsButton-row LoginForm_snsButton-twitter"] input[name="csrf_token"]') as $element)

  $csrf_token = $element->value.'<br/>';



curl_close($ch);

//SEND POST REQUEST

$ch2 = curl_init();

$url = 'https://accounts.nintendo.com/federation/twitter';


$postData = array(

  "post_federation_redirect_uri" => "https://accounts.nintendo.com/",
  "post_federation_reauthenticate" => "",
  "redirect_after" => "5",
  "csrf_token" => $csrf_token,
  "display" => ""
);
curl_setopt_array($ch2,
  array(
     CURLOPT_URL => $url,

     CURLOPT_CAINFO => dirname(__FILE__)."/cacert.pem",
     CURLOPT_COOKIESESSION => false,
     CURLOPT_USERAGENT => "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0",


     CURLOPT_COOKIEFILE => dirname(__FILE__) . "/cookies.txt",
     CURLOPT_COOKIEJAR => dirname(__FILE__) . "/cookies.txt",
     CURLOPT_FRESH_CONNECT => false,
     CURLOPT_CUSTOMREQUEST => 'POST',
     CURLOPT_POSTFIELDS => http_build_query($postData),
     CURLINFO_HEADER_OUT => true,
    // The data to transfer with the response.
    CURLOPT_HEADER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_RETURNTRANSFER => true,


  )
);

$exec = curl_exec($ch2);
$header = curl_getinfo($ch2);
echo $header['request_header'].'</br></br></br>';

echo $header['header_size'];

echo $exec;
curl_close($ch2);


?>

问题是我得到了一个不错的 403 Forbidden(我不知道是不是因为我从 localhost 发出请求),这是一个显示请求标头、响应标头和站点响应内容的屏幕:http://www.noelshack.com/2019-15-6-1555110358-screenshot-1.jpg

【问题讨论】:

根据您的屏幕截图和任天堂登录页面,您需要通过 Google reCAPCTHA 检查,但您没有通过。结果,任天堂似乎抛出了 403。 【参考方案1】:

simple_html_dom.php 和脚本的 chmod 权限 是什么?

如果您没有授予 644 权限,请尝试以下操作:

$chmod 644 YourScript.phpchmod 两个文件

并且,在第二种情况下,在您的 Web 浏览器上重新加载您的脚本并等待 错误 403 并查看您的日志文件。

如果您使用 Apache2,请查看 /var/log/apache2/error.log 否则或者如果你使用 Nginx 进入 /var/log/nginx/error.log

把你的结果告诉我,这样我可以更好地帮助你。 ;)

【讨论】:

403 Forbidden 错误来自远程主机,在这种情况下是任天堂。更改脚本的文件权限无济于事。 loukandreys 的解决方案不起作用(另外,chmod 权限也不是问题)。另外,我尝试更改 HTTP REFERER 但它没有改变:/ 哦,很抱歉,我没有看到截图。 @johannes 是对的,问题似乎与 Google 的 ReCaptcha 有关。对不起,不好的方式 @Errorj404 看看我对您最初问题的评论。我认为您不太可能通过 reCAPCTHA,因为您的行为是任天堂希望通过使用 reCAPCTHA 来防止的行为。 +1 @Johannes .. 首先,Errorj404 你在错误的论坛上.. 其次,如果你问这个问题,你还远远没有结束.. 你显然没有技能。

以上是关于当我发送 POST 请求时被禁止 403的主要内容,如果未能解决你的问题,请参考以下文章

Cordova POST - 请求禁止 403。未到达 Dispatcher Servlet

当我尝试 POST 到 Azure 函数时被禁止

Cordova android 应用程序 - POST 请求返回“禁止访问”错误

vue跨域请求时报403

Cakephp 3.4 AJAX 请求抛出 403 禁止错误

Django 在发送 POST 请求时返回 403 错误