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.zipelse

POSTを介さずにファイルにアクセスしたときに表示されるのは、難読化されたPHPではありません。むしろ、ファイルの内容update.zipをダウンロードのためにブラウザに送信しています。ただし、コードはヘッダーにファイル名のヒントを提供しないため、そのようにはならずupdate.zip、代わりに、スクリプトと同じ名前の.phpファイルのように見えます。

zipファイルのように見せたい場合は、出力ヘッダーupdate.zipにを追加します。filenameContent-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();
}

wp_autoupdate.php100%の信頼性を実現するには、セッション変数を設定するように変更する必要があります。セッション変数は、によってチェックされupdate.php、要求が適切な場所から送信されたことを確認します。

于 2012-07-26T20:00:43.313 に答える
0

コンテンツタイプをapplication/zipに設定します。これは、ほとんどのブラウザでダウンロードを促します。POSTを介して「アクション」を渡していない可能性があります。そのため、他のセクションにヒットしていますか?

私が見るもう一つのことはあなたが持っていないということです

break;

2番目のスイッチ/ケース。

      $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 に答える