2009-08-13 17 views
4

私は問題#2の原因を発見しました。 session_register(foo)の使用です。PHPのセッションでログインシステムを設定するには

私はhandle_registration.phpに以下を入れました。

session_register("foo"); 
session_register("foo2"); 

$foo2 = $_POST['email']; 
$foo['email'] = $_POST['email'] 

セッションクッキーに変数が格納されていないので、問題は解決しません。


これは私のlogin scriptのロジックです。

Pascal MartinThe Disintegratorが解決しよう
  1. ログインのためのセッションを生成する際に機能session_write_closeを置くための適切な場所ですか?
  2. ユーザー "セッション"の永続セッションを取得して、index.phpが読み込まれるたびに新しいセッションが開始されないようにするにはどうすればよいですか?

index.phpの冒頭にsession_start()があります。セッションコードの非常に最初の後、私は右の持っている私のindex.php

<?php 
session_write_close();  // Session code ends here! 
?> 

の非常に終わりながら、

私のindex.phpの冒頭

session_start();  
if($_SESSION['logged_in'] == false) { 
    $random_number = rand(1,100000);              
    session_id($random_number); 
    session_id['email'] = ''; 
} 

検証ユーザのパスワードの処理by

$dbconn = pg_connect("host=localhost port=5432 dbname=masi user=masi password=123"); 
$result = pg_prepare($dbconn, "query22", "SELECT passhash_md5 FROM users 
     WHERE email=$1;"); 

$passhash_md5 = pg_execute($dbconn, "query22", array($_REQUEST['email']));  
// users from registration/login form 
if ($passhash_md5 == md5($_REQUEST['password'])) { 
    $_SESSION['logged_in'] = true; 
    $_SESSION['email'] = $_REQUEST['email']; 
    $_SESSION['passhash_md5'] = md5($_REQUEST['password']); 
} 

// this may be unnecessary if the passhash_md5 cannot be changed by the user 
$passhash_md5_2 = pg_execute($dbconn, "query22", array($_SESSION['email'])); 
// users staying in the site 
if ($passhash_md5_2 == $_SESSION['passhash_md5'])) { 
    $_SESSION['logged_in'] = true; 
} 

このコードは、ユーザーのデータがユーザーのために保存されないように、連続的にランダムなセッションを生成します。 $_REQUESTは、$_REQUESTには$ _SESSIONが含まれていないため、ログイン/登録ハンドラの後に$_SESSIONを置き換えました。同じ問題があり、登録/ログイン後にホームページにユーザ名が表示されません。

答えて

2

あなたのコードは次のようになります。

       -- content cut -- 
</html> 
<?php 
session_regenerate_id(true);    // Session code ends here! 
session_write_close(); 
?> 

session_regenerate_idが呼び出される前に、あなたは間違いなく(実際にあなたのページの全体の内容、)いくつかの出力を持っています。したがってエラーです。

問題は「空白行」またはスペースではありません。出力です。 HTMLがsession_startへの呼び出しのような出力 ;-)

で何がブラウザに送信される前に、session_regenerate_idへの呼び出しは、スクリプトの先頭で行うべきです。
ここでは、あなたのindex.phpの「トップ」のブロックにあります。


EDIT:その他の考え。

BTW?実際にsession_write_closeに電話する必要があるかどうかはわかりません。私はおそらくその機能を使ったことがない、私はドキュメントを引用し、...信じて:

スクリプトが せずに終了した後、セッションデータが通常保存されている(session_write_closeを呼び出す必要があります)

セッションデータは 同時書き込み一つだけのスクリプトかもしれを防ぐためにロックされています:

のみの場合は、あなた自身があなたが長い計算を行っている場合は、この関数を呼び出す必要があるかもしれませんはいつでもセッションで操作できます。フレーム番号 とフレームセット を同時に使用すると、このロックのために1つずつ のフレームがロードされます。 は、セッション のすべての変更が完了するとすぐに、セッションを終了して としてフレームをすべてロードするのに必要な時間を短縮できます。

これはスクリプトの最後にこれを呼び出すので、これはあなたのケースではないようです。

だから、あなたは...その機能に(?役に立たない)コールを削除


そして、およそsession_regenerate_idを試みることができる:あなたは本当に各ページに、この関数を呼び出す必要がありますか?

あなたのサイトが動作するのに十分であるとは決して言わないと思います...ユーザがログインしたときにそれを呼び出すことができたとしても、セキュリティに関する予防措置のために(私が正しく覚えていれば、

と同じ約session_id、btw:実際にこの機能を各ページで呼び出す必要がありますか?

+0

最初の問題を解決していただきありがとうございます! –

+0

あなたは歓迎です:-)私はいくつかの考えで私の答えを編集しました。多分彼らはあまりにも助けるでしょう... –

+0

2番目の更新の説明をありがとう! - 改善のためのあなたの提案を実装しました。サイトは、引き続きユーザーのデータが次のページに転送されないように、セッションIDを生成し続けます。 –

3

あなたは、通常の出力が行われたら、あなたはヘッダを送信することはできません。この

<?php 
ob_start(); 
everything here 
ob_end_flush(); 
?> 

を防ぐために、出力バッファリングを使用する必要があります。

+0

PHPの優れた習慣は、ファイルの最後に<?phpタグを埋め込まないことです。これにより、偶発的な出力がそのように生成されるのを防ぎます。 表示されている実際のエラーメッセージは、ヘッダーが既に送信されているためです。すでにヘッダーを書き出した後に、新しいcookieをヘッダーに送信することはできません(session_idを変更するため)。 – TheJacobTaylor

+0

これは、あなたのphpファイルの最後にsession_regenerate_idを使用するのはちょっとミスリーディングだと言われています。 – TheJacobTaylor

+3

おそらくそれはOCDですが、私はタグを閉めさせられません。私は助けが必要ですか? –

1

session_regenerate_id - あなたはそれをあなたがしている方法を使用している場合は、新しく生成された1

は、あなたが何度も新しいセッションを生成することになると、現在のセッションIDを更新します。

session_id - あなたは乱数を使用して新しいセッションを毎回設定されている

を取得および/または現在のセッションIDを設定します。

実際には、セッションを使用する必要があるのは、スクリプトの先頭にsession_start()ステートメントを置くことだけです。

+0

改善のための提案を実装しました。私のサイトは、引き続きユーザーのデータが次のページに転送されないようにセッションIDを再生成します。 –

+0

私はあなたのコメントを見たことがありません。それでも問題はありますか? –

関連する問題