我有一个php文件,我将作为一个包含专门使用.因此,当我通过输入URL而不是包含它来直接访问它时,我想抛出一个错误而不是执行它.
基本上我需要在php文件中进行如下检查:
if ( $REQUEST_URL == $URL_OF_CURRENT_PAGE ) die ("Direct access not premitted");
是否有捷径可寻?
将其添加到您只想包含的页面中
然后在包含它的页面上添加
在您可能或可能无法完全控制的Apache服务器上运行的通用"PHP应用程序"最简单的方法是将您的包含放在目录中,并拒绝访问.htaccess文件中的该目录.为了省去Googling的麻烦,如果你正在使用Apache,请将它放在你不想访问的目录中名为".htaccess"的文件中:
Deny from all
如果您实际上完全控制了服务器(这些天甚至对于小应用程序来说比我第一次写这个答案时更常见),最好的方法是将要保护的文件粘贴到Web服务器所服务的目录之外. .因此,如果您的应用程序处于中/srv/YourApp/
,请将服务器设置为提供文件/srv/YourApp/app/
并将其包含在内/srv/YourApp/includes
,因此实际上并不存在可以访问它们的任何URL.
我有一个文件,我需要采取不同的行动,包括它直接访问(主要是一个print()
vs return()
)这里有一些修改过的代码:
if(count(get_included_files()) ==1) exit("Direct access not permitted.");
被访问的文件始终是包含文件,因此== 1.
阻止直接访问文件的最佳方法是将它们放在Web服务器文档根目录之外(通常在上面一级).您仍然可以包含它们,但不可能有人通过http请求访问它们.
我通常会一路走下去,并将所有PHP文件放在文档根目录之外的bootstrap文件中 - 文档根目录中的一个独立的index.php,它开始路由整个网站/应用程序.
Chuck解决方案的另一种选择(或补充)是通过在.htaccess文件中放置类似的东西来拒绝访问与特定模式匹配的文件
Order deny,allow Deny from all
if( count(get_included_files()) == ((version_compare(PHP_VERSION, '5.0.0', '>='))?1:0) ) { exit('Restricted Access'); }
逻辑:如果不满足最小包含计数,PHP将退出.请注意,在PHP5之前,基页不被视为包含.
// In the base page (directly accessed): define('_DEFVAR', 1); // In the include files (where direct access isn't permitted): defined('_DEFVAR') or exit('Restricted Access');
逻辑:如果未定义常量,则执行不会从基页开始,PHP将停止执行.
// Call the include from the base page(directly accessed): $includeData = file_get_contents("http://127.0.0.1/component.php?auth=token"); // In the include files (where direct access isn't permitted): $src = $_SERVER['REMOTE_ADDR']; // Get the source address $auth = authoriseIP($src); // Authorisation algorithm if( !$auth ) exit('Restricted Access');
除非提供内部请求的会话令牌,否则此方法的缺点是隔离执行.在单个服务器配置的情况下通过环回地址进行验证,或者在多服务器或负载平衡的服务器基础结构的地址白名单中进行验证.
与前面的方法类似,可以使用GET或POST将授权令牌传递给包含文件:
if($key!="serv97602"){header("Location: ".$dart);exit();}
一种非常混乱的方法,但也许是最安全和多功能的同时,以正确的方式使用.
大多数服务器允许您为单个文件或目录分配权限.您可以将所有包含放在此类受限目录中,并将服务器配置为拒绝它们.
例如,在APACHE中,配置存储在.htaccess
文件中.这里的教程.
但请注意,我不建议使用特定于服务器的配置,因为它们不适合跨不同Web服务器的可移植性.在拒绝算法很复杂或者拒绝目录列表相当大的情况下,它可能只会使重新配置会话变得非常可怕.最后,最好在代码中处理这个问题.
由于服务器环境中的访问限制,最不受欢迎,但如果您有权访问文件系统,则这是一种相当强大的方法.
//Your secure dir path based on server file-system $secure_dir=dirname($_SERVER['DOCUMENT_ROOT']).DIRECTORY_SEPARATOR."secure".DIRECTORY_SEPARATOR; include($secure_dir."securepage.php");
逻辑:
用户无法请求文件htdocs
夹外的任何文件,因为链接不在网站的地址系统范围内.
php服务器本地访问文件系统,因此可以访问计算机上的文件,就像具有所需权限的普通程序一样.
通过将包含文件放在此目录中,可以确保php服务器可以访问它们,同时拒绝用户进行热链接.
即使Web服务器的文件系统访问配置未正确完成,此方法也会阻止这些文件意外泄露.
请原谅我的非正统编码约定.任何反馈都表示赞赏.
实际上我的建议是做所有这些最佳实践.
将文档放在webroot OR之外,或者放在Web服务器AND拒绝访问的目录中
在可见文档中使用隐藏文档检查的定义:
if (!defined(INCL_FILE_FOO)) { header('HTTP/1.0 403 Forbidden'); exit; }
这样,如果文件以某种方式错位(错误的ftp操作),它们仍然受到保护.
我曾经遇到过这个问题,解决了:
if (strpos($_SERVER['REQUEST_URI'], basename(__FILE__)) !== false) ...
但理想的解决方案是将文件放在Web服务器文档根目录之外,如另一个anwser中所述.
你最好用一个入口点构建应用程序,即应该从index.php到达所有文件
将它放在index.php中
define(A,true);
此检查应在每个链接文件中运行(通过require或include)
defined('A') or die(header('HTTP/1.0 403 Forbidden'));
我想直接限制对PHP文件的访问,但是也可以通过调用它jQuery $.ajax (XMLHttpRequest)
。这对我有用。
if (empty($_SERVER["HTTP_X_REQUESTED_WITH"]) && $_SERVER["HTTP_X_REQUESTED_WITH"] != "XMLHttpRequest") { if (realpath($_SERVER["SCRIPT_FILENAME"]) == __FILE__) { // direct access denied header("Location: /403"); exit; } }