※ ChatGPTを利用し、要約された質問です(原文:Basic認証: PHP_AUTH_USERが)
PHPでのBasic認証の不具合について
2012/11/02 14:44
このQ&Aのポイント
PHPのBasic認証において、特定の条件下で値が取得できない不具合が発生しています。
具体的には、$_SERVER['PHP_AUTH_USER']をWHERE句に使用すると値が取得できず、エラーが発生します。
この問題の解決方法としては、$_SERVER['PHP_AUTH_USER']を変数に代入し、その変数を使用することで値を取得できるようになります。
環境:CentOS6.3, PHP Version 5.3.3, Apache/2.2.15 (CentOS) ,MySQL Server version 5.1.61 (Client API versionも同じ) です。テーブルmembers にname,password の2欄があり、データがそれぞれ、taro , abc と入っています。 ここで phpを下記のように書きました。
1 <?php
2 // データベースに接続
中略
7
8 // 認証処理(Basic認証)
9 if (!isset($_SERVER["PHP_AUTH_USER"])) {
10 header("WWW-Authenticate: Basic");
11 header("HTTP/1.0 401 Unauthorized");
12 exit;
13 }else{
14 var_dump(($_SERVER)." --line_a"."<br />");
15 print ("ユーザ名:". $_SERVER['PHP_AUTH_USER']." --line_b"."<br />");
16
17 // 入力されたアカウントが正しいかチェック
18 $result = mysql_query( "SELECT COUNT(id) AS rows FROM `account` WHERE name = $_SERVER [ 'PHP_AUTH_USER' ] AND password = $_SERVER ['PHP_AUTH_PW' ]", $conn);
19
20 echo( $_SERVER [ 'PHP_AUTH_USER' ]."-".$_SERVER ['PHP_AUTH_PW' ]."--line_c"."<br />");
21 echo($result."--line_d"."<br />");
以下略
これでブラウザから認証を経てログインすると、
string(20) "Array --line_a
" ユーザ名:taro --line_b
taro-ptaro--line_c
--line_d
となって、$result に値が入りません。
18行の WHERE句を外し、
$result = mysql_query( "SELECT COUNT(id) AS rows FROM `account`", $conn) or die("result取得エラー") ;
とすると、
string(20) "Array --line_a
" ユーザ名:taro --line_b
taro-abc--line_c
Resource id #3--line_d
となり、$result にResource id #3 が返ります。
WHERE句で name = 'taro' を指定し、
$result = mysql_query( "SELECT COUNT(id) AS rows FROM `account` WHERE name = 'taro' ", $conn) or die("result取得エラー"); とすると、
string(20) "Array --line_a
" ユーザ名:taro --line_b
taro-abc--line_c
Resource id #3--line_d
となり、やはり、$result にResource id #3 が返ります。password を追加し、WHERE name = 'taro' AND password = 'abc' としても、Resource id #3--line_d と出ます。
ところが、18行の taro を $_SERVER [ 'PHP_AUTH_USER' ] に置き換え、
$result = mysql_query( "SELECT COUNT(id) AS rows FROM `account` WHERE name = $_SERVER [ 'PHP_AUTH_USER' ] AND password = 'abc'", $conn) or die("result 取得エラー") ;
string(20) "Array --line_a
" ユーザ名:taro --line_b
result 取得エラー
となって、$result に値が入りません。 $_SERVER [ 'PHP_AUTH_USER' ] を’’で囲んでも同じ。
何故でしょうか? どのようにすれば不具合の解決ができるでしょうか?
質問の原文を閉じる
質問の原文を表示する
お礼
var_dumpで見ると、・・・・WHERE name = Array [ 'PHP_AUTH_USER' ] AND password = 'abc'と出ました。 ご回答の sql文で Resource id #3--line_d と出ました。値が入ったと思います。ありがとうございました。