0

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

2 回答 2

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,确保请求来自正确的位置。

于 2012-07-26T20:00:43.313 回答
0

您将内容类型设置为 application/zip,在大多数浏览器中都会提示下载。您是否有可能没有通过 POST 传递“动作”,这就是为什么它会触及 else 部分?

我看到的另一件事是你没有

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>
于 2012-07-26T20:00:46.713 回答