サーバー上のファイルに開発した後からアクセス制限をかける方法


サーバー上のファイルに対して、クライアントからのアクセス制限をかける場合、
HTTPサーバーがファイルにアクセスする手前にプログラムを
埋め込まないといけません。

制約条件とか

通常は、クライアントにアクセス権限判断用のプログラムを呼び出す
URLを公開して、ファイル自体は直接アクセスできない場所に置くはずです。
流れで言うと
クライアント → アクセス制御プログラム呼び出し → 判定 → ファイル読み出し
です。


でも、一度運用開始したあとになると、一度公開したURLは変えられません。
なので、別の方法を検討しました。


また、静的なパスワード設定なら.htpasswdによるBASIC認証をすれば
いいだけです。
今回はxoopsの認証機能と連携したいので、別の方法を使いました。

方針

Apachemod_rewriteを使って、ファイルアクセスを無理やり
プログラムへのアクセスに変更して対処しました。


イメージだけで書くと

  1. サーバーマシン受信
  2. Apache受信
  3. ファイル読み込み(by apache)
  4. ファイル応答

の流れを

  1. サーバーマシン受信
  2. Apache受信
  3. ★アドレス書換え(by apache mod_rewrite)
  4. プログラム読み出し
  5. アクセス権限チェック
  6. ファイル読み込み(by php)
  7. ファイル応答

に変えました。

認証プログラムの準備

認証プログラム自体はxoopsのログインチェックの機能を
そのまま使いました。なので、あまり解説することはないです。
checker.php
というファイルを用意しておきました。


たとえば、file#.xmlというファイルにアクセス制御をかける場合(#はデータのID)
URLをchecker.php?id=10としてアクセスすると、file10.xmlのコンテンツへの
アクセス判定をして、OKのときだけファイルを出力するだけのプログラムです。

<?php
include XOOPS_URL.'/mainfile.php';

# データのID読み込み
if(isset($_GET['id'])){
  $myid=intval($_GET['id']);
}else{
  exit;
}

# xoopsのユーザIDをチェック
if(is_object($xoopsUser)) {
  $uid = $xoopsUser->getVar('uid');
} else {
  $uid = 0;
}

# アクセス権限OKならファイル読み込み
if(check_access_file($myid, $uid)){
  $fname="./file".$id.".xml";
  $type="Content-type: text/xml";
  header($type);
  readfile($fname);
}

function check_access_file($myid, $uid){
 # チェックプログラムをここに書く
 return true;
}

?>


ブログ用に書き起こしたので、間違ってるかも・・・。

.htaccessの準備

RewriteEngine on
RewriteRule ^file([0-9]+).xml+ checker.php?id=$1

ちなみに、データのIDは数字前提で書いてます。


この2つのファイルを置くだけで、アクセス権限を追加できました。
思ったよりカンタン!でした。

余談1

来週末から国際会議で発表する予定でして、
その準備で最近なかなか時間が取れないです。
今日も必死に原稿丸覚えしてます・・・。

余談2

先日、本のモニタープレゼント企画をやったのですが、、、色々大変です。
サイト運営のモチベーションをガツンと下げられました