2011-06-28 35 views
5

私は前に同様の質問を投稿しましたが、本当に私を助けた答えは得られなかったので、もう一度やり直したいと思っています。免責条項として、私は、ここの情報の多くは完璧なコーディング慣行に従わないことを知っていますが、それは運動目的のみです。何百万ものものを試しましたが、何が起こっているのかわからないので、何も動いていないようです。私は必然的にいくつかの(何か!)助けを必要とするので、もしあなたが何かを提供できるならば、事前に感謝する!PHPのクッキーとセッション変数とIPアドレス

いくつかの基本的なCookieとセッションを使用してユーザー固有のデータを生成する単純なフォーム/ページを作成しようとしています。私が理解できないいくつかの問題に出くわすまで、私はうまく動いていた。私の最初のページでは、ユーザーが使用しているブラウザの名前がほしいということを除いて、すべてが有効です。 (例えば、私は単純なタイトル:ブラウザーの長いバージョンの代わりにFirefoxを望む)これは可能だと思うので、これを行うのが見えました、私はちょうどそれをやる方法を知らない!

IPアドレス、ブラウザ情報、現在の日付/時刻(2ページに表示したい)をセッション変数として保存する方法が正確にはわからないので、ここで本当に問題が発生します。私が見つけたいくつかのことを試しましたが、私はそれを正しくやっているとは思わない。

私はまた、ユーザー名とパスワードを2つの別々のクッキーとして保存しようと努力していました...提案?最後に、出力バッファリングを使用して(form_data.phpを呼び出すために使用される)ロケーションヘッダを持つためには何をする必要がありますか?

(私が間違ったことをしたことを考えれば、これは役に立ちます!LOL)これは私のコードを完全に取り除いたものです。たくさんの情報を持っていなくても私のクリーンなバージョンを投稿しようとしているので、自分が何をしようとしているのかを簡単に見ることができます。

メインファイルのコードは:

$browserinfo = get_browser($_SERVER['HTTP_USER_AGENT']); 
$browsername = $browserinfo['browser']; 

あなたのセッションとクッキーストレージは動作しません:

<?php 
header('Location: form_data.php'); 


setcookie('username', $_POST['username']); 
setcookie('password', $_POST['password']); 
//I know this isn't working. 
//honestly I just left this in here as to show where I had been 
//trying to save the cookie data. Pretty obvious how bad my 
//trial and error with this went! 

} 
?> 


<?php 

$_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
echo " By the way, your IP address is: </b>".$_SESSION['ip']."<br />"; 
echo " You already know this, but the browser you are currently using 
to view this page is:<br/>"; //What is the correct function that I should be using here? 
echo "<form action=\"form_data.php\" method=\"post\">"; 
echo "username:<input type=\"text\" name=\"username\" size=\"20\" value=\"\"><br/>"; 
echo "password:<input type=\"password\" name=\"password\" size=\"20\" value=\"\"><br/>"; 
echo "<input type=\"submit\" value=\"Submit, please\" />"; 
echo "<br /><input type=\"hidden\" name=\"submitted\" value=\"true\" />"; 
?> 

form_data.php

<?php 

    echo "Hello, ".$username;//I'm trying to get the cookie data for the username 
    echo "Your password is ".$password; //Samething here (want cookie data) 
    echo "The date and time you entered this form is: ".date("F j, Y")." -- ".date("g:i a"); 
    echo "<br/>Your IP:".$_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
    echo "<br/>Your broswer:".;//I want full broswer data here...dont know how to do it. 
    //Overall, was this the way to get the session variables for IP, date/time and browser? 
    echo "Thank you for filling out this form!"; 
    ?> 
+5

Cookieにユーザー名とパスワードを保存しないでください。代わりに、Cookieにランダムな文字列を格納して、データベースの値をCookie値と照合して後で戻すことができるようにし、すべてのページ読み込み時にその値を再生成します。 –

+1

'setcookie'はこれまで使わないでください。 '$ _SESSION'を使うだけで、サーバ上のセッションに関連するすべてのデータを維持することができます。クライアントが必要とする唯一のクッキーはセッションクッキーであり、これを明示的に処理する必要はありません。 –

+0

@Kerrek SB Cookieは、重要ではない情報をサーバーのセッションの存続期間を超えて保持するのにも役立ちます。彼らは '$ _SESSION'とは異なる目的を果たします。 –

答えて

5

ブラウザを取得するには、get_browser()機能を使用しますあなたはseを試行する前にheader("Location");コールを発信しているためですtクッキー。クッキーを設定したりセッションを確立する前に出力を送信することはできません。

スクリーンに出力する前に、session_start()と呼び出してください。コメント

// attach to your session (or create if it doesn't exist) 
// You must call session_start() on every page where you intend to access or set session vars 
// and it must be called before any output (including whitespace at the top) 
session_start(); 

// Store some stuff... 
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 

// Store user info in session, not cookie 
$_SESSION['username'] = $_POST['username']; 

// Set a cookie 
// Not a super secure token, but better than user/pass in cookies. 
// Point here is just to show that it must be done before any output or before the redirection header. 
$_SESSION['token'] = sha1(time() . rand() . $_SERVER['SERVER_NAME']); 
setcookie('token', $_SESSION['token']); 
// In practice, you'd want to store this token in a database with the username so it's persistent. 

