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

Basic認証

created: 2007-04-25 21:19 | modified: 2007-04-27 00:15 | reply: 5

[3721] Basic認証

user: 目指そうwebMaster | created: 2007-04-25 21:19
よくここのBBSを覗かせて頂き勉強している者です。

現在Basic認証の実装に挑戦しているのですが
下記のようにコードを書きました。
※DBの構造はPostgreSQLで【id,name,pass…】などの順に並んでいます

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 * FROM テーブル名 ORDER BY id";
$res=pg_query($con, $sql);
$num=pg_num_rows($res);
$row = pg_fetch_row($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;
}
}
}

ところが認証が全くされない状況になってしまいました。
Basic認証画面は表示されるが、DBのIDとPASSを打ち込んでも認証されない状況です。
どこがどの様に間違っているかご指摘頂けないでしょうか?
reply: 3722 3725 返信 編集 削除

[3722] pg_fetch_row

user: ゆうじ | created: 2007-04-26 01:30
こんばんわ。

Basic認証は実装したことが無いのでわかりません。
また、Mysqlばかり使ってるので気づいたことだけですが、
pg_fetch_row の使い方あってますか。

forループの前に
$row = pg_fetch_row($res);
で1レコード獲得されてますね。
不要な気がしますが何の意味でしょうね。


またループの中のpg_fetch_rowについても
http://jp.php.net/manual/ja/function.pg-fetch-row.php
pg_fetch_result の間違いでは。
http://jp.php.net/manual/ja/function.pg-fetch-result.php


そもそもレコード全部を獲得してループをまわさなくても
問合せの時点でこのように出来そうですがいかがでしょう。
$name = pg_escape_string($PHP_AUTH_USER);
$pass = pg_escape_string($PHP_AUTH_PW);
$sql="select * from テーブル名 where s_name='$name' and pass='$pass'";
$res=pg_query($con, $sql);
if (pg_num_rows($res)) {
// 該当レコードがあります。
} else {
// 該当レコードがありません。
}
Parent: 3721  返信 編集 削除

[3725] Basic認証

user: 目指そうwebMaster | created: 2007-04-26 14:32
お世話になっております。

言われる通り、pg_fetch_rowの使い方を間違っていました。
修正して下記の様に書き換えたのですが、やはり認証されません。
DBに格納してる文字が全角なのですが、それも関係しているのでしょうか?

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 * FROM テーブル名 WHERE s_name=".$PHP_AUTH_USER." AND pass=".$PHP_AUTH_PW."";
$res=pg_query($con, $sql);
$num=pg_num_rows($res);
if(pg_num_rows($res)){
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;
}
}
Parent: 3721  reply: 3726 返信 編集 削除

[3726] Re. Basic認証

user: ゆうじ | created: 2007-04-26 15:35
$sql="SELECT * ・・・
のところ、$PHP_AUTH_USER と $PHP_AUTH_PW を
直接SQL文に放り込んでいらっしゃいますが、
必ず値をエスケープしてから放り込んでください。

$name = pg_escape_string($PHP_AUTH_USER);
$pass = pg_escape_string($PHP_AUTH_PW);
$sql="select * from テーブル名 where s_name='$name' and pass='$pass'";

悪意のある人が良からぬ値を放り込まないとも限りません。
近頃は少なくなりましたが、register_globals = On
だったりすると一発でアウトです。
SQLに外部から得た値を入れる時、エスケープは必須です。
「SQLインジェクション」でググるといっぱい出てきます。


さて認証されない件ですが、

パスワードが漏れた場合に備えて
DB保存の際、md5とかでパスワードのハッシュ値を取り
それを保存する方法を良く取りますが、
DBにはパスワードがそのまま入ってるのでしょうか。

$_SERVER['PHP_AUTH_PW'] の値はユーザが入力したテキストそのものなので、
DB保存時と同じ方法で変換した後SQL文に放り込む必要があるのでは。
Parent: 3725  reply: 3728 返信 編集 削除

[3728] Basic認証

user: 目指そうwebMaster | created: 2007-04-26 22:16
返答ありがとうございます。

pg_escape_string使うおうと考えているのですが、私の環境ではエラーが出てしまい、この関数自体使用する事が出来ないような状況です。
この件に関しては自分で調べてみようと思っています。

※本題ですが…これは限られたネットワークでしか使用しないのでパスワードはDBに平分で格納しております。

自分の考えでは
name==$PHP_AUTH_USER、pass==$PHP_AUTH_PW
で一致出来たら認証されると考えているのですが…
名前に全角を使用しているのが原因でしょうか?
Parent: 3726  reply: 3729 返信 編集 削除

[3729] Re. Basic認証

user: ゆうじ | created: 2007-04-27 00:15
では、エスケープ問題は後回しとして。

> name==$PHP_AUTH_USER、pass==$PHP_AUTH_PW
> で一致出来たら認証されると考えているのですが…
> 名前に全角を使用しているのが原因でしょうか?

全角だと文字エンコードも絡みますね。
Basic認証で全角の可不可は存じませんが
$PHP_AUTH_USER や $PHP_AUTH_PW の値が想定した値かどうか、
また実際DBの中に収められてる文字エンコードが何か確かめてみれば、
name==$PHP_AUTH_USER、pass==$PHP_AUTH_PW
これが成り立つのかどうか検証できると思います。
Parent: 3728  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 117 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

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