■ユーザーズフォーラム リニューアルのお知らせ
新規投稿は新ユーザーズフォーラムにお願いします。

Admin領域へのIPアドレスによるアクセス制限

 

 1  |  2   | 次のページ>

cruel > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/3/7 22:58
ryuring さま

たびたびお手数をお掛けしまして申し訳ありませんでした。おかげさまで、
ご掲示くださったコードにて動作いたしました。誠にありがとうございました。

PHPは5.2までと5.3以降では、挙動がかなり違うと聞いたことはありましたが、
細かいところでもだいぶ変わっているのですね。似非コーダーのため、この辺りの
事情には全く詳しくなかったのですが、真面目に勉強しないといけないなと思い
知りました・・・。

このプラグインをセッティングして、クライアントに再度提案をしてみたいと思い
ます。この度はどうもありがとうございました。
ryuring > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/3/6 14:04
こんにちは。

なるほど、5.3を使っているのですね。参照渡しの問題だと思います。

BaserCMSは現在、PHP4もサポートしているので、先日のようなコードとなりましたが、
5.3であれば、引き数の参照渡しを示す「&」を外してあげれば解決します。

class AdminPermissionHookComponent extends Object {
	
	var $registerHooks = array('initialize','beforeRender');
	var $allowClients = array('0.0.0.0', '127.0.0.1');
	function initialize($controller){
		if(!empty($controller->params['admin'])){
			$controller->components += array('RequestHandler');
		}
	}
    function beforeRender($controller){
		if(!empty($controller->params['admin']) && $controller->name != 'CakeError'){
			if(!in_array($controller->RequestHandler->getClientIP(),$this->allowClients)){
				$controller->notFound();
			}
		}
    }
	
}


この辺が参考になると思います。↓
PHP 5.3: 参照渡しの関数/メソッドを定義してた人は call_user_func_array に注意CommentsAdd Star

こういう問題を考えると、PHP4をサポートしていくのもそろそろ限界かもしれませんね。。

Twitter:@ryuring
baserCMS総合サービスサイト ビーコミ

cruel > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/3/5 1:44
yosyos さま

ありがとうございます。ここしばらくクライアントからは連絡がないため、また
週明けにでも問い合わせして、うまくいくといいのですが・・・。


ryuring さま

ryuring 様の環境では動作されているとのことで、私の環境(CSV, MySQL)でも再度
確認を行っておりましたが、やはり動作しないようです。スマートURLのオン・オフ
両環境でも試しましたが、結果は同様でした。

デバッグモードを有効にしたところ、以下のようなエラーが発生しておりました。
エラーをクリックして展開された部分も含めて記載いたします。


Warning (2): Parameter 1 to AdminPermissionHookComponent::initialize() expected to be a reference, value given [CORE/baser/controllers/components/plugin_hook.php, line 122]

PluginHookComponent::executeHook() - CORE/baser/controllers/components/plugin_hook.php, line 122
PluginHookComponent::initialize() - CORE/baser/controllers/components/plugin_hook.php, line 92
Component::initialize() - CORE/cake/libs/controller/component.php, line 95
Dispatcher::_invoke() - CORE/cake/dispatcher.php, line 207
Dispatcher::dispatch() - CORE/cake/dispatcher.php, line 193
[main] - APP/webroot/index.php, line 111


Warning (2): Parameter 1 to AdminPermissionHookComponent::beforeRender() expected to be a reference, value given [CORE/baser/controllers/components/plugin_hook.php, line 122]

PluginHookComponent::executeHook() - CORE/baser/controllers/components/plugin_hook.php, line 122
PluginHookComponent::beforeRender() - CORE/baser/controllers/components/plugin_hook.php, line 146
Component::beforeRender() - CORE/cake/libs/controller/component.php, line 127
Controller::render() - CORE/cake/libs/controller/controller.php, line 776
Dispatcher::_invoke() - CORE/cake/dispatcher.php, line 229
Dispatcher::dispatch() - CORE/cake/dispatcher.php, line 193
[main] - APP/webroot/index.php, line 111


