2016-10-06 1 views
1

コードからの標準的なhttp要求とhtml形式の送信要求との間に違いがあるのでしょうか。もちろん、ユーザーエージェントなどの明白なことはありません。コードのHTTP要求とWebブラウザの違い

ページにリクエストを送信したい場合、ページでセッション変数が作成されます。現在、私はHTTPリクエストを生成しているPHPスクリプトを持っています(私はcurlを試しました& file_get_contentsをstream_context_createを使って)ページに戻し、応答を取り戻しました。この同じPHPページには、全く同じリクエストを生成するためにajaxを使用するいくつかのjavascriptもあります。

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がJSせずに要求を作成すると

PHPスクリプトはPHP 5.4

+1

主な違いはブラウザが内部的に管理するセッションクッキーですが、あなたはcURLで自分自身を管理する必要があります – charlietfl

+0

あなたはセッションクッキーを保存していないので、毎回あなたのスクリプトが新しい/異なるセッションになるようにリクエストします。 –

+0

私はどのようにデフォルトセッションクッキーを定義しますか?ログインセッションデータを作成して、一度に複数のサイトにログインできるようにしたい。コードリクエストでは、標準のブラウザベースのセッション内でセッションを作成する必要がありますが、これは可能ですか? –

答えて

1

はい、実際には多くの違いがあります。

コードでリクエストしているページは、人間がウェブブラウザで閲覧できるように構築されている可能性が高いため、主にさまざまな技術があります。

あなたのPHPスクリプトはJavaScriptを処理できません(つまり、5秒後にブラウザのページに移動し、<div></div>がリモートサーバーから値を取得してDOMに書き込まれますあなたがヘッドレスブラウザを使用しない限り、スクリプトはこれを取得しません。PhantomJSなど。

PHPがJSなしでリクエストを作成すると、セッションが作成されてレスポンスに返されますが、新しいページにアクセスすると、セッションが終了しました。

PHPコードでは、そのWebページへの次回の訪問(現在の設定で)のCookieは保存されません。 cURLは、以前のリクエストからCookieを送信するためにcookiejar optionCURLOPT_COOKIESESSIONCURLOPT_COOKIEJAR)をサポートしています。

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を参照してください。

+0

デフォルトセッションクッキーを使用する方法はありますか?私は、異なる言語を使用して複数のサイトにユーザーを記録する方法として、このコードを導入したいと考えています。こうすることで、彼らはPHPサイトに一度ログインすることができ、aspサイトや必要な他のサイトにもログインします。これを行うには、デフォルトのクッキー内でセッションを作成する必要があります –

+0

あなたは他のサイトを管理していますか?その場合は、[SSO](https://en.wikipedia.org/wiki/Single_sign-on)と[CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/)を参照してください。 Access_control_CORS)。あなた自身のクッキーを送る場合は、 'curl_setopt($ ch、CURLOPT_COOKIE、[...]);'オプションを使います。 –

+0

私はそれらをコントロールしていますが、これは機能がある方がいいです。私はそれがファイルへのHTTPリクエストを作成する速いケースだと思って、それはセッションを構築するでしょう。リモートスクリプトからこのCookieにアクセスできない場合は、別の日にこれを保存する必要があります。提供されている2つのリンクは、将来私にとって非常に貴重です。ありがとうございました! –

0

使用IIS8サーバー上で実行され、セッションが作成され、応答で返されますが、、セッションは終了しました。

PHPがリクエストを作成すると、セッションはブラウザに保存されません。

いくつかの.jsを使用して、あなたのブラウザにPHPSESSIDのクッキーをセッションIDで設定してみることもできます。 (これはおそらくセキュリティ問題であり、完全には機能しないかもしれませんが)。

+0

私はこのために.jsを使いたくない。私はちょうどそれが働いていることを示すためにそれを使用しました。私は機密データを渡す必要があり、私はこのデータをjavascriptで使用するためにhtmlの本文に入れる必要はありません。私は排他的にコードを使用してセッションを作成する必要があり、クライアント側のロジックはありません –

+0

私は、サーバーで生成されたセッションがブラウザでどのように見えるかを確認する手段としてjsを使用できると言っています。純粋に/ dev /教育目的のテストのため。 –

関連する問題