Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
直接访问PHP文件下载_Php_.htaccess_Download - Fatal编程技术网

直接访问PHP文件下载

直接访问PHP文件下载,php,.htaccess,download,Php,.htaccess,Download,我非常清楚PHP是一种服务器端语言,因此不应允许下载PHP文件。然而,在Chrome中直接访问PHP文件时,它会下载一个模糊版本的文件,这是我想要阻止的。有没有办法阻止文件被送达 代码如下。 该系统在WordPress内部运行得非常完美,但是如果我打开Chrome(我猜是其他浏览器)并直接访问update.php文件,它就会下载 值得注意的是,我试图回显一个HTML页面,但它扰乱了系统的工作方式。我希望能有一些。htaccess的窍门 if (isset($_POST['action'])) {

我非常清楚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');
}

如果您的代码没有收到
$\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>