MySQLのテスト環境では、デバッグモード3にするとメニュー等が文字化けして
正常に表示できませんでしたが、CSVの方ですと問題なく表示されましたので、
そちらでのプラグイン変数部分も抜粋いたします。


    [PluginHook] => PluginHookComponent Object
        (
            [pluginHooks] => Array
                (
                    [AdminPermission] => AdminPermissionHookComponent Object
                        (
                            [registerHooks] => Array
                                (
                                    [0] => initialize
                                    [1] => beforeRender
                                )

                            [allowClients] => Array
                                (
                                    [0] => 192.168.0.1
                                    [1] => 192.168.1.1
                                    [2] => localhost
                                    [3] => 127.0.0.1
                                )

                            [_log] => 
                        )

                )

            [registerHooks] => Array
                (
                    [initialize] => Array
                        (
                            [0] => AdminPermission
                        )

                    [beforeRender] => Array
                        (
                            [0] => AdminPermission
                        )

                )

            [_log] => 
            [enabled] => 1
        )


上記変数にあるIPアドレス以外からアクセスを行っておりますが、管理領域への
アクセスは可能でした。

PHP 5.3.5という環境が悪いのか、他に原因があるのか、もしお気づきの点がござい
ましたらご指摘いただけますと幸いです。

たびたびのご依頼で申し訳ございませんが、よろしくお願いいたします。
ryuring > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/3/4 0:30
> cruel さん

先日書いたプラグインを実際に試したのですが、こちらの環境では正常動作しました。
下記のコードで実際のIPの値を確認してみてください。in_arrayでチェックをかけているだけなのでデバッグは簡単だと思います。

var_dump($controller->RequestHandler->getClientIP());


> yosyos さん

忙しい事は何よりです!是非本業を頑張ってください!

Twitter:@ryuring
baserCMS総合サービスサイト ビーコミ

yosyos > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/3/3 23:47
cruel さん

動作されたようで何よりです。
クライアントのお話、上手くランディングされることを祈るばかりです。

ryuring さん

BaserCMSのプラグインフックは盲点でした。。。
ご指南ありがとうございました。
IPブロック・Basic認証・Digest認証を絡めた形でプラグインを妄想してみたのですが
現状手が回らず、すぐに着手はできなそうです。
CakePHP Securityコンポーネントを使った方向で考えてはいますが...

嬉しいことか悲しいことかこんな時に限って忙しくなってます…
cruel > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/3/3 5:38
ryuring さま

サンプルコードだった旨、承りました。私の方でもこのコードを参考に、動作
するプラグイン的な物が作れないかどうか、テストしてみます。この度は誠に
ありがとうございました。

# ただ、そのクライアントにBaserCMSを導入するという話自体が宙に浮きかけて
# おりまして、作っても徒労となる可能性も出てきているのが憂鬱ではありますが
# ・・・orz
ryuring > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/3/3 5:13
ごめんなさい、本体に影響を与えないプラグインでの簡単な実装例をヒントとしてお伝えしたかっただけなので動作検証は全く行ってませんでした。
フック処理の中身は色々書き方があると思いますので色々試して頂ければとおもいます。

どなたかプラグインとして作ってくれたら嬉しいなあ

Twitter:@ryuring
baserCMS総合サービスサイト ビーコミ

cruel > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/3/3 4:18
ご返信が遅くなりまして申し訳ございません。本日動作の検証を行いましたので、
ご報告させていただきます。


yosyos さま

とんでもございません。.htaccess での制限が可能ということが分かっただけ
でも大変な収穫でした。スマートURLが有効な環境でしたら、webroot内にフォル
ダを作れば .htaccess が有効になるという考えがございませんでしたので、
大変勉強になりました。

