阻止直接访问PHP脚本
我修改了.htaccess以删除阻止直接访问PHP脚本,php,Php,我修改了.htaccess以删除.php扩展名 下面的代码是我用| |$parts['filename']修改的,不允许直接访问。我的目标是阻止直接访问/page.php或/page,但它不起作用 /***************DO NOT ALLOW DIRECT ACCESS************************************/ $parts = pathinfo(__FILE__); if ( stripos( $_SERVER[ 'REQUEST_URI' ], (
.php
扩展名
下面的代码是我用| |$parts['filename']
修改的,不允许直接访问。我的目标是阻止直接访问/page.php
或/page
,但它不起作用
/***************DO NOT ALLOW DIRECT ACCESS************************************/
$parts = pathinfo(__FILE__);
if ( stripos( $_SERVER[ 'REQUEST_URI' ], (basename( __FILE__ ) || $parts['filename'] )) !== FALSE ) {
header("Location: ./");
die();
}
mod之前的代码阻止访问/page.php
,但允许访问/page
(我不希望这样)
如何阻止对
/page.php
和/page
的访问?如果您不想访问页面,请执行以下操作:
if(!defined("IN_SCRIPT")) die();
确保在包含该文件的每个脚本中定义IN_脚本
phpBB等软件也使用这种方法 在您的索引中放置
session_start();
$_SESSION['logged'] = "OK";
然后在要验证的每个其他文件上包括
session_start();
$login = isset($_SESSION["logged"]) ? $_SESSION["logged"] : false;
if($login != "OK"){
header("Location: path/to/your/index");
exit;
}
要能够包含来自其他脚本的文件,但不允许通过apache直接提供服务,请执行以下操作: 在要阻止直接访问的任何php文件的顶部:
<? __FILE__ != $_SERVER['SCRIPT_FILENAME'] || die('no direct access' );
test.php
加载/test-inc.php和/test-inc的输出
您可以将page.php移到公共根目录之外吗?而只需使用代码即可。如果确实要从.php文件执行此操作,请检查是否有正确的
$\u服务器['HTTP\u REFERER']
。它将保存用户来自的URL。如果它是空的或与站点的URL不同,那么它是“直接访问”,正如您所说:)因此,您希望能够包含来自另一个脚本的文件,但不希望文件本身能够通过web服务器提供服务?在我看来,这听起来是一个非常难以维护的解决方案。为什么不纠正htaccess规则,这样既不能访问page.php,也不能访问page。然后所有逻辑都在一个位置。他想阻止对目录的访问,而不是.phpfile@thelolcat你说它无法维护,但实际上很多脚本已经使用了这种技术。这是一个糟糕的解决方案,他想阻止访问“文件夹”而不是文件。@user2854563:不,他没有。他使用了mod_rewrite,因此可以在没有.php扩展名的情况下访问该文件。@user2854563他没有!引用他的话!为什么会被否决?使用会话实际上对OP的caseSession有效,在使用会话之前必须先启动会话。没有任何迹象表明第二个脚本必须包含在第一个脚本中,这样函数就不会被调用twice@onetrickponyOP的代码试图根据文件名阻止该文件,因此除了包含脚本外,没有其他方法可以运行脚本。
<? __FILE__ != $_SERVER['SCRIPT_FILENAME'] || die('no direct access' );
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
<?
header( 'content-type: text/plain');
var_dump( __FILE__ == $_SERVER['SCRIPT_FILENAME'] );
include 'test-inc.php';
<? __FILE__ != $_SERVER['SCRIPT_FILENAME'] || die('no direct access' );
var_dump( __FILE__ == $_SERVER['SCRIPT_FILENAME'] );
bool(true)
bool(false)
no direct access