- 締切済み
Basic認証
初めまして、karuwazaといいます。 PHPとDB(Postgres)の勉強を始め、現在Basic認証の勉強をしています。 以下が自分が記載したコードなのですが、なぜ上手くいかないのか? 自分では解りません。 どこがどう間違っているのかなどのご指摘が頂ければと思い投稿させて 頂きました。 ご教授宜しくお願いします。 <?php include("./tools/common.php"); $con=db_connect(); //スーパーグローバル変数対策 if(!isset($PHP_AUTH_USER)){ $PHP_AUTH_USER = $_SERVER['PHP_AUTH_USER']; } if(!isset($PHP_AUTH_PW)){ $PHP_AUTH_PW = $_SERVER['PHP_AUTH_PW']; } if(!isset($PHP_AUTH_USER)){ header("WWW-Authenticate: Basic realm=\"WebSystem\""); header("HTTP/1.0 401 Unauthorized"); exit; }else{ $sql="SELECT id, pass FROM テーブル名 ORDER BY id"; $res=pg_query($con, $sql); $num=pg_num_rows($res); for($i=0; $i<$num; $i++){ $name=pg_fetch_row($res, $i, 's_name'); $pass=pg_fetch_row($res, $i, 'pass'); if($name==$PHP_AUTH_USER && $pass==$PHP_AUTH_PW){ session_start(); $_SESSION['s_name'] = $name; $url = // 指定URLへジャ~ンプ header('Location: '. $url); // HTTPヘッダを送信する }else{ header("WWW-Authenticate: Basic realm=\"WebSystem\""); header("HTTP/1.0 401 Unauthorized"); echo "<CENTER><FONT COLOR='red'>ユーザー認証が必要です。</FONT>\n"; exit; } } } db_close($con); ?>
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- asuncion
- ベストアンサー率33% (2127/6290)
データベースのコード体系がEUC-JPとのことですので、 認証画面から入力したID(これが2バイト文字ですよね?)を EUC-JPに変換した内容を、データベースから取得した内容と 比較する必要があるのではないでしょうか。 パスワードは2バイト文字ではないみたいですので、 比較に先立って変換する必要はないはずです。 検索ロジックとしては、ID/パスワード対応テーブルは 全件検索するようにして、その中のどこかで、 入力したID/パスワードとデータベース中のそれらとが 一致すれば、所定のURLへジャンプさせるようにすればよいです。 ID/パスワード対応テーブルを全件検索しても 入力したID/パスワードと一致しなければ (つまり、forループを抜けてしまったら)、 その時点で、「ユーザー認証が必要です」のメッセージを 表示すればよいと思います。
- tany180sx
- ベストアンサー率63% (239/379)
order by id で if, else なので1番若いidのユーザしか認証を通りませんが そこが問題でしょうか? $sql="SELECT id, pass FROM テーブル名 where id ='id' and pass = 'pass' "; でレコードが取得できれば認証通過としてみては。
補足
tany180sx様、ご返答ありがとうございます。 つまり、下記の様にしてやればよいと言う事でしょうか? else{ $sql="SELECT * FROM テーブル名 WHERE s_name=".$PHP_AUTH_USER." AND pass=".$PHP_AUTH_PW.""; $res=pg_query($con, $sql); $num=pg_num_rows($res); if($num>0){ session_start(); $_SESSION['s_name'] = $name; $url = // 指定URLへジャ~ンプ header('Location: '. $url); // HTTPヘッダを送信する Basic認証自体が始めてな上、DBと連携させて実現しようと 考えているので正直自分でもどのように処理したらよいか迷っている現状です。
- asuncion
- ベストアンサー率33% (2127/6290)
全角文字を使っている場合、 1)データベースにどんなコード体系で格納しているか 2)phpスクリプトをどんなコード体系で書いているか 3)システム全体のエンコーディングはどんなコード体系で行なっているか 4)Web画面からの入力(あるいは出力)をどんなコード体系で受け取るか あたりの整合性を取る必要があるのではないかと思います。 「整合性を取る」とは、「すべてを同じコード体系にしなければならない」ということではなく、 異なるコード体系を使ってもかまわないので、 ・Web画面からのリクエスト ・phpスクリプトの実行 ・データベース中のデータの処理 が矛盾なく行なえるようにする、という意味です。 さて、はじめに挙げた「整合性を取るべき項目」についてですが、 1)2)については、おそらくすぐに調べられると思いますので、 確認してみてください。 3)4)については、 ・設定ファイルphp.iniの内容を確認する、または ・<?php phpinfo(); ?> のスクリプトを実行する のいずれかの方法で、mbstring(マルチバイト文字)に関する 設定内容を確認する必要があります。
補足
asuncion様、度々ありがとうございます。 >1)データベースにどんなコード体系で格納しているか >2)phpスクリプトをどんなコード体系で書いているか EUC-JPとなっております。 ※試しに半角でも試してみましたが、認証されません。 コードの記述方法に間違いがあるのでしょうか? 度々の質問で申し訳ありませんが、ご教授お願い致します。
- asuncion
- ベストアンサー率33% (2127/6290)
> $sql="SELECT id, pass FROM テーブル名 ORDER BY id"; (中略) > $name=pg_fetch_row($res, $i, 's_name'); > $pass=pg_fetch_row($res, $i, 'pass'); (中略)の後ろに引用した2行で、pg_fetch_row()に第3引数があるのが よくわかりません。必要なのでしょうか? フェッチの方法はいろいろありますが、pg_fetch_row()を使うのであれば、 $row = pg_fetch_row($res); // 第2引数を省略すると「次の行」を取得 として、取得したカラムの順番を添字とする配列$rowに1行分の結果を格納し、 $name = $row[0]; // カラムidに相当 $pass = $row[1]; // カラムpassに相当 とするのではないでしょうか。
補足
asuncion様、度々の返答ありがとうございます。 Postgres自体使い始めたばかりなので、pg_fetch_row()に関しては よく把握しておりませんでした。 申し訳ありません。 asuncion様が教えて頂いたとおりに記述を変更したところ、Basic認証の ダイアログは出るようになりましたが、今度は認証自体が通らない状況になりました。 IDとPASSはDBの内容を確認しつつ打つ込んでいるので間違いはないはずです。 ※ちなみにIDは全角でシステムを使用する人の名前となっているのですが これが問題になったりはするのでしょうか?
- asuncion
- ベストアンサー率33% (2127/6290)
どのようにうまくいかないのでしょうか? 何かエラーメッセージが出たのでしたら、 内容を教えてください。
補足
asuncion様、早速のご返答ありがとうございます。 現状 [Wed Apr 25 15:31:13 2007] [error] PHP Warning: pg_fetch_row() [<a href='function.pg-fetch-row'>function.pg-fetch-row</a>]: Invalid result type in /home/yuuji/public_html/WorkTimeSystem/login.php on line 23 [Wed Apr 25 15:31:13 2007] [error] PHP Warning: pg_fetch_row() [<a href='function.pg-fetch-row'>function.pg-fetch-row</a>]: Invalid result type in /home/yuuji/public_html/WorkTimeSystem/login.php on line 24 [Wed Apr 25 15:31:13 2007] [error] PHP Warning: session_start() [<a href='function.session-start'>function.session-start</a>]: Cannot send session cache limiter - headers already sent (output started at /home/yuuji/public_html/WorkTimeSystem/login.php:2) in /home/yuuji/public_html/WorkTimeSystem/login.php on line 33 [Wed Apr 25 15:31:13 2007] [error] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/yuuji/public_html/WorkTimeSystem/login.php:2) in /home/yuuji/public_html/WorkTimeSystem/login.php on line 36 上記の様なエラーが出てしまいますが、翻訳サイトで翻訳して該当行をみても何がどのように悪いのかの判断がつきません。 それにBasic認証のダイアログ自体も出てこない状態です… 引き続きのご教授お願いしたいと思っております。
補足
asuncion様、ご返答ありがとうござます。 少々行き詰まってしまったので、もう少しゆっくり考えて見る事に致します。 自分の基礎知識があまりにも足りない為、もう少し勉強したいと思います。 度々のご教授ありがとうございました。