[PHP-users 19270]Re: PHPによる HTTP認証について

Osamu Shigematsu m5issige @ mr.hitachi-medical.co.jp
2003年 12月 8日 (月) 17:58:35 JST


重松です。こんにちは。

> 実際のソースですが、従来のコンテンツ(HTML)を改造すること
> 無く、PHPによる簡単なHTTP認証とするためPostgreSQLのデ
> ータベース認証(PHP)部分を付加し、拡張子を.htmから.phpに
> して実行しています。

そんな必要は一切ありません。

auto_prepend という機能があり、認証関係の処理を書いた
php スクリプトを指定します。

つまり、postgre.php というのがそれですから、
もうすでにそういう構造になっているわけです。

それを、php.ini なり、.htaccess なりに指定すると、
PHP で処理することになっているファイルの前に、
auto_prepend で指定された php スクリプトが呼ばれます。
auto_append はその逆で、本体スクリプトの実行後に呼ばれます。

> > セッションの認証部分は、auto_prepend でもで処理して、
> > 実態は、readfile でいいんじゃないでしょうか?
> 正直言って、ごめんなさい。
> 初心者の私には超難解です。

readfile は指定されたファイルを読み込んで、
標準入力に垂れ流す関数です。

http://jp.php.net/manual/ja/function.readfile.php

画像を出力するには、その前に適切なヘッダを出力して、
変換機能は無効にしてください。
(コードの強制変換が有効になっていたりする場合)

以下、適当なコード案。当然!? 試してません。
<?php
// imageserver.php?file=hogehoge.jpg のように使うとする

// 認証処理
require 'postgres.php'; // あるいは auto_prepend

function my_error_handler($errno, $errstr, $errfile, $errline)
{
	header(""); // Not found
	exit(1);
}

error_reporting(お好みで);
set_error_handler('my_error_handler');

// 要求されたファイル名の確認
// ディレクトリトラバース攻撃, NULL byte 攻撃に注意
$file = $_GET['file'];
if (!mb_eregi('^[^A-Z0-9]\.JPG$', $file)) {
	trigger_error('', E_USER_ERROR); // 死亡
}

$path = "/home/httpd/html/images/$file";

if (!file_exists($path)) {
	trigger_error('', E_USER_ERROR); // 死亡
}

header('Content-type: image/jpeg'); // 中身の説明
readfile($path); // 失敗したらどうする!? -> 面倒だから気にしない
?>

-- 
Osamu Shigematsu <m5issige @ mr.hitachi-medical.co.jp>



PHP-users メーリングリストの案内