2009-02-17 247 views
2

我正在運行需要將數據寫入緩存的cronjob。我想把這個cronjob放在我的私人文件夾中,但是,即使在CHMODding私人文件夾中的緩存文件夾之後,它也沒有寫入權限。這似乎是一些plesk功能。如何檢查服務器是否正在執行PHP腳本?

因此,現在我已將cronjob放置在公用文件夾中。但是,我需要確保只有服務器才能執行腳本。在cronjob頂部的以下內容呢?

if ($_SERVER['SERVER_ADDR'] != $_SERVER['REMOTE_ADDR']) die(); 

這似乎工作。然而,它不是可以利用的,例如。用戶可以操縱他的remote_addr到我的服務器?還是有更好的方法來檢查這個?

另一個問題我有是,上面的代碼返回2個警告,儘管它似乎工作:

PHP Notice: Undefined index: SERVER_ADDR in ... on line 2 
PHP Notice: Undefined index: REMOTE_ADDR in ... on line 2 

任何想法什麼的的原因是什麼?

回答

5

通過控制檯而不是Web服務器執行腳本。

這個cron看起來是這樣的:

*/5 * * * * php -f /path/to/cron.php 

然後文件可以這樣做:

cron.php: 
<?php 

if (array_key_exists('REMOTE_ADDR', $_SERVER)) 
    die("Can only be run from the command line!"); 

,這將保證它的唯一服務器上運行。

編輯迴應評論

你不能得到一個公用文件夾的私人文件夾內,一般來說,如果你不能在網站根目錄外添加新的目錄,緩存目錄會必須以另一種方式加以保護。

我打算假設你的所有文件都在web根目錄下,即:/home/site/publichtml。用你的目錄替換它。

創建一個新目錄/home/site/publichtml/.cache。將以下內容添加爲。htaccess文件:

Deny from all 

現在你的腳本應該能夠從文件系統訪問該文件夾,但它是通過Web服務器訪問。

如果您可以在服務器上設置cron作業(通過web管理員或其他方式,聽起來可以),如下所示:即使用php -f /home/site/publichtml/cron.php作爲命令,幷包括陣列檢查鍵。

或者,你可以檢查這樣的:

if (!isset($_SERVER['argc'])) 
    die("Must be run from the command line!\n"); 

$_SERVER['argc']當腳本在命令行中執行時,才設置。

如果您可以將cron腳本保留在Web根目錄之外,那很好。如果不是,那應該是安全的。

最後,擺脫E_NOTICES的,這增加了cron.php的頂部:

error_reporting(E_ALL^E_NOTICE); // Turn off notices 

error_reporting(0); // Hide all error reporting 
+0

不幸的是我無法訪問控制檯。這是一個共享的網絡主機。 – Tom 2009-02-17 17:01:53

+0

如果您可以設置cron作業(通過管理面板),您仍然應該可以做到這一點,但是您可能會失去一些安全性(例如:需要將緩存目錄移到web根目錄中)。 – 2009-02-17 17:25:51

4

首先,我會將可執行PHP腳本保存在一個只能由特權用戶執行的私有目錄中 - 並在該用戶的cron中安排它。執行腳本應該沒有問題。

其次,您可以更改將緩存數據寫入公共目錄的位置。最好把它保存在一個非公開的目錄中,但是如果你不知道如何去做,那麼數據可以公開,那麼它可能是好的。

最後,使用$ _SERVER ['SERVER_ADDR']和$ _SERVER ['REMOTE_ADDR']可能不是檢查服務器是否正在運行腳本的最佳方法。首先,我相信在運行命令行PHP腳本時不會設置$ _SERVER ['REMOTE_ADDR']。這是從HTTP頭獲取的,因爲沒有,它將是空的。事實上,這就是爲什麼你會收到警告 - 這些都沒有設置。 (編輯:查看PHP文檔,可能不會爲非瀏覽器腳本設置'SERVER_ADDR'變量)

+0

我將如何在共享虛擬主機上創建這樣的目錄? – Tom 2009-02-17 17:03:21

1

我想答案就藏在您的第一個答覆喬恩。

所以,如果你只想要這個腳本通過cron訪問,請檢查會話超全局變量的存在:

if (is_array($_SESSION)) die(); 

而且,僅僅因爲它很容易,創造一個.htaccess文件,做一個全部拒絕。

我錯誤地將$ _SESSION設置爲$ _SERVER,這很糟糕。這符合您的需求。

相關問題