[英]PHP file downloads on direct visit
我非常清楚PHP是一種服務器端語言,因此不應允許下載php文件。 但是,在Chrome瀏覽器中直接訪問PHP文件時,它會下載文件的混淆版本,這一點我想防止。 有沒有辦法阻止文件被送達?
代碼如下。
該系統可以在WordPress內完美運行,但是如果我打開Chrome(我假設其他人)並直接訪問update.php文件,則會下載該文件。
值得注意的是,我試圖回顯HTML頁面,但它弄亂了系統的工作方式。 我希望對此有某種.htaccess技巧。
if (isset($_POST['action'])) {
switch ($_POST['action']) {
case 'version':
echo '1.1';
break;
case 'info':
$obj = new stdClass();
$obj->slug = 'plugin.php';
$obj->plugin_name = 'plugin.php';
$obj->new_version = '1.1';
$obj->requires = '3.0';
$obj->tested = '3.3.1';
$obj->downloaded = 12540;
$obj->last_updated = '2012-01-12';
$obj->sections = array(
'description' => 'The new version of the Auto-Update plugin',
'another_section' => 'This is another section',
'changelog' => 'Some new features'
);
$obj->download_link = 'http://localhost/update.php';
echo serialize($obj);
case 'license':
echo 'false';
break;
}
} else {
header('Cache-Control: public');
header('Content-Description: File Transfer');
header('Content-Type: application/zip');
readfile('update.zip');
}
如果您的代碼未收到$_POST['action']
,則在else
情況下將update.zip
發送到瀏覽器。
不通過POST訪問文件時看到的內容不會混淆PHP。 而是將update.zip
文件的內容發送到瀏覽器以進行下載。 但是由於代碼沒有在標頭中提供文件名提示,因此它不以update.zip
,而是看起來像是一個.php文件,其名稱與腳本相同。
如果希望update.zip
看起來像一個zip文件,請在Content-Disposition
輸出標頭中添加一個filename
:
header('Cache-Control: public');
header('Content-Description: File Transfer');
// Change to attachment disposition, with filename
header('Content-Disposition: attachment; filename=update.zip');
header('Content-Type: application/zip');
readfile('update.zip');
現在,如果您根本不希望它發送update.zip
,請從底部刪除整個else {}
塊,然后將其替換為
else {
echo "You must supply an action...";
}
wp_autoupdate.php
將訪問限制為僅對引薦 請咨詢$_SERVER['HTTP_REFERRER']
,但知道可以欺騙該值。 不能以100%的可靠性使用。
if (strpos($_SERVER['HTTP_REFERER'], 'wp_autoupdate.php') !== FALSE) {
// Include all your exsiting code
}
else {
// Don't do anything, or redirect somewhere else
header("Location: /");
exit();
}
為了達到100%的可靠性,您可能需要修改wp_autoupdate.php
來設置一個會話變量,然后由update.php
檢查該變量,以確保請求來自正確的位置。
您將內容類型設置為application / zip,在大多數瀏覽器中都會提示下載。 您是否有可能沒有通過POST傳遞“操作”,這就是為什么它會觸及其他部分?
我看到的另一件事是你沒有
break;
在第二個開關/案例中。
$obj->download_link = 'http://localhost/update.php';
echo serialize($obj);
break; // <------ this is missing!
case 'license':
echo 'false';
break;
您是否查看過本文: http : //konstruktors.com/blog/wordpress/2538-automatic-updates-for-plugins-and-themes-hosted-outside-wordpress-extend/
關於限制除WordPress以外的所有人對文件的訪問,是否托管WordPress網站是未知的。 如果這樣做,則可以在.htaccess文件中限制對localhost或127.0.0.1的訪問。 如果托管在WordPress.com上,則可以找到其IP或主機名並進行更改。
<Files update.php>
Order allow,deny
Deny from all
Allow from 127.0.0.1
</Files>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.