0

我有一個PHP腳本,它通常作爲更大的Web應用程序的一部分運行。 該腳本實質上對數據庫進行了一些更改,並將狀態/結果報告給Web用戶。如何繞過PHP腳本中的安全檢查,如果從CLI運行?

我在PHP的開口部:

require $_SERVER['DOCUMENT_ROOT'].'/security.php'; 
    // Only level <=1 users should be able to access this page: 
    if ($_SESSION['MySecurityLevel'] > 1) { 
     echo '<script type="text/javascript" language="JavaScript">window.location = \'/index.php\'</script>'; 
     exit(); 
    } 

所以,基本上,如果通過身份驗證的Web用戶的安全等級不高於1,那麼他們只是重定向到Web應用程序的索引。

該腳本可以通過網絡瀏覽器正常工作。

現在我的問題......

我也想的cron作業此腳本 - 但我不知道,如果從CLI RAN如何繞過安全檢查。

如果我只是從CLI/cron的與 'PHP -f /path/to/report.php',並在「如果封閉安全檢查運行(php_sapi_name()!= 'CLI')「,它會在腳本中使用多個用法(可能會有其他複雜情況,但是這是遇到的第一個錯誤),因此發生錯誤。

如果我使用CURL運行它,那麼php_sapi_name()檢查將不起作用,因爲它只是由Apache提供服務。

請任何人都可以提供一些幫助?

謝謝! :)

+0

如果你的腳本依賴於並不總是定義的變量,你要麼需要包裝每一個實例在有條件'isset()函數'或類似的,或者您需要定義前面一些虛擬的數據。 – moopet

+0

顯然,我的意思是說,如果用戶的安全級別高於1,那麼他們將被重定向到索引! –

+0

@moopet那麼,在它的當前狀態下$ _SERVER變量總是被定義 - 並且是必需的。例如,要創建到數據庫的連接,有一個「require $ _SERVER ['DOCUMENT_ROOT']。'/ dbconnect-rw.php';」。所以我需要能夠包含這個額外的腳本,無論它是否從CLI的web運行。 –

回答

0

如果通過CLI調用腳本,將會定義一些$_SERVER變量,但是它們的值可能不是您所期望的:例如$_SERVER['DOCUMENT_ROOT']將爲空,因此您的需求將查找名爲「安全性」的文件。 php'在文件系統根目錄下。其他陣列(如$_SESSION)將不會填充,因爲CLI沒有類似的概念。

您可以通過手動定義變量來解決這些問題(請參閱"Set $_SERVER variable when calling PHP from command line?")。但是更簡潔的方法是提取使數據庫更改爲獨立於任何特定且不依賴於任何特定的獨立文件的代碼被定義特定的SAPI變量

比如你的PHP腳本(我們稱之爲的index.php)可以修改如下:。

require $_SERVER['DOCUMENT_ROOT'].'/security.php'; 
require $_SERVER['DOCUMENT_ROOT'].'/db_changes.php';'; 

    // Only level <=1 users should be able to access this page: 
    if ($_SESSION['MySecurityLevel'] > 1) { 
     echo '<script type="text/javascript" language="JavaScript">window.location = \'/index.php\'</script>'; 
     exit(); 
    } else { 
     do_db_changes(); 
    } 
在SAPI無關 db_changes.ph

然後p你會:

<? 
function do_db_changes() { 
    // Do the DB changes here... 
} 
?> 

最後你將有一個文件,Web根目錄,你可以從cron調用外部(比如cron.php):

<? 
    require("/absolute/path/to/db_changes.php"); 
    do_db_changes(); 
?> 

篩選您可以繼續使用index.php爲web應用程序並從cron調用cron.php以實現您的預​​期結果。

相關問題