2017-05-07 32 views
3

我在Apache上使用PHP,并想知道是否有方法可以从客户端指出所请求的PHP文件不应该被执行/解析。按照标准,我希望在请求时执行所有的PHP文件,但是我想要一种方式来从客户端指出文件不应该被执行。告诉Apache是​​否对请求执行PHP

一个很好的解决方案是使用JavaScript在请求中提供一个额外的头文件,然后在.htaccess文件中编写一些代码来检查头文件是否存在,以及是否告诉apache不执行文件并只提供它作为文本。

使用GET参数或其他东西也可以。

这可能吗?如果是这样,怎么样?

+0

看一看[mod_rewrite的(https://httpd.apache.org/docs/current/mod/mod_rewrite.html)。您可以将请求重写为一些sendource.php脚本。 –

+0

为什么不决定服务器端哪些文件未分析的输出应该是一个选项,而不是让客户端选择要分析的服务器的文件?这样,您可以更加确定敏感数据不会泄漏。 –

+0

@LucasKrupinski所有文件都应该可以解析,并且最好默认。对于某些目录中的文件,我希望发送源代码作为选项。 – tjespe

回答

1

在请求中提供额外的头[使用JavaScript],然后写一些代码在.htaccess文件来检查头部存在

你可以得到阿帕奇检查这个(秘密)标题,并在内部将请求重写为viewAsSource.php类型的文件,然后读取REQUEST_URI(或传递的查询字符串参数)并返回文件源。类似于@LucasKrupinski的建议,除了你不需要在PHP文件中包含任何东西。

例如,在根.htaccess文件:

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] 

对于所有.php请求此检查具有“显示源”的值的X-Action HTTP请求报头和所请求的文件是否存在。如果满足这些条件,则将该请求内部写入/tools/display-source.php脚本,并在url参数中传递URL。您可以改为检查超全局,但请注意,这还包括在请求上传递的任何查询字符串。

然后,在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

如果您将_absolute URL_传递给'highlight_file()'函数(或任何其他类似的PHP函数),则会发生这种情况。这必须是文件系统路径。 – MrWhite

2

您的PHP文件可以多加一行吗?

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? “他们得到的源代码?

3

您还可以设置在.htaccess文件处理程序(或服务器配置为好):

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

然后,你需要设置一个符号链接到PHP文件,在Linux系统上:

ln -s filename.php filename.phps 

请求filename.phps时,您将获得语法高亮显示的源代码。

Require all granted是Apache 2.4中的语法。较早的版本使用Allow from allDeny from none