LoginSignup
4
5

More than 5 years have passed since last update.

FuelPHPで特定のコントローラーのアクセスを制限する

Last updated at Posted at 2015-07-27

※コメントにて複数指摘を頂いている記事です。
ひとまず取り下げることはしていませんが、あくまで参考程度に留め置いてくださいませ。

前提

  • FuelPHPの内の特定メソッドをcronで動かす
  • 同じFuelPHP内にユーザーがアクセス可能なメソッドがある
  • cron用のメソッドをユーザーとかクローラに踏まれたくない

大人しくFWごと分ければいいんですけどcronで動かすコントローラが一個だったので横着、もとい、サーバー容量の節約ということで上記課題をクリアします(´@ω@`)

Basic認証を使ってみる

cron.php
    public function before(){
         parent::before();
        switch (true) {
            case !isset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']):
            case $_SERVER['PHP_AUTH_USER'] !== 'admin':
            case $_SERVER['PHP_AUTH_PW']   !== 'test':
                throw new HttpNotFoundException;
        }
    }

エラー部分についてBasic認証でよく見る書き方は以下

basic.php
    header('WWW-Authenticate: Basic realm="Enter username and password."');
    header('Content-Type: text/plain; charset=utf-8');
    die('このページを見るにはログインが必要です');

なんですが、
今回は間違えて訪れたユーザーにダイアログとか表示したくなかったので上の書き方にしました。
(上:FuelPHP、下:PHPなので少々構文違いますが、脳内で補完してください)

ところが

URLにIDとパスを組み込む形 http://admin:test@example.com が使えない!という事態に陥りました。
$_SERVERの中にIDもパスも入ってないんですな。そういえばFuelのアクセス先って全部index.php?そのせい?と思ったんですが、あんまり調べずに手を変えました。
動けばよかろうなのだ(`@ω@´)

アクセス元を判定してみる

cronは同サーバー内に設定する(これもFW都合でwget --spider使うんですけど)ので、自分と同じIPからのアクセスなら通常処理、そうでなければ404という形に書き換え。

cron.php
    public function before(){
        parent::before();
        if($_SERVER['REMOTE_ADDR']!=$_SERVER['HTTP_HOST']){
            throw new HttpNotFoundException;
        }
    }

サーバー内からwget打ったらこれで動いたんでオッケーオッケー。

4
5
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5