2006年7月 8日

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

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

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

>seto様
register_globalsのご指摘、有難う御座いました。

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


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


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


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


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

$result = mysql_query($sql); ←この行にて
   Access denied for user: 'ODBC@xxxxx' (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
といったエラーが出てしまいます。


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

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

function authform(){
echo <<


ユーザ名

パスワード



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
>Subject: [PHP-users 29657] Re: sessionを使った認証フォームに関して
>To: PHP-users ML
>Message-ID: <6AC6A1DAC2E7F8seto@xxxxx>
>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
>Subject: [PHP-users 29658] Re: sessionを使った認証フォームに関して
>To: PHP-users ML
>Message-ID: <44AE89AF.1050006@xxxxx>
>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
>Subject: [PHP-users 29659] Re: sessionを使った認証フォームに関して
>To: PHP-users ML
>Message-ID: <20060708011021.AB1A.GOUNX2@xxxxx>
>Content-Type: text/plain; charset="ISO-2022-JP"
>
>こんにちは。
>
> > 以上、PHPを触り始めて間もない初心者の質問にて、このような媒体での質問に
恐縮
> > いたしておりますが、ここ数日、以上の内容を印刷し、日夜持ち歩いてはいるの
です
> > が・・解決できそうで出来ない。と、見えない壁に突き当たった感覚から質問さ
せて
> > 頂きました。お忙しい中恐縮ですが、何処が可笑しいのか、ご教授頂けたら幸い

> > す。
>
>私の勝手な意見ですが、、、
>正直なところ、貼り付けられているソースが長すぎて・・・
>見る気持ちになりませんでした(汗
>(丸投げして「これを解決してください。」と見えます・・・)
>
>
>印刷したものを持ち歩いてにらめっこしても解決にはなかなか
>たどり着かないと思いますが。。。
>
># ある程度経験があって、エラーの原因がなんとなくでも推測
># できるようになっているのであれば、にらめっこは有効な解決
># 手段の一つですが。
>
>泥臭いし手間もかかりますが、echo とか、print とか使って
>変数に自分が思ったとおりの値が入ってきているか?とか、
>1行1行の動きを追えるようになれば、かなり解決に近づけますよ。
>
>たとえ問題解決できなくても、数行の小さいプログラムで
>問題の現象を再現できるようになると思います。
>
>そうなれば、漠然とした質問ではなく、要領を得た
>質問ができると思います。
>
>動かすことだけが目的なら、丸投げするのが楽なのでしょうが、
>問題解決能力を磨きたいなら、アプローチの仕方をもう少し
>考えた方が良いとおもいます。
>
>最後に、問題の解決には何ら関係ない文章となり失礼しました<(_ _)>
>
>--
>goungoun
>http://goungoun.dip.jp/app/
>
>
>
>------------------------------
>
>Message: 9
>Date: Sat, 8 Jul 2006 01:43:23 +0900
>From: "Atsushi Kojo"
>Subject: [PHP-users 29660] Re: sessionを使った認証フォームに関して
>To: "PHP-users ML"
>Message-ID: <002b01c6a1e4$76687350$040ba8c0@xxxxx>
>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"
>Subject: [PHP-users 29661] Re: sessionを使った認証フォームに関して
>To: "PHP-users ML"
>Message-ID: <013101c6a239$9e16ae80$8b0fa3db@xxxxx>
>Content-Type: text/plain; charset="iso-2022-jp"
>
>山下です。
>
>こんなんでどうでしょう。
>色々と私好みに直している部分がありますが・・・
>
>まず、MySQL側(ユーザー名をユニークに)
>ALTER TABLE `usr_tb` ADD UNIQUE `username` (`username`)
>
>auth.inc.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;
> exit;
>}
>?>
>
>
>みなさんのご指摘通りに、他にも色々と調べてみてはどうでしょう。
>
>--
>山下
>
>
>
>------------------------------
>
>_______________________________________________
>PHP-users mailing list
>PHP-users@xxxxx
>http://ns1.php.gr.jp/mailman/listinfo/php-users
>PHP初心者のためのページ - 質問する前にはこちらをお読みください
>http://www.php.gr.jp/php/novice.php3
>
>
>以上: PHP-users まとめ読み, 41 巻, 8 号
>***************************************


_______________________________________________
PHP-users mailing list PHP-users@xxxxx
http://ns1.php.gr.jp/mailman/listinfo/php-users
PHP初心者のためのページ - 質問する前にはこちらをお読みください
http://www.php.gr.jp/php/novice.php3

投稿者 xml-rpc : 2006年7月 8日 22:40
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/39197
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。