[PHP-users 29665] Re: sessionを使った認証フォームに関して

chappuru21 chappuru21 chappuru21 @ hotmail.com
2006年 7月 8日 (土) 22:40:08 JST


こんばんは。昨日投函させて頂いた野口と申します。
自己紹介が遅れて申し訳ありません。

まず初めに、今回、こちらのMLに投函させて頂いたのは初めてですが、皆様の暖かい
アドバイスに感謝いたします。有難う御座いました。

>seto様
register_globalsのご指摘、有難う御座いました。
その後、マニュアルに目を通しましたが、何やらセキュリティーに問題があるとかで
・・。
初心者で分からない事だらけですが、バージョンの件も含め、こうしたアドバイスは
大変嬉しく思います。有難う御座いました。


>さわだ様
手順を追っての説明を有難う御座います。初心者の私にとって、こうしたチャートは
有難く思います。
尚、皆様のアドバイスを基に、さわだ様からご指摘を踏まえスクリプトを記述したと
ころ、入力データを受渡し、フォームを抜け出る事が出来ましたが、未だ上手く行か
ずにおります。下記にてスクリプトを記載いたします。


>goungoun様
ご指摘有難う御座います。決して丸投げのつもりはなかったのですが、関連するスク
リプトを全て記載した方が伝わりやすいかな?と思っての判断でした。今後気をつけ
たいと思いますので、また目に留まるようなことが御座いましたらご指摘頂ければと
思います。


>古城様
貴重なご意見ありがとう御座います。デバックの必要性は感じてはいたものの、その
スキルがありませんでした。
お教えいただいたサイトも参考にし、今後に結び付けたく思います。有難う御座いま
した。


>山下様
貴重なスクリプトのご提示をありがとう御座います。
現在、投函時に記載したコードと平行しながら確認をしておりますが、

$result = mysql_query($sql); ←この行にて
   Access denied for user: 'ODBC @ localhost' (Using password: NO) 
   A link to the server could not be established
$rows = mysql_num_rows($result); ←この行にて
   supplied argument is not a valid MySQL result resource in 
といったエラーが出てしまいます。


ちなみに、現在私が記載した方のコードは、下記のようになっているのです。
コメントとして現状を説明しております。

<?php
require_once("dbconn.inc.php");
session_start();//セッション開く

function authform(){
echo <<<EOC
	<form action="$PHP_SELF" method="post">
	ユーザ名 <input type="text" name="username"><br />
	パスワード <input type="password" name="password"><br />
	<input type="submit" name="send" value="送る">
	</form>
EOC;
exit;
}

$username = $_POST['username'];
$password = $_POST['password'];

if(!isset($_SESSION['username']) && $username == "" && $password == ""){
		echo "認証が必要です。ユーザー名とパスワードを入力して下さい。";
		authform();
}
elseif($username == "" or $password == ""){
	echo "ユーザー名とパスワードを入力して下さい。";
	authform();
}
else{
	if($username <> "" && $password <> ""){
		$user = addslashes(trim($username));
		$passwd = addslashes(trim($password));
		$sql = "SELECT * FROM usr_tb WHERE like username='$user' 
passwd='$password'";
		//$sql = "SELECT * FROM usr_tb WHERE like username='$user'";
		$rows = $conn->getRow($sql,2);//ここを有効にすると、エラーは出ないものの間
違ったpassでも認証されてしまう。
		//$result = mysql_query($sql);//上記を無効にし、この2行を有効にすると、こ
の場所にエラー表示が出て、かつ間違ったpassでも認証されてしまう。
		//$rows = mysql_num_rows($result);

if($data[username] !== ""){
	$_SESSION[auth][username] = $rows[username];
	$_SESSION[auth][nick] = $rows[nick];
}else{
	echo "ユーザー名又はパスワードが違います";
	authform();
	exit;
		}
	}
}
?>

少しでも現状を伝えたいがゆえに、また長文になってしまいましたが、引き続きご指
導いただけたら幸いです。
お忙しいところ恐縮ですが、宜しくお願いいたします。







