测试是否从本地文件调用php include

时间:2011-07-11 19:44:47

标签: php

我有一个包含一个函数的php包含,我需要确保它只能通过包含在本地文件中而不是从任何外部源执行。

测试此方法的最佳方法是什么?

-Thanks -Sean

更新:

谢谢,这里有更多信息, - 我无法将其移到webroot之外,我正在更新现有网站 - 测试REMOTE_ADDR将始终返回客户端IP - 我想要调用此文件的唯一方法是:include_once“sendmail.php”;

4 个答案:

答案 0 :(得分:2)

忘记测试。只需将文件保留在 webroot。

如果无法通过HTTP提供,则无法在外部使用。

(虽然,如果它只包含一个函数,并且没有自动执行的语句,那么除非服务器开始以纯文本形式提供PHP文件,否则任何外部请求都将以空白HTTP响应结束)

答案 1 :(得分:2)

我看到了两个问题:

  1. 可以使用任何浏览器通过http访问文件。在这种情况下,您可以在主应用程序中定义CONST,然后将其包括在内:

    主文件:

    define('MY_APP', true);
    

    包含文件:

    if (!defined('MY_APP') || MY_APP !== true) {
      die('Access denied');
    }
    
  2. 可以通过文件系统(例如附近的虚拟主机)访问文件。您可以使用SERVER_NAME和REQUEST_URI检查。

答案 2 :(得分:1)

如果您始终在同一文件中包含并执行它,则可以在函数中进行URL检查。

function curPageURL() {
     $pageURL = 'http';
     if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
     $pageURL .= "://";
     if ($_SERVER["SERVER_PORT"] != "80") {
         $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
     } else {
         $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
     }
     return $pageURL;
}


//Your included function:
function doSomething() {
    if (curPageUrl() == "http://www.yourwebsite.com/function.php") {
        ... execute code...
    }
}

答案 3 :(得分:1)

您可以使用$ _SERVER数组返回调用者的IP。

$callerIP = $_SERVER['SERVER_ADDR'];

您可以检查$ callerIP是否为localhost。