3

まず第一に、同様の質問がStack Overflowにあると確信していますが、実際には見つかりませんでした。おそらく私が間違ったキーワードを使用しているためです。だから私を撃たないでください。

私の質問は基本的に、phpファイルを含めたいのですが、それらを含めたいだけで、人々がブラウザで開かないようにしたいのです。エラーが発生するはずです。

たとえば、DBへの接続(パスワードなど。危険ですか?)を含むphpファイルを含むincludesディレクトリがあります。含めたいのですが、直接ページにアクセスしてほしくないです。

htaccessを使用してincludesディレクトリにパスワードを設定すると問題が解決しますか?最初はそうはならないと思いました。アクセスできないユーザーのためにページを含めることができるのは奇妙なことだからです。しかし、それはうまくいくようです、これはどうやって来るのですか?他にもっと良いオプションはありますか?Web開発者は通常何をしますか?

また、JavaScriptファイルに対して同様のことを行うことはできますか?私の推測では、これは当てはまらないと思いますが、私はただ尋ねています。jsファイルには特定のページへのajax呼び出しが含まれていますが、phpページにアクセスしないように保護できれば幸いです。

とにかく事前に感謝します:)

4

5 に答える 5

9

ピースがどのように連携するかを説明することで、混乱を解消できると思います。

(ユーザーのWebブラウザーから)要求が届きます。Webサーバー(この例ではApache)がこれを受け取ります。まず、<Location>権限を確認します。次に、残りの構成を調べ、最終的に要求URIをファイルシステムにマップします。これで、最後に、<Directory>権限と同様にチェックでき.htaccessます。

これらの権限チェックのいずれかが失敗した場合(たとえばdeny from all)、Apacheは要求の処理を停止し、エラー(またはHTTP基本認証の場合はユーザー名とパスワードの要求)を返します。

すべての権限チェックに合格すると、Apacheはファイルを調べ、そのファイルに気づき.phpます。(またはWebホストの)Apache構成のどこかに、AddHandlerこの要求をPHPエンジン(mod_phpまたはfast cgiを介して)に渡すようにApacheに指示するディレクティブがあります。(ほとんどのファイルでは、代わりにファイルの内容をブラウザーに送信します。ただし、スクリプトファイルはそのため特別ですAddHandler。)

これで、PHPがスクリプトファイルを読み取ります。次に、インクルードファイルを直接読み取ります。これはApacheを介して戻らないため、のようなもの.htaccessは適用されません。また、PHPインクルードがドキュメントルートにある必要がないことも意味します。これらは、PHPプロセスがアクセスできる場所であればどこでもかまいません(UNIXのアクセス許可とPHPの構成に基づく)。php.iniにinclude_dirを設定すると、これらをどこにでも簡単に配置できます。

クライアント側のJavaScriptは、ユーザーのブラウザによって実行されます。サーバー側では解釈されません(PHPのように)。したがって、ユーザーが.htmlファイルにアクセスできる必要があるのと同じように、ユーザーはそれにアクセスできる必要があります。

つまり、要するに:

  • PHPのインクルードディレクトリに.htaccesswithを入れることができます。Deny from allPHPのincludeディレクティブはApacheを経由しないため、気にしません。理想的には、PHPインクルードディレクトリをドキュメントルートの下に配置しないでください。
  • JavaScriptへのアクセスはApacheを経由するため(.html、.pngなどのアクセスと同様)、JavaScriptに対してこれを行うことはできません。
于 2012-06-06T23:06:53.253 に答える
3

理想的には、PHPインクルードは、Webに直接アクセスできないフォルダーにある必要があります。

例:Webサイトがにあるとすると、そこに/var/www/htdocs/配置index.phpしますが、インクルードはWebアクセス可能領域の外側の別のフォルダーにある必要があります。この例では、PHPに含まhtdocsれるものが存在する、のような名前のフォルダーを横に置くことができます。/var/www/includes/

このようにして、不要な直接Webアクセスから完全に保護されます。

さらに、インクルードファイルにクラスまたは関数のみが含まれるようにPHPコードを作成する必要があります。つまり、Webから何らかの方法でアクセスしても、何も起こりません。PHPはすべての関数をロードしますが、いずれも実行しないため、ユーザーには空白のページが表示されます。

別のページがそのファイルをインクルードしたい場合は、インクルードしてから、その中の関数を呼び出す必要があります。コードをすぐに実行するインクルードは必要ありません。

など、ユーザーが直接アクセスすることを目的としたページですぐに実行されるPHPコードのみを記述してくださいindex.php

お役に立てば幸いです。

于 2012-06-06T23:06:37.667 に答える
2

.htaccessを使用せずにこれを行うオプションがあります(これがより良い解決策であると言っているのではなく、単に別の解決策です)。

ユーザーが直接アクセスするファイルでは、インクルードの前に次のように入力します。

@define('IN_APPLICATION', true);
require 'file.class.php'; //sample include

次に、インクルード(クラスファイル)で、次のコードを一番上に配置します。

if (!defined('IN_APPLICATION')){
    die(header('HTTP/1.0 404 Not Found')); //or just die();
}

これにより、を定義するファイル(フロントエンド)に含まれている場合にのみクラスファイルにアクセスできるようになりますIN_APPLICATIONdie()あるいは、404を偽造するのではなく、それ自体でクラスファイルを強制終了することもできます。

于 2012-06-06T23:11:47.247 に答える
1

インクルードディレクトリに.htaccessファイルを作成します

deny from all

ブラウザがスクリプトにアクセスできる必要があるため、クライアント側のスクリプトに対しては実行できません。あなたができる最善のことはそれらを難読化することです。

于 2012-06-06T22:57:35.263 に答える
0

うーん、すでに述べたように、htaccessはphpがhtpasswordで保護されたフォルダにアクセスするのを妨げません。したがって、少なくともhttps IMHOでは、非常に安全なセキュリティ機能を使用するために、Apacheを呼び出す必要があります。

header('Location: secret/index.php');

フォルダシークレットがhtaccessで保護されている場所。

index.phpは次のようになります。

<?php
$a = $_REQUEST['a'] ;
if ($a==secret)  
    header('Location: secret/index.php');    
include_once("index_head.php");
include_once("index_tail.php");
?>

そしてsecret/index.php

<?php 
include_once("../index_head.php");
include_once("./secret.php");
include_once("../index_tail.php");
?>

現在残っている主な問題は、secret / index.phpが./main.cssなどのリンクを検出しないことです。したがって、リンクは相対的ではなく絶対的に定義する必要がありますが、これを行う方法は間違いありません。 )。

実行例はhttp://promotio.ch/secret.php/にあります

于 2015-02-07T20:29:34.083 に答える