>------------------------------
>
>Message: 6
>Date: Sat, 08 Jul 2006 00:33:57 +0900
>From: Seto <seto @ 1kg.jp>
>Subject: [PHP-users 29657] Re: sessionを使った認証フォームに関して
>To: PHP-users ML <php-users @ php.gr.jp>
>Message-ID: <6AC6A1DAC2E7F8seto @ 1kg.jp>
>Content-Type: text/plain; charset=iso-2022-jp
>
> Setoです。
>
>register_globals がOffじゃないですか?
>そうならOffの時のコーディングが必要です。
> $_POST['username'] とか
>
>くれぐれもOnにしろという意味ではありません。
>この辺は検索すればたくさん情報があるはずです。
>
># サンプルコードはできるだけ短く簡潔にしましょう。
>
> >動作環境
>可能ならばバージョンアップしたほうが良いと思います。
>
>Junya Seto
>
>
>------------------------------
>
>Message: 7
>Date: Sat, 08 Jul 2006 01:19:59 +0900
>From: Shu Sawada <luna @ lunanet.gr.jp>
>Subject: [PHP-users 29658] Re: sessionを使った認証フォームに関して
>To: PHP-users ML <php-users @ php.gr.jp>
>Message-ID: <44AE89AF.1050006 @ lunanet.gr.jp>
>Content-Type: text/plain; charset=ISO-2022-JP
>
>
>さわだです。
>検証取っていない上にビール片手なので当たっている保証はないです。
>
>とりあえず、この順番っておかしくないですか?
>
> > if(!$_SESSION[username]){
> > echo "認証が必要です。ユーザー名とパスワードを入力して下さい。";
> > authform();
> > }
> > //ユーザ名とパスワードが送られてきた場合は認証
> > if($username <> "" && $passwd <> ""){
>
>いったいどのタイミングで$_SESSIONに値が代入されるのでしょう?
>
>	- formに入力
>	- formからPHPにPOSTで値が渡る
>	- セッションに値が無い
>		- formを表示
>
>を永遠に繰り返す気がします。
>
>	- formに入力
>	- PHPにPOSTで渡る
>	- セッションに値が無い
>		- ID/PWがPOSTされていない
>			- エラー(form表示)
>		- ID/PWがPOSTされてるなら、POSTされたものを検証
>			- OKならセッションにセット
>			- NGならエラー
>
>にしないといけなくないですか?
>
>あと、細かいところ。
>
>- マニュアルのこの部分を見て、
>
>http://jp.php.net/manual/ja/function.session-start.php
>
> > 注意:  クッキーに基づくセッションを使用している場合、ブラウザに何か出力
> > を行う前にsession_start()をコールする必要があります。
>
>何か思い当たる節はありませんか?
>(でもこれは直接の原因じゃないかも、出力バッファの設定とかも絡みますか)
>
>- session_start() って、2回呼ばれてませんか?
>
>- if(!$_SESSION[username]) って、大丈夫ですか?
> if( !isset($_SESSION['username']) ) とかじゃないですか?
> これだと、" Notice: Use of undefined constant username " みたいに言われな
いです?
> (これも設定なのかな)
>
>- 特に理由が無いなら、Register_globalsはOffにするべきだと思います。
>- Setoさんも仰ってますが、バージョン更新できるならした方が良いと思います。
>
>--
>Shu Sawada
>http://luna.lunanet.gr.jp/
>http://www.cycleof5th.com/
>
>
>------------------------------
>
>Message: 8
>Date: Sat, 08 Jul 2006 01:38:59 +0900
>From: goungoun <gounx2 @ gmail.com>
>Subject: [PHP-users 29659] Re: sessionを使った認証フォームに関して
>To: PHP-users ML <php-users @ php.gr.jp>
>Message-ID: <20060708011021.AB1A.GOUNX2 @ gmail.com>
>Content-Type: text/plain; charset="ISO-2022-JP"
>
>こんにちは。
>
> > 以上、PHPを触り始めて間もない初心者の質問にて、このような媒体での質問に
恐縮
> > いたしておりますが、ここ数日、以上の内容を印刷し、日夜持ち歩いてはいるの
です
> > が・・解決できそうで出来ない。と、見えない壁に突き当たった感覚から質問さ
せて
> > 頂きました。お忙しい中恐縮ですが、何処が可笑しいのか、ご教授頂けたら幸い
で
> > す。
>
>私の勝手な意見ですが、、、
>正直なところ、貼り付けられているソースが長すぎて・・・
>見る気持ちになりませんでした(汗
>(丸投げして「これを解決してください。」と見えます・・・)
>
>
>印刷したものを持ち歩いてにらめっこしても解決にはなかなか
>たどり着かないと思いますが。。。
>
># ある程度経験があって、エラーの原因がなんとなくでも推測
># できるようになっているのであれば、にらめっこは有効な解決
># 手段の一つですが。
>
>泥臭いし手間もかかりますが、echo とか、print とか使って
>変数に自分が思ったとおりの値が入ってきているか?とか、
>1行1行の動きを追えるようになれば、かなり解決に近づけますよ。
>
>たとえ問題解決できなくても、数行の小さいプログラムで
>問題の現象を再現できるようになると思います。
>
>そうなれば、漠然とした質問ではなく、要領を得た
>質問ができると思います。
>
>動かすことだけが目的なら、丸投げするのが楽なのでしょうが、
>問題解決能力を磨きたいなら、アプローチの仕方をもう少し
>考えた方が良いとおもいます。
>
>最後に、問題の解決には何ら関係ない文章となり失礼しました<(_ _)>
>
>--
>goungoun <gounx2 @ gmail.com>
>http://goungoun.dip.jp/app/
>
>
>
>------------------------------
>
>Message: 9
>Date: Sat, 8 Jul 2006 01:43:23 +0900
>From: "Atsushi Kojo" <a-kojo @ artsnet.jp>
>Subject: [PHP-users 29660] Re: sessionを使った認証フォームに関して
>To: "PHP-users ML" <php-users @ php.gr.jp>
>Message-ID: <002b01c6a1e4$76687350$040ba8c0 @ dt0>
>Content-Type: text/plain; format=flowed; charset="iso-2022-jp";
>	reply-type=original
>
>お世話になります。古城です。
>問題云々の前にデバッグ能力を身につけられるのが先決かと。
>どこまで正しく動いているのか、希望の変数に希望の値が入るのは
>(入っているのは)どの段階までなのか?
>そういった確認作業をすればご自身で解決できると思います。
>確認作業の仕方などは
>http://php.dori-mu.net/TIPS.html#debug
>とか見てみるといいかも。他にもそういうサイトあると思います。
>
>
>
>------------------------------
>
>Message: 10
>Date: Sat, 8 Jul 2006 11:52:57 +0900
>From: "Daisuke Yamashita" <yamashita @ ktk.gr.jp>
>Subject: [PHP-users 29661] Re: sessionを使った認証フォームに関して
>To: "PHP-users ML" <php-users @ php.gr.jp>
>Message-ID: <013101c6a239$9e16ae80$8b0fa3db @ yamashita>
>Content-Type: text/plain;	charset="iso-2022-jp"
>
>山下です。
>
>こんなんでどうでしょう。
>色々と私好みに直している部分がありますが・・・
>
>まず、MySQL側(ユーザー名をユニークに)
>ALTER TABLE `usr_tb` ADD UNIQUE `username` (`username`)
>
>auth.inc.php
><?php
>require_once("dbconn.inc.php");
>session_start();
>
>$username = $_POST['username'];
>$password = $_POST['password'];
>
>if ($username != "" || $password != "") {
>   $username = addslashes(trim($username));
>   $password = addslashes(trim($password));
>
>   $sql    = "SELECT * FROM usr_tb WHERE username = '$username'";
>   $result = mysql_query($sql);
>   $rows   = mysql_num_rows($result);
>
>   if ($rows == 1) {
>     $pass = mysql_result($result, 0, "passwd");
>     $nick = mysql_result($result, 0, "nick");
>
>     if ($pass == $password) {
>       $_SESSION['username'] = $username;
>       $_SESSION['nick']     = $nick;
>     } else {
>       $Err = "IDまたはパスワードに誤りがあります。";
>     }
>   } else {
>     $Err = "IDまたはパスワードに誤りがあります。";
>   }
>} else {
>   $Err = "認証が必要です。ユーザー名とパスワードを入力して下さい。";
>}
>
>// 未エラー、$_SESSION['username'] が未登録の場合
>if ($Err != "" && $_SESSION['username'] == "") {
>   authform($Err);
>}
>
>function authform($Err) {
>   echo $Err;
>   echo <<<EOC
><form method="post">
>ユーザ名 <input type="text" name="username"><br />
>パスワード <input type="password" name="password"><br />
><input type="submit" name="send" value="送る">
></form>
>EOC;
>   exit;
>}
>?>
>
>
>みなさんのご指摘通りに、他にも色々と調べてみてはどうでしょう。
>
>--
>山下 <yamashita @ ktk.gr.jp>
>
>
>
>------------------------------
>
>_______________________________________________
>PHP-users mailing list
>PHP-users @ php.gr.jp
>http://ns1.php.gr.jp/mailman/listinfo/php-users
>PHP初心者のためのページ - 質問する前にはこちらをお読みください
>http://www.php.gr.jp/php/novice.php3
>
>
>以上: PHP-users まとめ読み, 41 巻, 8 号
>***************************************




PHP-users メーリングリストの案内