我有一个php包含其中的一个函数,我需要确保它只能通过包含在本地文件中执行,而不是从任何外部源。
最好的测试方法是什么?
-谢谢肖恩
更新:谢谢,这里有一些更多的信息,-我不能把它移出网页,我正在更新一个现有的网站-测试REMOTE_ADDR将总是返回客户端的ip-我想要这个文件调用的唯一方式是:include_once "sendmail.php";
我看到了两种情况:
-
文件可以使用任何浏览器通过http访问。在这种情况下,可以在主应用程序中定义CONST,然后检入include:
主要文件:define('MY_APP', true);
包括文件:
if (!defined('MY_APP') || MY_APP !== true) { die('Access denied'); }
- 文件可以通过文件系统访问(例如从附近的虚拟主机)。那么您可以使用SERVER_NAME和REQUEST_URI检查。
忘记测试。请将文件保存在web浏览器之外。
如果它不能通过HTTP提供,那么它就不能在外部使用。
(但是,如果它只包含一个函数,并且没有自动执行的语句,那么任何外部请求都将以空白HTTP响应结束,除非服务器开始以纯文本形式提供PHP文件)
如果你总是在同一个文件中包含并执行它,你可以在你的函数中做一个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...
}
}
您可以使用$_SERVER数组返回调用者的IP。
$callerIP = $_SERVER['SERVER_ADDR'];
您可以检查$callerIP是否为localhost