[英]How can I ensure my PHP script is only run as a schedule job and not when run from a browser?
每次我打開例如retrieveContent.php腳本時,都會執行該腳本並將記錄插入數據庫中。 由於我在計划作業中使用了此腳本,因此應該不會有問題。
但是,我注意到一個用戶找到了腳本路徑,並確實打開了執行的retrieveContent.php文件,並在數據庫中插入了一條記錄。 如何防止用戶使用PHP進行瀏覽器交易? 提前致謝!
查看php_sapi_name()
函數。 它會告訴您是否在CLI(命令行界面)中運行。
http://php.net/manual/zh/function.php-sapi-name.php
您還可以將PHP腳本移動到Web服務器文檔樹之外的某個位置。
您有很多選擇。 我只提到三個:
附加一個只有您自己知道並且在腳本中進行了硬編碼的查詢參數,例如retrieveContent.php?key=secret
。 (或在CLI模式下,為秘密的命令行參數。)在腳本中檢查此參數,並且僅在與硬編碼值匹配時才執行操作。
如果計划的作業是在腳本所在的同一台服務器上執行的,請將腳本移動到受以下內容保護的.htaccess
文件保護的單獨目錄中:
Deny from all Allow from localhost
如果您的計划作業通過HTTP獲取腳本,請找出哪個用戶代理在$_SERVER['HTTP_USER_AGENT']
,並且僅在該用戶代理訪問了腳本的情況下執行操作。 但這不太安全,因為用戶可以偽造用戶代理(如果他設法找到正確的代理)。
通過CLI調用時,將秘密參數傳遞給腳本,並在PHP端進行確認。 例如:
-- terminal --
php script.php secret-argument
-- script.php --
<?php
if(!isset($argv[1]) || $argv[1] != 'secret-argument')
{
die('restricted access');
}
// Rest of script
$ argv是一個PHP全局變量, Contains an array of all the arguments passed to the script when running from the command line.
可以通過幾種方法完成:
if(php_sapi_name() != 'cli'){ die();}
或if(PHP_SAPI != 'cli'){ die();}
根據服務器設置,以下解決方案並非總是可行:
檢查$ _SERVER ['argv'],僅在if (empty($_SERVER['argv'])) { die();}
在CLI執行if (empty($_SERVER['argv'])) { die();}
設置。 除非您的服務器在HTTP請求上加載了這些內容,否則大多數情況下都是這樣。
if(!empty($_SERVER['REMOTE_ADDR'])) { die();}
通過CLI調用時REMOTE_ADDR為空。
if(empty($_SERVER['TERM'])) { die();}
PHP使用終端類型加載TERM變量。 $_SERVER['SHELL']
或$_SERVER['USER']
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.