• ベストアンサー

ユーザー名、パスで認証して、ユーザのマイページを開く方法

この教えてgooみたいに ユーザ名、パスワードで認証して そのそのユーザ名のページに飛んでいくと言うのを作りたいのですが どのようにしたらいいでしょうか? 携帯電話の利用も考慮に入れて作りたいと思っています。 *php + mysql の利用を予定しています。 いつも質問ばかりでスミマセン。。 宜しくお願いいたします。

  • PHP
  • 回答数9
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • hola1973
  • ベストアンサー率45% (5/11)
回答No.9

header("Location: http://" . $_SERVER["SERVER_NAME"] . dirname($_SERVER["REQUEST_URI"]) . "/list/111.php?" . SID); これではうまくいきませんか? 認証さえ通過すればうまくいけるような気がしますが・・・。 PHPみたいなインタプリタの言語のデバッグの方法としては、 header("Location: http://hoge.com/list/".$id.".php); とやってみて、少しずつ、発展していくとどの部分でエラーがでているのかわかりやすいです。 それより心配なのは、100人ユーザーがいたら100個も個別にPHPスクリプトを作る手間です。一つのスクリプトで、プログラム内で個別に表示する項目を変えたほうがいいと思いますが・・・

kiyomidesuyo
質問者

お礼

お礼が遅くなりました。。。 ようやく教えてもらったことを少しずつ理解しながら ようやく完成いたしました!! セッションのことが全く分かっていなかったので 教えていただいている事が全く分かりませんでした。 で、ひとつずつ解明していったら id を持ちまわることが出来て、セキュリティもきちんとクリアして いいものが出来ました。 本当に親切に教えていただいて ありがとうございました。

その他の回答 (8)

  • hola1973
  • ベストアンサー率45% (5/11)
回答No.8

Warning: mysql_num_rows(): Warning: mysql_fetch_array(): これらのエラーは、SQL文が間違っているときにでます。 これはデータベース構造とスクリプトを見せていただくしか方法はないですね。 >ヒントで頂いたように、各ページに認証ページを読み込むようにしていたらアクセスできないようなので、今回はそちらにしようかなと思います。 うまく動かないとのことですが、各ページでチェックしないとブックマーク対策はできませんので可能であれば行っておいたほうが無難でしょう。 あと、 >一番下にある(スミマセン、字数制限で書けそうに無いのでm(__)m)ように認証することは出来るので、認証の時に入れたID(数字で3桁)を 認証ごに出てくる画面に id.php と言うリンクが出来ないかなと思っています。 ここの部分の意味がよくわかりません。 認証後にここの部分で飛ばすことを言っているのかな? header("Location: http://" . $_SERVER["SERVER_NAME"] . dirname($_SERVER["REQUEST_URI"]) . "/list/111.php?" . SID); ひとつ疑問なのは、header&Locationであえて別のページに飛ばす必要があるのかどうか。認証後のphpが生成するページに <a href=http://".$_SERVER["SERVER_NAME"].dirname($_SERVER["REQUEST_URI"])."/list/111.php?".SID>あなたのページはこちら</a>"; とリンクタグを素直に書いてはだめですか? 月末までのオープン、がんばってください。

kiyomidesuyo
質問者

補足

スミマセン、知識が無い上に説明下手で。。。 ID PASS で認証してもらう時の ID で その方の専用のページを作りたいのです^^; なので、入力してもらったID が 100 なら ****/100.php と言う具合にです。 **login.php** ID PASS 入力 **login_check** チェックする で、とんだ先に 自分専用(****/100.php)のページのアドレスがある。 そこまで受け渡しする方法は無いでしょうか? スミマセン、もう一度だけ助けてください。 お願いいたします。 ***お勧め頂いた本、アマゾンにも新品は売ってませんでした。   当方の住む地方都市の大きな本屋さんにも在庫がありませんでした。     (明日、出向いて注文してみるつもりです)

  • hola1973
  • ベストアンサー率45% (5/11)
回答No.7

本を何冊も読んでいるとのことですが、参考URLの本はとてもオススメです。 おそらく質問者さんのやりたいことがそのまま記載されていると思います。 プログラム上達の近道は、本を読むよりも、自分のやりたいことのプログラムを人に書いてもらって、見て勉強したほうがいいと思います。

参考URL:
http://www.amazon.co.jp/exec/obidos/ASIN/4844314831/qid%3D1143442610/250-9264911-3634640
kiyomidesuyo
質問者

補足

どうしてもこのエラーが出ます。 Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in /virtual/wave/public_html/login-test/pass_check.php on line 22 Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /virtual/wave/public_html/login-test/pass_check.php on line 23 会員ではありません テーブル名 フィールド名など 気をつけてみましたが分かりません。 少し、敷居が高かったのかな? と思っています。。 早速、本を買いに行ってきます。 そこで、これだけ教えていただけませんか? 一番下にある(スミマセン、字数制限で書けそうに無いのでm(__)m)ように 認証することは出来るので、認証の時に入れたID(数字で3桁)を 認証ごに出てくる画面に id.php と言うリンクが出来ないかなと思っています。 ヒントで頂いたように、各ページに認証ページを読み込むようにしていたら アクセスできないようなので、今回はそちらにしようかなと思います。 勝手なことばかり言ってスミマセン、 月末までに作らないといけないので。。 (ただ、その後のこともありますので 再度ソースを勉強させて頂きます) どうか宜しくお願いいたします。

  • hola1973
  • ベストアンサー率45% (5/11)
回答No.6

pass_check.php なのですが、データベース情報は入れなくて良いのでしょうか? 必要です。書き忘れました。 あとIDとpassのチェックは pass_check.phpのelseif文の方でチェックしています。これもpass='$pass'を書き忘れていますね。すいません。 }elseif($id <> ""){//idとpassを入力してきた場合 $sql_check_id = "SELECT* FROM mem WHERE id='$id' AND pass='$pass' AND (from_date <= '$today' AND to_date >= '$today')"; }

  • hola1973
  • ベストアンサー率45% (5/11)
回答No.5

あと自分のPR文を編集できるようにするためには、SELECT文で抜き出したデータを入れてやればいいだけです。 pr.php htmlは省いてあります。 <?php //しつこいが必ず読み込む require_once('pass_check.php'); if($err == '1'){ //pass_check.phpで$err = 1だったら会員ではないので、はじく echo "会員ではありません"; }else{ echo "<FORM method=post action=pr_henko.php>"; echo "<TABLE BORDER=1>"; echo "<TR>" echo "<TD>ハンドルネーム</TD>"; echo "<TD><input type=text name=user_name value=$user_name_gloval></TD>"; echo "<TD>住所</TD>"; echo "<TD><input type=text name=adress value=$user_adress_gloval></TD>"; echo "</TR>"; echo "<TR>"; echo "<TD colspan=2><input type=submit value=登録></TD>"; echo "</TR>"; echo "</TABLE>"; echo "</FORM>"; } ?> pr_henko.php <?php //しつこいが必ず読み込む require_once('pass_check.php'); if($err == '1'){ //pass_check.phpで$err = 1だったら会員ではないので、はじく echo "会員ではありません"; }else{ if($user_name == "" OR $adress == ""){ echo "名前とアドレスは入力してください。"; }else{ //データベース関連のデータをインクルードします require_once("dbini.php"); //MySQLに接続します $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); //データベースを選択します $selectdb = mysql_select_db($DBNAME, $con); $sql_shusei = "UPDATE mem SET user_name='$user_name', user_adress='$adress' WHERE temp_id = '$temp_id_global'"; $result_shusei = mysql_query($sql_shusei); if(!$result_shusei){ echo "更新失敗"; }else{ echo "更新成功"; } } } ?> あと、memに住所など個人情報がある場合は、分けておいたほうがいいです。 理由は、SQLインジェクションにより、個人データを抜かれる可能性があるからです。 どのようなものかは http://www.atmarkit.co.jp/fsecurity/rensai/webhole02/webhole01.html こちらをご覧ください。

  • hola1973
  • ベストアンサー率45% (5/11)
回答No.4

私がやっている携帯電話着メロの商用サイトでの話です。 ユーザーが登録すると、http://hoge.com/login_check.php?temp_id=b9650f36684a1ecc4501c571e54d2807 のようにメールにログインURLやID、PASSを添付して送ります。 ちなみにtemp_id=の部分は、md5ハッシュ値で、ほとんど重複がないのでランダムID発行には便利です。 md5の説明:(http://www.php.net/manual/ja/function.md5.php) 携帯電話ではキーが打ちにくいので、ユーザーがいちいちIDとPASSを入力しなくてもよいというメリットがあります。 私はtemp_idを判断して、若しくは入力されたIDとPASSを見て判定しています。 やり方としては 1.login.phpはそのままでいいと思います。 2.login_check.php等全てのページに、認証チェック用のプログラム(pass_check.php)をインクルードします。 インクルード文を全てのページに書くことで、ブックマーク等は不可能になります。 インクルード用プログラム例: pass_check.php <?php //会員期間をチェックするために利用 $today = date("Y-m-d"); //エラー初期化 $err = 1; if($temp_id <> ""){//メールについたtemp_idで接続してきた場合 $sql_check_id = "SELECT * FROM mem WHERE temp_id = '$temp_id' AND (from_date <= '$today' AND to_date >= '$today')"; }elseif($id <> ""){//idとpassを入力してきた場合 $sql_check_id = "SELECT* FROM mem WHERE id='$id' AND (from_date <= '$today' AND to_date >= '$today')"; } $result_check_id = mysql_query($sql_check_id); $num_rows_check_id = mysql_num_rows($result_check_id); $row_check_id = mysql_fetch_array($result_check_id); if($num_rows_check_id > '0'){ $err = 0; //このようにすることで、どのプログラムにおいても,$user_name_globalと書くと表示されるようになる。 $user_name_global = $row_check_id[user_name]; $user_adress_global = $row_check_id[adress]; $user_temp_id_global = $temp_id; }else{ $err = 1; } ?> プログラム例:login_check.php htmlは省いてあります。 <? //ここで認証プログラムを読み込みます。 require_once('pass_check.php'); if($err == '1'){ //pass_check.phpで$err = 1だったら会員ではないので、はじく echo "会員ではありません"; }else{ echo "こんにちは、".$user_name_global."さん<BR><BR>"; echo "1.<a href=./bbs.php?temp_id=$user_temp_id_global>掲示板</a><BR>"; echo "2.<a href=./chat.php?temp_id=$user_temp_id_global>チャット</a><BR>"; echo "3.<a href=./pr.php?temp_id=$user_temp_id_global>PR文編集</a><BR>"; } ?> こんな感じでしょうか セキュリティ万全にするとこれだけでは足りませんので承知ください。

参考URL:
http://fixenmelody.com
kiyomidesuyo
質問者

補足

とてもご親切な回答ありがとうございます。 スミマセン、いくつか質問させてください。*多分超初歩的なことです。。 pass_check.php なのですが、データベース情報は入れなくて良いのでしょうか? 僕はおまじないのように必ず入れているのですが //データベース関連のデータをインクルードします require_once("dbini.php"); //MySQLに接続します $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); //データベースを選択します $selectdb = mysql_select_db($DBNAME, $con); それから、ID と PASS はどこでチェックしているのでしょうか? **私の場合はほとんどこちらだと思います。 お手数かけますが、宜しくお願いいたします。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

basic認証の延長でmysqlによる認証が可能です。 dbの方でカレントページなど保持しておけば、 それなりのユーザーページも運営できると おもいます。

参考URL:
http://tsuttayo.sytes.net/apache/access/db/
  • hola1973
  • ベストアンサー率45% (5/11)
回答No.2

先の方が答えている通り、設計次第です。 以下の条件により設計はかなり変わります。 1.IDとPASSはデータベースで管理するか、否か 2.ユーザー期間は管理するか、否か 3.認証を受けた後の全てのページでチェックするか、否か (ユーザー期間が切れた後はどの箇所にもブックマークをしていても入れない) 4.ユーザー名のページは一人一人それぞれ作るのか、それとも「kiyomidesuyoのページ」のような表示だけでいいのか。 (せっかくPHPを使うならそれぞれ作るようなことは避けた方が無難) その他色々あると思います。 また何を行いたいかによって感じも変わってくると思います。 簡単な認証でしたら、作成もしますのでよかったらどうぞ

kiyomidesuyo
質問者

補足

皆さんのご指摘通り、ちょっと甘えすぎていると思い 本を何冊も読むのですが、なかなか回答に行き着きません。 お言葉に甘えて、アドバイスをお願いします。 1 id pass は mysql で管理します。 2 携帯電話でも利用できるようにする(cookieの利用無し) 3 100名ほどの利用を考えています 4 認証を受けた後の全てのページでチェック 5 それぞれのユーザーが自分のPR分を編集できる 出来の悪い脳みそで一生懸命考えていますが。。 このテーブルだけ分けた方がいいのでしょうか? 現在は 'mem' と言うテーブルに id int(11) pass varchar(8) **他にもユーザー名や住所なども入って居ます。 お手数かけますが、宜しくご指導お願いいたします。

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 設計次第でいろいろあると思います。 それをココでどのように作るかは回答しきれないと思います。 手順としては、 ユーザ名とパスワードを受け取る ユーザ名とパスワードでレコードが取得する 取得できたらユーザのページを表示する 取得できない場合はエラーページなりを表示する ユーザのページでは認証されたユーザ名を使用して、必要な情報を取得し表示等を行う。 まずは、ログインのページと認証処理を行うスクリプトを作ってみてはいかがでしょうか。

kiyomidesuyo
質問者

補足

いつも回答ありがとうございます。 一つ一つやってみました。(SESSIONを利用) ユーザ名 パスワードで認証したら特定のページへ エラーはエラーを表示。 ここまでは出来るのですが、認証後に表示したページに 更新するページはこちらですとリンクを張りたいのですが どのようにリンクを張ればいいのか仕組みが見当付きません、 (そのまま更新ページに飛んでもかまいませんが) どうか、再度アドバイスをお願いいたします。 login.php <?php session_start(); $_SESSION['login'] = 0; ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>ユーザー認証</title> </head> <body> <p>ユーザー認証</p> <form action="login_check.php?<?=SID ?>" method="post"> <table> <tr> <td>ID: </td><td><input name="id" type="text"></td> </tr> <tr> <td>PASS: </td><td><input name="pass" type="password"></td> <tr> <td colspan="2" align="center"><input type="submit" value="送信"></td> </tr> </tr> </table> </form> </body></html> login_check.php <?php session_start(); //データベース関連のデータをインクルードします require_once("dbini.php"); //MySQLに接続します $con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD); //データベースを選択します $selectdb = mysql_select_db($DBNAME, $con); $sql = "select name from members where uid = '{$_POST['id']}' and password = '{$_POST['pass']}'"; $rs = mysql_query($sql); if (mysql_num_rows($rs) > 0) { $_SESSION['login'] = 1; header("HTTP/1.1 301 Moved Permanently"); header("Location: http://" . $_SERVER["SERVER_NAME"] . dirname($_SERVER["REQUEST_URI"]) . "/list/111.php?" . SID); exit; } mysql_close($con); ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>認証失敗</title> </head> <body> 認証に失敗しました。<br /> <a href="login.php?<?=SID ?>">戻る</a> </body> </html>

関連するQ&A

  • BASIC認証のユーザ名をそのまま引き継ぐには?

    Linux(Fedora10)でウェブサーバを作っています。 BASIC認証で、ユーザ名とパスワードを使って、ウェブサイトを閲覧する制限を設けています。 認証された後に、「(ユーザ名)さん、こんにちは!」のようなコメントを出したいのですが、 どのようにしたら、ユーザ名を引き継ぐことができるでしょうか? 尚、ウェブサイトのプログラムはPHPで書いています。

    • 締切済み
    • PHP
  • パスワード認証(Basic認証ではない方法)

    PHPを使って施設の訪問予約システムを作ろうと思っています。 まず最初のページにユーザー名とパスワードを入力する認証画面を 作ろうと思います。 その際、この認証に成功しても、施設の管理者側(複数名いる)、利用者それぞれ異なったページへ移動させたいのですがどのようにすればよいのでしょうか? データベースを使わずにやりたいのですが、PHP初心者のためよくわかりません。 またサンプルのあるサイトがあればぜひそのURLを教えてください。

    • 締切済み
    • PHP
  • ユーザー認証ダイアログをパスしたい。

    No.1236392で、質問しました者ですが、再度質問させて下さい。 ハード(ネットワークカメラ)へアクセスする際、ユーザー認証ダイアログが表示されます。 これは、クライアントがWebサーバーからコード401を受信するからです。 実現したい事は、ASPファイル内で、ASP(VBScript)を用いて、ユーザー名とパスワードをセットしておき、ユーザー認証ダイアログを通過(パス)させたい、つまり表示させたくないです。 具体的には、ASPファイルは、自分で作ったWebアプリケーションの一部で、Webアプリケーションにログイン認証を設けて、ここで1度認証を行っています。 つまり、認証に成功してアプリケーションを操作できるという仕組みにして、最初に認証したユーザ名、パスワードの情報を引き継いで、ネットワークカメラにアクセスする際、わざわざユーザー認証ダイアログを出さずとも(ここではWebアプリケーションの認証(ユーザ名・パスワード)と、ネットワークカメラへの認証(ユーザ名・パスワード)は同じ情報と仮定する)、ユーザー名、パスワード情報を知っているので、その情報を埋め込んで、ユーザー認証ダイアログを飛ばしたいという魂胆です。 OS:Windows2000Server→ゆくゆくはWindows2003Serverにします。 Webブラウザ:IE6 自分なりにも調べましたが、 ・WININET APIを使用したら可能。 ・InternetSetOption関数を用いてユーザー名、パスワードをセットする。 ・検索で、「利用者認証をパスするには」等の 情報で、出来るような事がインターネット上で書いてありましたが、上手く活用する事ができません。 なんとかWebブラウザで実現させたいので、皆さんの力を貸して下さい。

  • basic認証 ユーザ名・パスワードが保存されない

    IEにて、basic認証が必要なページで、ユーザ名とパスワードを入力し「パスワードを記憶する」にチェックを入れてログインすると通常なら、次回からはユーザ名・パスワードを入力しなくても良い状態になると思います。 しかし、先日新しいPCをセットアップしたときに同様の操作をしたのですが、再度IEを起動しbasic認証画面を出すとユーザ名・パスワードともクリアされていました。 いろいろ調べましたが結局原因がわからないままです。 何故このような症状が起こるのかご存知の方がいらっしゃいましたらご教授のほど宜しくお願いいたします。

  • 認証ページ(basic認証)のユーザー名の履歴を消したい

    再度失礼致します。 ユーザー名とパスワードの入力を求める認証ページ(basic認証?・添付ファイル参照)についての質問です。 ユーザー名の入力欄の右にある下三角を押すと今まで入力したことがある文字の履歴が表示されてしまいます。 どうにかしてその履歴を消すということはできないでしょうか? インターネットオプションの項目にある オートコンプリートやインターネット一時ファイル、クッキー、 履歴、フォームデータ、パスワード など私の考えが及ぶ範囲で 全て削除してみたのですが、認証ページのユーザー名の履歴には 依然残っています。 どうやら検索エンジンのフォームなどの文字入力の記憶方法と 認証ページのユーザー名の文字入力の記憶方法は違うようなのです。。 そのユーザー名の履歴にある文字は本当に一年前ぐらいに一回 入力しただけでそれ以来一度も入力していないのですが なぜか長い間生き残ってしまっているんです。。 どうにか削除したくお力を貸して頂けないでしょうか? 回答お待ちしています。

  • LinuxOSのユーザ・パスワードを元にPHPで認証を行うには?

    LinuxOSのユーザ・パスワードを元にPHPで認証を行うには? 曖昧なタイトルで申し訳ありません. 環境は以下の通りです. CentOS5.4 Apache 2.2 PHP 5 MySQL5 現在,LinuxOSに存在するユーザ毎にウェブベースのコントロールパネルを設けたいため,ユーザ認証を掛けたいと思っているのですが,どのような方法で認証を実装すれば,LinuxOSで使用されている/etc/passwdと/etc/shadowを元にした認証が可能なのか分からず,質問させていただきました. 流れとしては以下の通りです. ユーザ名・パスワードを入力 → ユーザが存在しなかったりパスワードが違えば認証拒否 ↓ Linuxにユーザが存在していて,且つシステムパスワードと一致すれば承認. この認証はPAM認証(?)で可能でしょうか? また,そうであれば,PHPからPAM認証を行うには,どのような環境整備が必要でしょうか? 参考サイトでもかまいませんので,ご教授いただけると幸いです. よろしくお願いします.

    • ベストアンサー
    • PHP
  • IIS でのユーザー認証について あれっ?

    LANで内部に Webページを公開したいと思います。 IIS でユーザー認証をさせたいので、 「インターネットサービスマネージャ」を使って、 しかるべき設定を行い、そのページに対し、特定ユーザー のみアクセス権を与えました。 その後、対象となるページを読み込むと、ユーザー認証の ダイアログが出てきて、ユーザー名、パスワードの入力が 求められます。 ここまではいいのです!! さらに、その下に、ドメイン名の入力を求められます。 これは何とかならんか(省略できないか)、と私に詰め 寄られて、困っています。 ユーザー名と、パスワード入力でシンプルに収めること はできないのでしょうか。 他所のサーバーでそのようなダイアログを見たことがある のですが・・・

  • ユーザー認証についての質問

    こんにちは。5dai@perl初心者です。 お仕事でCGIユーザー認証を作成することになりました。 比較的よくあるもので、ブラウザ上でユーザー名、パスワードを入力してログインボタンを押して 認証させ、ログインページを表示させます。 又、管理者がログインすると、ユーザー登録、削除やパスワード変更が 行なえるようにするつもりです。 cgiをPerlでやろうと思うのですが、やり方としてはWeb Server機のOSがSolarisなので、 Unix機に付属しているdbmをリスト(ユーザー名、パスワード)の記憶域として利用しようと思います。 そこでちょっと質問です。 1.CGIでの認証は、どのような方法が一番多いのでしょうか??   今回は、ブラウザ ←→ WEBサーバー ←→ cgi(perl) ←→ dbm 2.又、perlでよく利用するサイト(サンプルがある)があれば教えてください。   できれば、ユーザー認証のサンプルがあれば・・・。 もし、表現が変なところがあれば遠慮なく指摘して下さい。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • php認証

    php認証 phpとmysqlを使って、ユーザーIDごとに違うページを割り当てる認証システムを作りたいのですが、良い書籍などはありますか? また、スクリプトをあげていただけるととても助かります。。。

    • ベストアンサー
    • PHP
  • PHPでの認証方法

    お世話になります。 現在PHP言語でのActive Directoryへの認証を考えています。 KADM5関数やLDAP関数等を使用するらしい事は分かったのですけれども、使い方がよく分からなくて困っています。 例えば、 サーバー名が「server01」 ドメインが「d01」 ユーザーアカウント「user01」 パスワードが「abc」 の認証を、直接WEBページのフォームからユーザーIDと パスワードを入れて、認証が出来ます基本的な例文などがございましたら、教えていただけましたらと思っています。 また、できましたら、パスワードの期限がきました時の変更などもweb上で、できましたらと思っています。 よろしくお願いいたします。

    • 締切済み
    • PHP