【问题标题】:Difference Between HTTP request in code vs web browser代码中的 HTTP 请求与 Web 浏览器之间的区别
【发布时间】:2017-02-15 11:05:59
【问题描述】:

我想知道来自代码的标准 http 请求与通过提交 html 表单发送的请求之间有什么区别。当然会有明显的东西,比如用户代理等等。

我想向一个页面发送一个请求,该页面将创建一个会话变量。目前我有一个 PHP 脚本正在生成一个 HTTP 请求(我已经尝试使用 stream_context_create 的 curl 和 file_get_contents)到一个页面并拉回响应。这个相同的 PHP 页面也有一些 javascript 将使用 ajax 来生成完全相同的请求。

当 PHP 在没有 JS 的情况下创建请求时,会创建会话并在响应中返回,但是当我访问新页面时,会话已死。当我自己使用 ajax 时,请求会返回会话数据,而当我访问其他页面时,会话仍然存在。注意:我还尝试使用 html 表单并发布到 url,这也可以使会话保持活动状态。

我不知道为什么会这样。我唯一的想法是它可能是由 php 请求和 ajax 请求的默认值之间的一些差异引起的。

请求页面内容

session_start();
$_SESSION['message'] = "Works";
var_dump($_SESSION);

PHP脚本内容

<?php 
session_start();
var_dump($_SESSION);
error_reporting(E_ALL|E_STRICT);

$username = "test";
$password = "test";

$url = "https://website.com/test.php"; 
$postinfo = "username=".$username."&password=".$password;
// $ch = curl_init($url);
// curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo);
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
// curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,  2);
// $result = curl_exec($ch);
// curl_close($ch);
$data = array('username' => $username, 'password' => $password);

$options = array(
    'http' => array(
        'method'  => 'POST',
        'content' => http_build_query($data)
    )
);
$context  = stream_context_create($options);
$result = file_get_contents($url, false, $context);
var_dump($result);

?>

<?php echo time();?>
<form action="<?php echo $url;?>" method="post">
    <input type="text" name="username"><br>
    <input type="text" name="password"><br>
    <input type="submit" value="submit">
</form>

<script   src="https://code.jquery.com/jquery-3.1.1.min.js"   integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="   crossorigin="anonymous"></script>
<script>
$( document ).ready(function() {
    $.ajax({
        type: "POST",
        url: "<?php echo $url;?>",
        data: { username: '<?php echo $username;?>', password: '<?php echo $password;?>' },
        success: function (content) {
            alert(content);
            console.log("Request Response = " + content);
        },
        fail: function (message) {
            alert("Failure - " + message);
            editmemberform.dialog('close');
        }
    });
});
</script>

当我运行脚本时,我从 php 请求中得到的响应是

string(49) "array(1) { ["message"]=> string(5) "Works" } " 

对我来说,这表明会话是在会话数据被转储时创建的。 ajax 请求然后发出请求并且响应是完全相同的。这是写入控制台的内容。

Request Response = array(1) {
  ["message"]=>
  string(5) "Works"
}

我不明白为什么 2 个相同的请求会这样。我还尝试从 ASP.NET 脚本执行发布请求,并且我遇到了同样的问题。浏览器生成的请求与代码请求肯定有一些不同。

注意:我已经尝试过使用 http 和 https。我从来没有收到任何错误。响应总是正确的。

php 脚本在使用 PHP 5.4 的 IIS8 服务器上运行

【问题讨论】:

  • 主要区别在于浏览器内部管理的会话 cookie,但您需要使用 cURL 管理自己
  • 您没有保存会话 cookie,因此您的脚本发出的每个请求都将是一个新的/不同的会话。
  • 如何定义默认会话 cookie?我希望能够创建登录会话数据,以便用户可以一次登录多个站点。代码请求需要在基于标准浏览器的会话中进行会话,这可能吗?

标签: php jquery ajax session server


【解决方案1】:

当PHP创建没有JS的请求时,会话被创建并在响应中返回,但是当我访问一个新页面时,会话已经死了。

当 PHP 创建请求时,会话不会持续到您的浏览器。

您可以尝试使用一些 .js 在您的浏览器上设置一个 PHPSESSID cookie,并将会话 ID 设置为通过您的 PHP 脚本创建的会话 ID,以便您自己查看! (虽然这可能是一个安全问题,可能无法完美运行。)

【讨论】:

  • 我不想为此使用 .js。我只是用它来证明它正在工作。我需要传递敏感数据,我不乐意将这些数据放在 html 的正文中以便 javascript 使用它。我需要使用代码专门创建会话,没有客户端逻辑
  • 我只是想说你可以使用 js 来查看服务器生成的会话在浏览器中的样子。纯粹用于测试/开发/教育目的。
【解决方案2】:

是的,实际上会有很多不同。

由于您通过代码请求的页面很可能是为人类在网络浏览器中浏览而构建的,因此它将具有各种技术 - 主要是 cookie 和 javascript。

您的 PHP 脚本将无法处理 JavaScript(即:假设您在浏览器中登陆页面 5 秒后,&lt;div&gt;&lt;/div&gt; 将写入 DOM,其中包含从远程服务器获取的值 - 您的PHP 脚本不会得到这个),除非您使用无头浏览器 - 例如PhantomJS

当PHP创建没有JS的请求时,会话被创建并在响应中返回,但是当我访问一个新页面时,会话已经死了。

您的 PHP 代码不会为下次访问该网页(在当前设置下)存储 cookie。 cURL 支持一个 cookiejar option (CURLOPT_COOKIESESSION, CURLOPT_COOKIEJAR) 从之前的请求中发送 cookie。

curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); 
curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/cookie.txt"); 
curl_setopt($ch, CURLOPT_COOKIESESSION, true);

请参阅this comment on the manual 了解更多信息。

【讨论】:

  • 有没有办法让它使用默认会话cookie?我想将此代码部署为使用不同语言将用户登录到多个站点的一种方式。这样他们就可以在 php 站点上登录一次,也可以登录到 asp 站点和任何其他需要的站点。为此,我需要在默认 cookie 中创建会话
  • 您是否在控制其他网站?如果是这样,请查看SSOCORS。如果您想发送自己的 cookie,请使用 curl_setopt($ch, CURLOPT_COOKIE, [...]); 选项。
  • 我可以控制它们,但这更像是一个不错的功能。我认为这将是向文件发出 http 请求的快速案例,它将建立会话。如果我无法从远程脚本访问此 cookie,我将不得不再保存一天。不过,提供的 2 个链接将来对我来说非常有价值。谢谢!
猜你喜欢
  • 2014-01-17
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 2021-10-08
  • 2013-02-09
  • 2016-04-22
相关资源
最近更新 更多