// Now do the redirection: 
// Supposed to be an absolute URL by the HTTP spec 
header("Location: http://example.com/form_data.php"); 

// exit right after the redirection to prevent further processing. 
exit(); 

補遺あなたが作業中、PHPは、画面上のすべてのエラーを表示することを確認してください。コードが公開されている公開サーバーに移動するときは、必ずdisplay_errorsをオフにしてください。

// On the page that sets it... 
setcookie('somename', 'somevalue', expiry, domain); 

// On the page that retrieves it... 
echo $_COOKIE['somename']; 
+0

うわー。ありがとう! ...あなたのコードを見ることは私には圧倒的ですが、実際に私が行っているように実際に勉強しようとしています。だから、最初のオリジナルのコードを完全に取り除く必要があるのですか?または、あなたが提示した要素をファイルに追加する必要がありますか?私が自分のコードのいくつかを試して組み合わせると、問題が発生し、すべてがうまく動作しなくなることがわかります:( – clk

+0

@clk自分のコードを自分のものに組み込みましょう。重要なのは 'session_start()'を呼び出すことです。各ページの上部にある '$ _SESSION'を使ってそこに格納されているものにアクセスできます。作業中に' display_errors'(上記参照)を有効にして、何が失敗したのか、理由を確認することができます。 –

4
> I'm trying to create a simple form/
> page that uses some basic cookie and 
> session stuff to produce some 
> user-specific data. 

セッションは、(カバーの下cookiesを使用しない:あなたが行う方法を知りませんでしたあなたの質問に言ったように

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

は、クッキーから値を取得するには、 $_COOKIEスーパーグローバルを使いますクッキー内に session_idを格納してください/ set_cookie)セッションが使用されている間にクッキーが情報を漏洩する可能性があるので、セッションのみを使用するようにアドバイスします。サーバーのファイルシステム/データベース、または session_set_save_handlerを上書きするときに好きなものを入力します。 Michael同様


> On my first page everything is good 
> except for I just want the NAME of the 
> browser the user is using. 

あなたはそのためのget_browser使用することができます言った: browscap.iniに ブラウザ情報を調べることにより、ユーザのブラウザの機能 を決定する

試みをファイル。 PHPのページのように

はそれを決定しようとすると、それは間違っている可能性がありますので、あなたがませは(あなたが好きな場合は、システムをだますことができる)、重要な何のためにこの情報に依存すべきであると言います。私が意味することは、何かを検証/証明するためにそれを使用すべきではないということです。 retrieve the IP address


> My real problems come up right about 
> here, because I’m not exactly sure how 
> to store the IP address, browser info 
> and the current date/time (which I 
> want shown on page 2) as session 
> variables. 

詳しい情報はここで読むことができます(プロキシサーバは、多分あなたは少し誤解だろうか?)。その情報を保存するには、セッションを使用するすべてのページ(何かを出力する前に)の上に最初にsession_start()を発行してください(ページを少し遅くするすべてのページでクッキーを設定しないもののみ) $_SESSION['time'] = date(DATE_RFC822);の行に沿って何かを行うことによって、セッション変数内の現在の時刻を返します。時間の取得の詳細については、date()ページを参照してください。あなたのようなものを使用してこの情報を取得することができpage 2に続いて

<?php 

session_start(); 

$_SESSION['ip'] = getRealIpAddr(); # no php function => See http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html 
$_SESSION['time'] = date(DATE_RFC822); 

だから page 1上のコードは次のようになります

<?php 

session_start(); 

echo $_SESSION['ip']; // retrieve IP 

> I also worked endlessly on trying to 
> store the username and passwords as 
> two separate cookies 
> each...suggestions? 

クッキーの内側にそれらを保管しないでください(のみ使用set_cookieを使用し、情報を格納するためにセッションを使用しないでください)。しかし、セッションはsession fixationにも脆弱ですので、セッション内で重要なものを保存した後には、regenerate session idを出力してください/を漏れを防ぐためブラウザ/ユーザに表示しないでください。


> Finally, what do I need to do to have 
> a location header (used to call 
> form_data.php) with output buffering? 

マイケルは、あなたがその

<?php 
header("Location: http://www.example.com/"); /* Redirect browser */ 

/* Make sure that code below does not get executed when we redirect. */ 
exit; 
?> 

PS後にスクリプトを終了するheader機能とexitを使用する必要があります言ったように:クレジットカード(使用ペイパルか何か)のような任意の実際の機密情報を保存することはありません数字やその他のものを自分のデータベースに入れてください。私はあなたのデータベースの中にパスワードを保存しないように助言しますが、例えばopenId(Google's)のようなものを使用して、セキュリティを強化するための認証を処理してください。

+0

'getRealIpAddr();'に関するあなたのリンクのコメントで述べたように、HTTP_CLIENT_IPまたはHTTP_X_FORWARDED_FORを偽装するのは簡単なので、 '$ _SERVER ['REMOTE_ADDR']'はより安全です。どのような変更に対しても再認証を強制できます。 –