0

在我的一个网站中,我$_SERVER['REQUEST_URI']用来确定非注册用户是否可以看到页面内容。

在手册中有关于$_SERVER['REQUEST_URI']

为访问此页面而提供的 URI;例如,'/index.html'。

我的问题是,客户端是否可以通过任何客户端方式访问,例如。index.php 即使$_SERVER['REQUEST_URI']包含不同的值?

我知道其中$_SERVER['REQUEST_URI']包含客户端询问的页面和服务器返回的页面,但如果我不时不时问自己这些问题,我会不高兴

$_SERVER['REQUEST_URI']以这种方式使用也被认为是好的做法吗?

编辑:我包含了我使用的脚本,因为它太通用了

list($c_page) = explode('.',substr($_SERVER['REQUEST_URI'],1));
define('C_PAGE',$c_page ?: 'index');
define('LOGGED',$_SESSION['user']['id'] ?: 0);
if(in_array(C_PAGE,array('page_1','page_2','page_3')) && !LOGGED){ header('Location: login.html'); exit; }
4

3 回答 3

1

您应该使用会话变量(或 cookie)真正跟踪他们的入口。其中任何一个都可以被阻止......但它们更接近“万无一失”。也就是说,任何东西都可以伪造......所以如果安全性至关重要,请使用组合和/或强大的唯一字符串。

于 2012-11-15T09:11:34.933 回答
0

就个人而言,我发现声明一个或多个应该有权访问文件的用户组(类)更可靠,然后包含一个页面,如果登录用户不在这些组中,则返回 401 错误。例如

session_start();
...
$access = 'admin';
include 'inc/guard.php';

听起来在您的情况下,您想要“公共”和“登录”,这略有不同,但我的警卫脚本也涵盖了这种情况。在那里,我只是检查$_SESSION变量是否为空(我在登录时将内容插入其中):

if($access != 'public' && empty($_SESSION)) {
    header('HTTP/1.1 401 Unauthorized', true);
    include 'inc/login.php';
    exit;
}
于 2012-11-15T09:07:52.257 回答
0

根据您使用的服务器端软件堆栈,此变量由网络服务器或 fastcgi 包装器设置。

硬件/软件堆栈中的 URL 重写和不透明代理会影响您在脚本中看到的值。

例如,Nginx 可以将 URL 从 /test.html 重写为 /index.php?action=test,然后将其传递给您的网络服务器。当您的应用程序看到 /index.php?action=test 时,用户会调用 /test.html

结论:REQUEST_URI 是传递给网络服务器的 URI,可以作为基于 URL 的访问控制的参考。

编辑:

只是为了避免混淆,因为我已经看到了其他回复......

据我了解,您的问题是:您想检查当前请求且已获得密码授权的用户是否有足够的权限来访问特定的 URL。同样,是的,您可以使用请求 uri 作为参考值

于 2012-11-15T09:14:13.777 回答