仮想登山 RSSフィード

2008-11-21

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


サーバー上のファイルに対して、クライアントからのアクセス制限をかける場合、

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

先日、本のモニタープレゼント企画をやったのですが、、、色々大変です。

サイト運営のモチベーションをガツンと下げられました

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/matoyan/20081121/1227283473