直接访问PHP文件下载

时间:2012-07-26 19:56:09

标签: php .htaccess download

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

2 个答案:

答案 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;

您是否查看了这篇文章: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>