我非常清楚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');
}
答案 0 :(得分:1)
您的代码,如果没有收到$_POST['action']
,则会在update.zip
案例中将else
发送到浏览器。
当您不通过POST访问文件时,您所看到的并不是模糊的PHP。而是将文件update.zip
的内容发送到浏览器进行下载。但由于代码不在头文件中提供文件名提示,因此它不是update.zip
,而是看起来像一个与脚本同名的.php文件。
如果您希望update.zip
看起来像zip文件,请在filename
输出标题中添加Content-Disposition
:
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
进行检查,确保请求来自正确的位置。
答案 1 :(得分:0)
您将内容类型设置为application / zip,在大多数浏览器中都会提示下载。您是否有机会通过POST传递“动作”,这就是为什么它会击中其他部分?
我看到的另一件事是你没有
break;
在你的第二个开关/箱子里。
$obj->download_link = 'http://localhost/update.php';
echo serialize($obj);
break; // <------ this is missing!
case 'license':
echo 'false';
break;
关于限制除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>