【问题标题】:prevent direct url access to php file防止直接 url 访问 php 文件
【发布时间】:2016-03-04 03:22:10
【问题描述】:

我的网站中有一个名为 "check.php" 的 php 文件,它在提交表单时执行。

假设我的网站是 "myweb.com" 并且 php 文件在目录 "PHP" 中

我想阻止对“check.php”文件的直接 url 访问,即如果有人键入 url “myweb.com/PHP/check.php”,那么 php 文件不应该被执行,它应该返回一个错误信息。

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

.htaccess 规则:

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

有什么办法吗?

【问题讨论】:

    标签: php html .htaccess server


    【解决方案1】:

    这个问题有很多答案,但我做了类似的事情。

    <?php
        $page = basename($_SERVER['PHP_SELF']);
        
        if($page == "somefile.php"){
          header('Location: index.php');
        }
     ?>
    

    【讨论】:

      【解决方案2】:
      if (basename($_SERVER['SCRIPT_FILENAME']) === 'common.php')
      {
          exit('This page may not be called directly!');
      }
      

      【讨论】:

        【解决方案3】:

        这是 google 在他们的 php 示例中使用的

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

        【讨论】:

          【解决方案4】:

          我尝试了选择的答案,但在实现它时遇到了一些问题,特别是如果我想使用带有 Ajax 的 GET 从 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. */
          }
          ?>
          

          我发现上面的代码可以按我的意愿工作,我认为它不会像其他答案那样对多个浏览器有任何问题。我也不认为它会有任何安全问题,但我可能是错的(如果我是(以及为什么)请告诉我),我对网络编程比较陌生。

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

          【讨论】:

          • URL 末尾的查询字符串 (?) 破坏了这可能是因为当前页面与文件名不匹配。
          【解决方案5】:

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

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

          直接在url中访问文件时会出现Access Denied

          【讨论】:

            【解决方案6】:

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

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

            如果用户通过直接输入 URL 来访问 check.php,它会将他们重定向到您想要的位置。

            【讨论】:

            • 我不推荐这个。出于隐私原因,某些浏览器(如 Firefox)允许用户隐藏 Referer 标头。
            • 这里是旧帖子,但谢谢!我会添加它。我一次又一次地认为 HTTP_REFERER 变量可以被欺骗,但它仍然是另一个无害的工具,可以抵御一些试图攻击我的脚本的人,用黑客尝试填充我的日志。而且,如果您已经有漂亮的模式来警告访问者以确保启用 cookie 等,那么当脚本失败时,我想在某种程度上,无法使用我提供的页面资源是他们自己的错..跨度>
            【解决方案7】:

            在 Root/.htaccess 中试试这个:

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

            如果表单post方法没有访问check.php,这将返回404 not found。

            【讨论】:

            • ^php/check.php$中的'php'表示PHP目录还是文件类型?
            • @ItAssistors 是的,您删除它以将其分配给另一个文件,或者只需在 ^ 和 $ 之间键入根。
            • 这不是一个解决方案,因为 post 方法很容易在客户端被欺骗。
            【解决方案8】:

            你可以用 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' ) );
            
                }
            ?>
            

            【讨论】:

            • 我将它添加到我的 php 文件中,但即使在表单发布操作中,它也会将其重定向到错误页面。无论如何要排除post方法
            • 对此感到抱歉 - 希望这样可以解决问题。然而,@Starkeen 使用 .htaccess 文件的方法可能更好~尽管使用 PHP 确实允许您在重定向用户之前做其他事情 - 即:将命中记录到数据库等
            • 你的方法很有魅力。我只是应用了一点编辑而不是 $_SERVER['REQ.....] == 'GET' 我使用了 .... != 'POST' 因为我使用 post 方法,它应该仅在请求时显示错误不是“发布”谢谢...
            • 很有希望,但无法让它发挥作用。也许我不明白,但我写了一个简短的 PHP 来退出(),响应字符串显示 realpath($_SERVER['SCRIPT_FILENAME']) 和 realpath(FILE) 的内容。无论我是直接将脚本路径插入浏览器,还是从页面上的 XMLHttpRequest() 运行它,这两个字符串都是相同的。我正在阻止使用 cookie 的直接尝试,它似乎有效。当我看到我的日志充满了一些白痴的尝试和尝试时,这真是令人讨厌。希望有办法,比如 BROWSER 数组之类的。
            猜你喜欢
            • 1970-01-01
            • 2012-05-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-29
            • 2016-06-28
            相关资源
            最近更新 更多