防止直接url访问php文件

时间:2015-11-30 13:12:08

标签: php html .htaccess server

我的网站上有一个php文件说“check.php”,并在提交表单时执行。

说我的网站是“myweb.com”,而php文件位于“PHP”目录中

我想阻止直接网址访问“check.php”文件,即如果有人输入网址“ myweb.com/PHP/check.php ”,然后不应该执行php文件,它应该返回错误消息。

我试图通过在.htaccess中设置规则来阻止访问,但即使我尝试提交表单,它也会阻止php。

.htaccess规则:

RewriteEngine on 
RewriteCond %{THE_REQUEST} \.php[\ /?].*HTTP/ 
(.*)\.php$ /index.html [L] 

有没有办法做到这一点?

7 个答案:

答案 0 :(得分:17)

你可以用PHP

来做
<?php
    /* at the top of 'check.php' */
    if ( $_SERVER['REQUEST_METHOD']=='GET' && realpath(__FILE__) == realpath( $_SERVER['SCRIPT_FILENAME'] ) ) {
        /* 
           Up to you which header to send, some prefer 404 even if 
           the files does exist for security
        */
        header( 'HTTP/1.0 403 Forbidden', TRUE, 403 );

        /* choose the appropriate page to redirect users */
        die( header( 'location: /error.php' ) );

    }
?>

答案 1 :(得分:5)

将此代码放在check.php的顶部:

if(!isset($_SERVER['HTTP_REFERER'])){
    // redirect them to your desired location
    header('location:../index.php');
    exit;
}

如果用户通过直接输入网址来访问check.php,则会将其重定向到您想要的位置。

答案 2 :(得分:3)

在Root / .htaccess中尝试:

RewriteEngine on


RewriteCond %{REQUEST_METHOD} !^POST$
RewriteRule ^php/check.php$ - [NC,R=404,L]

如果没有通过表单发布方法访问check.php,则会返回404。

答案 3 :(得分:1)

我尝试了选定的答案,但是在实现它时遇到了一些问题,尤其是当我想使用GET和Ajax从PHP文件中的函数返回值时。

在对其他解决方案进行了广泛的研究(并做了一些我自己的测试)之后,我想到了以下代码:

<?php
$currentPage = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

if ($_SERVER['REQUEST_METHOD'] == "GET" && strcmp(basename($currentPage), basename(__FILE__)) == 0)
{
    http_response_code(404);
    include('myCustom404.php'); // provide your own 404 error page
    die(); /* remove this if you want to execute the rest of
              the code inside the file before redirecting. */
}
?>

我发现上面的代码可以按我的意愿工作,并且我认为它不会像其他指出的那样对多个浏览器产生任何问题。我也认为它不会有任何安全性问题,但是我可能是错的(请告诉我我是否(以及为什么)),我对Web编程还是比较陌生的。

只需将该代码添加到您要阻止直接URL访问的每个文件的顶部(在所有内容,甚至要求,包括include和session_starts之前),您就可以开始使用

答案 4 :(得分:1)

这是Google在其php示例中使用的

if (php_sapi_name() != 'cli') {
  throw new \Exception('This application must be run on the command line.');
}

答案 5 :(得分:0)

也试试这个。过去在check.php的顶部

<?php debug_backtrace() || die ("<h2>Access Denied!</h2> This file is protected and not available to public."); ?>

当文件直接在网址

中访问时,将显示拒绝访问

答案 6 :(得分:0)

if (basename($_SERVER['SCRIPT_FILENAME']) === 'common.php')
{
    exit('This page may not be called directly!');
}