2017-05-07 12 views
3

私はApacheでPHPを使用していますが、要求されたPHPファイルを実行/解析しないようにクライアント側から指示する方法があるのだろうかと思います。標準では、要求されたときにすべてのPHPファイルが実行されるようにしたいが、クライアント側からファイルを実行しないように指示する方法が必要である。要求にPHPを実行するかどうかをApacheに伝える

JavaScriptを使用してリクエストに余分なヘッダーを指定し、.htaccessファイルにコードを書き込んでヘッダーが存在するかどうかを確認し、ファイルを実行せずにテキストとして。

GETパラメータなどを使用しても問題ありません。

これは可能ですか?もしそうなら、どうですか?

+0

は[mod_rewriteの](https://httpd.apache.org/docs/current/mod/mod_rewrite.html)を見てください。要求をいくつかのsendsource.phpスクリプトに書き換えることができます。 –

+0

クライアントがサーバが解析するファイルを選択できるようにするのではなく、解析されない出力がオプションになるファイルをサーバ側で決めるのはなぜですか?そうすれば、機密性の高いデータが漏洩しないことがはるかに確実になります。 –

+0

@LucasKrupinskiすべてのファイルは解析が可能でなければなりません。できればデフォルトで解析するのが望ましいでしょう。いくつかのディレクトリにあるファイルについては、ソースをオプションにしたいと思っています。 – tjespe

答えて

1

は秘密(あなたがApacheがこれを確認するために得ることができるヘッダが存在

あるかどうかを確認するために、.htaccessファイルにいくつかのコードを記述し、[JavaScriptを使用して]リクエストに余分なヘッダを供給し、 )ヘッダーを読み取り、REQUEST_URI(または渡されたクエリ文字列パラメーター)を読み取り、代わりにファイルソースを返すviewAsSource.php型ファイルに要求を内部的に書き換えます。 @LucasKrupinskiの提案と似ていますが、PHPファイル自体に何も含める必要はありません。 X-Action HTTPリクエスト・ヘッダーは、このチェックは「表示ソース」の値を有し、要求されたファイルが存在するすべての.php要求に対して

RewriteEngine On 

# Block direct access to any file in the /tools directory 
RewriteCond %{ENV:REDIRECT_STATUS} ^$ 
RewriteRule ^tools/ - [F] 

# Display PHP source... 
RewriteCond %{HTTP:X-Action} ^display-source$ 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule (.+\.php)$ tools/display-source.php?url=$1 [L] 

:ルート.htaccessファイル、例えば

、。これらの条件が満たされた場合、要求は内部で/tools/display-source.phpスクリプトに書き込まれ、urlパラメータのURLが渡されます。代わりに、$_SERVER['REQUEST_URI']スーパーグローバルをチェックすることもできますが、これには要求に渡されるクエリ文字列も含まれています。

はその後、display-source.phpに、のようなもの:

<?php 
$url = isset($_GET['url']) ? $_GET['url'] : null; 
if (isset($url)) { 
    $file = $_SERVER['DOCUMENT_ROOT].'/'.$url; 
    // Validate $file.... 
    // : 
    highlight_file($file); 
} 
+0

これはまさに私が欲しい解決策のようですが、私はそれを動作させることができるかどうかわかります – tjespe

+0

'display-source.php'ファイルとリダイレクトルールを追加しましたが、このJSコードを試してみました:https:/ /jsfiddle.net/7mz4f49s/レスポンスは解析されたファイルでした。 – tjespe

+0

'highlight_file()'関数(または他の同様のPHP関数)に_絶対URLを渡すと起こります。これはファイルシステムのパスでなければなりません。 – MrWhite

2

PHPファイルに余分な行が1つありますか?

1行目:<?php include('viewAsSource.php'); ?>

viewAsSource.php:

<?php 
if(isset($_GET['src'])) { 
    $self = $_SERVER['SCRIPT_FILENAME']; 
    $lines = file($self); 

    $output = ''; 
    foreach ($lines as $line) { 
     $output .= nl2br(htmlspecialchars($line)); 
    } 
    echo $output; 
} 

そうすれば、彼らが解析されたバージョンを取得 "をsample.php" を要求、しかし、彼らは「要求した場合をsample.php SRC場合は? "彼らはソースコードを取得しますか?

あなたはまた、(同様またはサーバー設定) .htaccessファイルにハンドラを設定することができます
3

<FilesMatch "\.phps$"> 
    SetHandler application/x-httpd-php-source 
    Require all granted 
</FilesMatch> 

次にあなたがLinuxシステムでは、PHPファイルへのシンボリックリンクを設定する必要があります。

ln -s filename.php filename.phps 

filename.phpsを要求するときに構文が強調表示されます。

Require all grantedは、Apache 2.4の構文です。古いバージョンはAllow from allDeny from noneを使用しています。

関連する問題