スレッド表示 | フラット表示〕 全トピック 920 件中 250 番目 次≫ ≪前

正しく条件分岐されない?

created: 2006-04-26 13:34 | modified: 2006-04-28 00:14 | reply: 6

[3048] 正しく条件分岐されない?

user: DR | created: 2006-04-26 13:34
現在以下のようなコードでセッション処理を行っているのですが、
正しく条件分岐がされないという現象が起こっており、
なにがなにやらわかりません。

<?php
// セッション開始
session_start();

// セッションのチェック
$session_status = session_check();

// ログアウトモードの場合
if($session_status[0] && $mode == "logout") {
logout();
$session_status[0] = false;
$session_status[1] = "正常にログアウト処理が完了しました。\n";
}
// ログインモードの場合
elseif(!$session_status[0] && $mode == "login") {
if($_POST['password'] == PASSWORD) {
// ログイン成功
$_SESSION['ip_address'] = $_SERVER['REMOTE_ADDR'];
header("Location: $_SERVER[SCRIPT_NAME]?mode=page");
exit();
}
// ログイン失敗
else $session_status[1] = "ログインに失敗しました。<br>パスワードをもう一度ご確認下さい。\n";
}

if($session_status[0]) {
?ログイン後の処理?
}
else {
?ログイン失敗時の処理?
}

// サブルーチン

function session_check() {
if(!$_SESSION['ip_address']) {
// セッション変数にIPアドレスが存在しない
logout(); // ■問題の箇所
return array(false,"不正なアクセスです。<br>正しくログインをしてください。\n");
}
elseif($_SESSION['ip_address'] != $_SERVER['REMOTE_ADDR']) {
// セッション変数のIPと現在のIPが違う
logout(); // ■問題の箇所
return array(false,"ユーザー認証に失敗しました。<br>申し訳ありませんが、再度ログインしてください。\n");
}
else return array(true,"");
}

function logout() {
$_SESSION = array();
if(isset($_COOKIE[session_name()])) setcookie(session_name(),'',time()-42000,'/');
session_destroy();
}

上記のコードで■問題の箇所と記してある行です。
セッションを開始後に呼んでいるセッションチェックの関数内で、
指定したセッション変数が存在しない場合にログアウト処理をかけているんですが、
この場合、セッション変数が正しく格納されている場合にもログアウト処理が入ってしまい、
ログインができなくなってしまっています。

上記の■問題の箇所となっている行をコメントアウトすると、
正しくログイン処理が動くのですが、上記コードでは何か問題があるのでしょうか?

宜しくお願い致します。
reply: 3049 返信 編集 削除

[3049] Re.正しく条件分岐されない?

user: ach | created: 2006-04-26 16:00
このコードの動作を要約すると

1.$_SESSION['ip_address']が空ならログアウトする
2.$_SESSION['ip_address']が接続相手と一致しないときはログアウトする
3.$_SESSION['ip_address']はログインしてから書き込まれる

初回アクセス時には$_SESSIONは空なので、必ず1に引っかかり、ログインできません。
セッションはサーバー側に保存されるので、$_SESSION['ip_address']が空になるのは
バグがなければ初回アクセス時だけです。
1のチェックは不要のはず。
Parent: 3048  reply: 3051 返信 編集 削除

[3051] Re.正しく条件分岐されない?

user: DR | created: 2006-04-26 16:20
えーと、

elseif(!$session_status[0] && $mode == "login") {
if($_POST['password'] == PASSWORD) {
// ログイン成功
$_SESSION['ip_address'] = $_SERVER['REMOTE_ADDR'];
header("Location: $_SERVER[SCRIPT_NAME]?mode=page");
exit();
}

セッションチェックは失敗していますが、
ログインを行った場合はアドレスに?mode=loginが付加されるため、
$modeに"login"が格納されます。

そのため上記の部分で判定はTRUEになり、
$_SESSIONに対してIPアドレスが書き込まれるようにしてあります。
書き込んだ後、自分自身にリダイレクトしてログイン後の動作を行うようにしてあります。

このリダイレクト後に$_SESSIONを調べてるんですが、
どうもそこの判定が上手く動作していないようなのです。


function session_check() {
if(!$_SESSION['ip_address']) {
// セッション変数にIPアドレスが存在しない
logout(); // ■問題の箇所
return array(false,"不正なアクセスです。<br>正しくログインをしてください。\n");
}
elseif($_SESSION['ip_address'] != $_SERVER['REMOTE_ADDR']) {
// セッション変数のIPと現在のIPが違う
logout(); // ■問題の箇所
return array(false,"ユーザー認証に失敗しました。<br>申し訳ありませんが、再度ログインしてください。\n");
}
else return array(true,"");
}

■問題の箇所 の所です。
リダイレクト後には$_SESSIONにはipアドレスが格納されていて、
上記の構文ではログアウト処理は行われないはずなのですが、
どうしてもここでログアウト処理を通ってしまうようで、
正常にログイン後の動作が行われません。

logout();をコメントアウトすると何故か正常に動作をします。

>>セッションが空になるのは初回だけ
確かにそうですね、この部分はいらないようです。
ありがとうございました。
Parent: 3049  reply: 3052 返信 編集 削除

[3052] もしかしたら・・

user: DR | created: 2006-04-26 16:30
書き込んだ後に気づいたんですが、自分のコードではログインしていない場合、
必ずログアウト処理を通るようになっていますが、
それが問題なのでしょうか…?

ログアウト処理ではsession_destory()をしてsession_cookieを削除していますが、

(初回アクセス時)
1.セッションスタート
2.いきなりログアウト(セッション破壊)

という流れのために、ログインした後のコードで
$_SESSIONに対してデータを格納しようとしても、
格納できていなかったということなんですかね…?

調べてみたのですが確信が持てません。
よろしければアドバイスをお願い致します。
Parent: 3051  reply: 3053 返信 編集 削除

[3053] Re.もしかしたら・・

user: ach | created: 2006-04-26 20:07
そういう意図で書いたつもりでしたが……
でも“いらない”という書き方は不適切でした。

極論をすると
function session_check() {
return (count($_SESSION)==0) || (@$_SESSION['ip_address'] == $_SERVER['REMOTE_ADDR']);
}
だけで十分じゃないでしょうか。

拡張性を考えるならビット演算を使うなど、session_checkから大量に情報が返せるよう工夫したほうがいいですが。
Parent: 3052  reply: 3054 返信 編集 削除

[3054] Re.Re.もしかしたら・・

user: DR | created: 2006-04-26 21:33
ありがとうございました。
読解力が足りなかったようで申し訳なかったです。
1つまた勉強になりました。

ご足労ついでで大変申し訳ないのですが、

> 拡張性を考えるならビット演算を使うなど、session_checkから大量に情報が返せるよう工夫したほうがいいですが。

具体的にはどのように拡張できるのでしょうか?
ちょっと調べてみたのですが、参考になりそうな物がありませんでした。
よろしければ後学のためにサンプル等教えていただけませんか?
Parent: 3053  reply: 3055 返信 編集 削除

[3055] そんなたいそうな話では……

user: ach | created: 2006-04-28 00:14
いわゆるフラグ処理です。
確かにphpではあまりお目にかかりませんね。何ででしょう。

フラグ処理はフラグが増えてもif?を追加するだけで対処できることが多いとか、
定数を使うとコードが見やすいとかまあそのぐらいの話です。


http://www1.kcn.ne.jp/~robe/cpphtml/html01/cpp01049.html
C++ですが参考にしてみてください。
メリットもリンク先に書いてる感じです。
Parent: 3054  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 250 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