また、フックする部分に関しましてもご考察いただき、ありがとうございました。
bootstrap.php の 配置パターン コメントの直下に追加することで、動作確認
できました。私のものよりこちらの方が、ページトップに遷移するため遙かに
スマートでいいですね。(クライアントへのデモページは、こちらのパターンにて
開示させていただきます(^^;)


ryuring さま

プラグインの作成方法の御指南、誠にありがとうございます。1ファイルにて
プラグインとして動作するのですね。たくさんのファイルを用意しないといけ
ないものと考えておりましたため、目から鱗でした。

ただ、お教えいただいたプラグインでは、IPアドレスでの制限がうまくかから
ないようでした。ご掲示いただいた通りのフォルダ構成でファイルを作成し、
プラグインとしては登録でき、動作しているようなのですが、許可したIPアド
レス以外からも管理者エリアに入れるようです。

私のミスの可能性が大かと存じますが、ご確認いただければ幸いです。私の
テスト環境は以下の通りです。


BaserCMSのバージョン : 1.6.9.1(既存の全パッチ済)
サーバー名 : apache2.2x
スマートURLの利用 : オフ
設置フォルダ : サブフォルダ
データベース : CSV
OSの種類 : CentOS 5.5
PHPのバージョン : 5.3.5


よろしくお願い申し上げます。
ryuring > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/3/1 0:48
こんばんは。

BaserCMSのアップデートに耐えうるようにカスタマイズするというのが結構悩みどころなのですが、
今回の要件であれば、BaserCMS のプラグインフックという仕組みを使えば
コアには何も手を加えずに beforeFilter をフックできます。
http://basercms.net/manuals/programmers/5.html

プラグインといっても1ファイルで簡単に実装できます。
次のような構成にし、クラスを一個作ります。
(プラグイン名は適当にadmin_permissionとしました)

■ フォルダ構成
app
 |- plugins
    |- admin_permission
      |- controllers
        |-components
          |- admin_permission_hook.php


■ admin_permission_hook.php
class AdminPermissionHookComponent extends Object {
	
	var $registerHooks = array('initialize','beforeRender');
	var $allowClients = array('192.168.0.1','192.168.1.1','localhost','127.0.0.1');
	function initialize(&$controller){
		if(!empty($controller->params['admin'])){
			$controller->components += array('RequestHandler');
		}
	}
	function beforeRender(&$controller){
		if(!empty($controller->params['admin']) && $controller->name != 'CakeError'){
			if(!in_array($controller->RequestHandler->getClientIP(),$this->allowClients)){
				$controller->notFound();
			}
		}
	}
	
}


とりあえず、プラグインフックの仕組みだけお伝えしたかったので、許可するIPはクラスにハードコーディングしちゃってます。
許可しないIPからのアクセスの場合、NOT FOUNDとするようにしているのですが、その際に、$controller->params['admin'] が有効のまま呼び出されてしまうので、コントローラーがCakeErrorの場合にはチェックしないようにしてます。

利用するには、管理画面のプラグイン一覧で有効にする必要がありますのでご注意ください。
あと、これをプラグインとして配布するには、許可IPを管理画面で登録できるようにしたりする必要がありますね。

みんなでBaserCMSのプラグイン開発で盛り上がっていければ嬉しいですね〜

Twitter:@ryuring
baserCMS総合サービスサイト ビーコミ

yosyos > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/2/28 22:04
cruel さん

スマートURLが使えない環境で運用したことがなかったので
お門違いな回答をしてしまったようで申し訳ないです。

私ならどうやってしのぐかを少し考えてみました。
模範解答には程遠いと思いますが・・・

1.baser/controllers/users_controller.php を app/controllers/users_controller.phpにコピーしてcruelさんの処置を施す。

baserをバージョンUPすることを考えて、baser/以下のソースに手を加えないことを考えます。
そのために、app/に移動してコントローラーをオーバーライドするようにします。
但し、バージョンUPをするとコピーしたソースを更新(マージ)しなくてはならないので、結果的には同じことかなと・・・

2.app/config/bootstrap.phpに処置を加える。

本来ならばapp/controllers/app_controller.phpにフックを仕込みたいところですが
baser/controllers/app_controller.phpがあるので、できませんでした。
なので、baser/controllers/app_controller.php実行以前に仕込める場所はと考えると
app/config/以下の何かか。

cakePHP 及び baserCMS の規範に沿っていないのですが
bootstrap.php仕込みの方法で考えました。

例えば以下のような感じで
$hosts = array('192.168.0.1','192.168.1.1','localhost','127.0.0.1');
if(preg_match("/^\/admin.*/i",$_SERVER['PATH_INFO'])){//adminが含まれていたら
        if(!in_array($_SERVER['REMOTE_ADDR'],$hosts)){//$hosts以外のIPはルートにリダイレクトする
                header("HTTP/1.1 301 Moved Permanently");
                header("Location: http://$_SERVER[HTTP_HOST]/");
                exit();
        }
}


どちらもスマートじゃないのですが、やむを得ずの場合、私ならこうやっちゃうだろうな・・・
という回答でしかないのですがいかがでしょうか?

※この記事をご覧の方で同様の事案に対応されている人がいましたら、私も教えて頂きたいです。

 

 1  |  2   | 次のページ>

ログイン
ユーザー名:
パスワード:


  新規登録 / パスワード紛失

検索

facebook
フォーラムで悩みが解決した場合など、よかったら「いいね!」をポチっとクリックしてください!質問の回答者や開発者の励みになります

フォーラムガイド


関連リンク

オンライン状況
36 人のユーザが現在オンラインです。 (36 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 36