2012-01-17 9 views
5

Envoirnment実行するスクリプトを停止します。Linux、PHPPHPコードブラウザから

シナリオ:私は、cronのように設定されるスクリプトを書かれています。今の場合、スクリプトをcronを介してのみ実行し、ブラウザ(モバイルブラウザを含む任意のWebブラウザ)を経由しないでください。ですから、私はbrowserValidateのような関数を探しています。

スクリプトは、MVCフレームワークで書かれており、これで私を助けてください

/usr/bin/GET http://xyz.com/abc/pqr 

として実行されます。

ありがとうございます。 $_SERVERが実行バイナリの環境を反映しているので - -

+1

なぜWebベースのMVCフレームワークを使用して、cronからトリガーするスクリプトを記述していますか?コマンドラインスクリプトからモデルライブラリにアクセスするだけです。 – Quentin

+0

フレームワークで定義されているスクリプトで使用される多くの機能があります。したがって、私はMVCを使用しています –

+0

ブラウザから実行したくない場合は、最初にスクリプトへのWebアクセスを許可したのはなぜですか? –

答えて

6

のcrontab内からスクリプトを実行する場合、あなたはどちらかに$_SERVERスーパーグローバルを使うのApacheをチェックすることができ、エントリ(HTTP_*)またはを生成し、実行前に特定の環境変数を定義します。

# in the crontab 
FOOVAR=1 /usr/bin/php5 script.php 

その後、script.phpに、FOOVAR存在するかどうかを確認:

if (!isset($_SERVER['FOOVAR'])) 
    die('No browser access.'); 

これは、クライアントのIPアドレスが「192.168.0.1」である場合にのみ FOOVARを設定します

SetEnvIf Remote_Addr "192.168.0.1" FOOVAR=1 

あなたのcronジョブがwgetとクライアントIPで実行されている場合は、サーバーの、あなたは.htaccessファイルにこれを追加することができています。

+0

ええと、OPが問題としているHTTPリクエストに環境変数がどのように設定されているのだろうか^^ – hakre

+0

@hakre私の編集を参照してください。 –

8

@Mob氏によると、これを達成するための確実な方法は、Webサーバーからアクセスできない場所にスクリプトを置くことです。これが不可能な場合や何らかの理由でそれをやりたくない場合は、スクリプトがWebサーバー経由で、またはコマンドライン経由で呼び出されたかどうかを検出する必要があります。

このため私のお気に入りのアプローチは、(多くがある)である。

$isRunningFromBrowser = !isset($GLOBALS['argv']); 

これは$isRunningFromBrowserがtrueの場合、あなただけの終了/ /どんなエラーメッセージを返すことを意味します。

+0

OPは質問を編集しました。このスクリプトは 'wget'のようなバイナリで実行されます。だから 'argv'。また、FastCGIとして動作するPHPは '$ _SERVER'に' argv'を含みます。 –

+0

@LinusKleen私はFCGI環境を持っていないし、潜在的にスパナを投げつける - グローバルスコープで '$ argv'を定義しているのか、' $ _SERVER'のエントリだけを定義していますか? – DaveRandom

+0

私の悪い、@デイブ。 '$ _SERVER' *のみ*。参照するグローバルはありません。 –

0

スクリプトをWebディレクトリの外に移動し、コマンドラインで実行します。適切なGETおよびPOST変数集団の引数を解析します。

ますが、/ usr/binが使用しているので、/ページの取得にGET HTTPを経由して、私はあなたが2つの別々のサーバーを持っていると仮定しています:

は私が良く説明するために、これを編集したhttp://www.php.net/manual/en/features.commandline.php#94912

1

を見ます: まず、PHPスクリプトがインストールされている場所とcronスクリプトを実行できない場所を指定します。 第2に、回避策として/ usr/bin/GETフェッチをcronで実行している場所です。

単にURLに固有の識別子を投稿してようなスクリプト にチェックすることであるかもしれない簡単な方法:別の方法が、/ usr/binに/ GETと-Hオプションを使用することができ

/usr/bin/GET http://xyz.com/abc/pqr/SomeUniqueIdentifier 

以下のようなユニークなものにUser-Agentヘッダを設定します

は/ usr/binに/ GET -H "のUser-Agent:SomeUniqueIdentifier" http://xyz.com/abc/pqr

、この一意の識別子のためのユーザーエージェント文字列をチェックするPHPスクリプトlike:

if (strcmp($_SERVER['HTTP_USER_AGENT'], "SomeUniqueIdentifier") == 0) 
{ 
    // do whatever 
} 
else 
{ 
    // do nothing 
    exit(); 
} 

どちらの方法も100%安全ですが、助けになりません。

1

1つの簡単な方法は、要求のIPアドレスを確認し、それがローカルホストのIPである場合にのみ実行します。

もちろん、ブラウザでさえローカルにスクリプトを起動しないように、後でさらにコードを追加する必要があります(ユーザーエージェント、リファラーなどをチェックしてください)。