簡體   English   中英

如何確保我的PHP腳本僅作為計划作業而不是從瀏覽器運行?

[英]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服務器文檔樹之外的某個位置。

您有很多選擇。 我只提到三個:

  1. 附加一個只有您自己知道並且在腳本中進行了硬編碼的查詢參數,例如retrieveContent.php?key=secret (或在CLI模式下,為秘密的命令行參數。)在腳本中檢查此參數,並且僅在與硬編碼值匹配時才執行操作。

  2. 如果計划的作業是在腳本所在的同一台服務器上執行的,請將腳本移動到受以下內容保護的.htaccess文件保護的單獨目錄中:

     Deny from all Allow from localhost 
  3. 如果您的計划作業通過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.

可以通過幾種方法完成:

  1. if(php_sapi_name() != 'cli'){ die();}if(PHP_SAPI != 'cli'){ die();}

根據服務器設置,以下解決方案並非總是可行:

  1. 檢查$ _SERVER ['argv'],僅在if (empty($_SERVER['argv'])) { die();}在CLI執行if (empty($_SERVER['argv'])) { die();}設置。 除非您的服務器在HTTP請求上加載了這些內容,否則大多數情況下都是這樣。

  2. if(!empty($_SERVER['REMOTE_ADDR'])) { die();}通過CLI調用時REMOTE_ADDR為空。

  3. if(empty($_SERVER['TERM'])) { die();} PHP使用終端類型加載TERM變量。 $_SERVER['SHELL']$_SERVER['USER']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM