簡體   English   中英

直接訪問即可下載PHP文件

[英]PHP file downloads on direct visit

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

如果您的代碼未收到$_POST['action'] ,則在else情況下將update.zip發送到瀏覽器。

不通過POST訪問文件時看到的內容不會混淆PHP。 而是將update.zip文件的內容發送到瀏覽器以進行下載。 但是由於代碼沒有在標頭中提供文件名提示,因此它不以update.zip ,而是看起來像是一個.php文件,其名稱與腳本相同。

如果希望update.zip看起來像一個zip文件,請在Content-Disposition輸出標頭中添加一個filename

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檢查該變量,以確保請求來自正確的位置。

您將內容類型設置為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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM