直接访问PHP文件下载
我非常清楚PHP是一种服务器端语言,因此不应允许下载PHP文件。然而,在Chrome中直接访问PHP文件时,它会下载一个模糊版本的文件,这是我想要阻止的。有没有办法阻止文件被送达 代码如下。直接访问PHP文件下载,php,.htaccess,download,Php,.htaccess,Download,我非常清楚PHP是一种服务器端语言,因此不应允许下载PHP文件。然而,在Chrome中直接访问PHP文件时,它会下载一个模糊版本的文件,这是我想要阻止的。有没有办法阻止文件被送达 代码如下。 该系统在WordPress内部运行得非常完美,但是如果我打开Chrome(我猜是其他浏览器)并直接访问update.php文件,它就会下载 值得注意的是,我试图回显一个HTML页面,但它扰乱了系统的工作方式。我希望能有一些。htaccess的窍门 if (isset($_POST['action'])) {
该系统在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');
}
如果您的代码没有收到
$\u POST['action']
,则会将update.zip
发送到else
案例中的浏览器
当您不通过POST访问文件时,所看到的并不是模糊的PHP。相反,它将文件update.zip
的内容发送到浏览器进行下载。但是,由于代码没有在标题中提供文件名提示,因此它不是update.zip
,而是看起来像一个与脚本同名的.php文件
如果希望update.zip
看起来像zip文件,请将文件名
添加到内容配置
输出标题中:
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\u autoupdate.php
请咨询$\u服务器['HTTP\u referer']
,但要知道此值可能会被欺骗。这不能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传递“动作”,这就是为什么它会出现在else部分
我看到的另一件事是你没有
break;
在您的第二个开关/案例中
$obj->download_link = 'http://localhost/update.php';
echo serialize($obj);
break; // <------ this is missing!
case 'license':
echo 'false';
break;
$obj->下载链接http://localhost/update.php';
echo序列化($obj);
中断;//我们更喜欢在这里发布代码,而不是在下面链接。合理数量的相关代码不会被认为是杂乱无章的。好吧,我不确定有多少代码会被认为是可以接受的。迈克尔,你知道为什么下载吗?对我来说没有意义。文件正在下载,因为您设置了标题内容类型,在大多数浏览器中都会提示下载。@chriscct7请参见下面我的答案……虽然这确实停止了问题,但它创建了另一个标题内容类型。代码被用来更新一个高级插件,因此随着代码的增加,它现在下载一个插件的副本(这是我想要避免的)。如果(wordpress){使用我已有的标题}或者服务于空白页或者其他什么东西,有没有办法抛出(请原谅伪代码)?@chriscct7这是我刚才添加的,替换了Else{}
的大小写。但是我需要这些标题,否则WordPress将不进行更新。发布到update.php的脚本的名称是什么?您可以检查引用者,如果不正确,则中止。如何检查引用脚本?这与标题一起使我的问题更有趣。现在需要这些头,WordPress可以下载更新,但另一方面,这些头也允许普通人下载zip文件。我怎样才能避免这种情况?谁会知道这个path update.php,或者你是否担心有人会猜到它?我添加了一个建议的.htaccess配置。如果访问的人没有将数据发布到站点,他们将始终满足发送标题并提示下载的else条件。你可以像我展示的那样限制访问,或者你可以改变你的逻辑,不在else条件中包含标题,但是这可能是WordPress所需要的。这是一个WordPress插件。因此,我不知道每个用户的ip地址。至于链接,当你在WP中升级一个插件时,它会在更新过程中显示出来。所以你是在为其他网站托管插件。我懂了。该文件是否必须命名为update.php,或者您可以对其进行模糊处理?如果必须是该文件,则有人可以“猜测”路径/名称。也许你想得太多了,如果你允许人们下载这个update.zip,那么如果他们猜到了,就让它下载吧。如果是这种情况,只需修复您的头,这样它就可以正确保存文件名,而不用担心它。
<Files update.php>
Order allow,deny
Deny from all
Allow from 127.0.0.1
</Files>