私はcronジョブに慣れていないので、これがうまくいくかどうかわかりません。
セキュリティのために、ある特定のGET値(ユーザー名、パスワード、セキュリティコード)を探す1ページのスクリプトを作り、コンピュータと3つすべてを知っている人だけがコマンドを実行できるようにしようと思いました。
スクリプトを作成し、ブラウザで実行すると動作しますが、GET値でcronジョブを実行することは可能でしょうか?
例えば、次のように実行します。
* 3 * * * /path_to_script/cronjob.php?username=test&password=test&code=1234
これは可能ですか?
連想配列 $_GET[]
& $_POST[]
は、スクリプトがウェブサーバから起動されたときのみ初期化されます。 コマンドラインから起動された場合、パラメータはC言語のように $argv
配列で渡されます。
コマンドラインから実行したときにスクリプトに渡されるすべての引数の配列が含まれます。 コマンドラインから実行したときにスクリプトに渡されるすべての引数の配列です。
あなたのコマンドは次のようになります。
* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234
そして、parse_str()を使ってパラメータを設定し、アクセスすることになります。
<?php
var_dump($argv);
/*
array(4) {
[0]=>
string(27) "/path_to_script/cronjob.php"
[1]=>
string(13) "username=test"
[2]=>
string(13) "password=test"
[3]=>
string(9) "code=1234"
}
*/
parse_str($argv[3], $params);
echo $params['code']; // 1234
ご質問に対する直接的な答えではありませんが、より良い解決策だと思います。
もし、cron以外の誰にもスクリプトを実行させたくないのであれば、Web-rootの外にスクリプトを配置すればよいのです。そうすれば、ウェブサーバー経由でのアクセスは一切ありません。
もし、特別なユーザーとしてコマンドを実行する必要があるなら、GET
を使わずに、ユーザーにログインしてもらい、ログインしたセッション(特定の設定されたセッション変数...)をチェックし、そのページだけにスクリプトを入れるようにします。
一般にアクセス可能なスクリプトは以下のようなものになります。
session_start();
if (isset($_SESSION['user']))
{
include '/path/to/script/outside/of/web-root';
}
else
{
die('No access.');
}