$ _SERVER ['REQUEST_URI']可靠性?

时间:2012-11-15 08:52:47

标签: php webserver

在我的某个网站中,我使用$_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; }

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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;
}

答案 2 :(得分:0)

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

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

e.g。 Nginx可以将/test.html中的URL重写为/index.php?action=test,然后将其传递给您的网络服务器。当您的应用程序看到/index.php?action=test

时,用户会调用/test.html

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

编辑:

只是为了避免混淆,因为我已经看到了其他的反应......

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