1

我想知道我正在使用的东西是否安全:

    Header(“Location:”);

我想这样使用它: $user 将是用户的会话,1 表示管理员。(只是一个例子。)

     if($user != 1){ 
     header("location: index.php"); } 

那么这是否会阻止用户使用该页面,包括下载文件、查看该页面的来源?因为我的管理面板将下载并插入主页..

如果它不安全使用,或者我使用它的方式。我应该改用什么?

谢谢。

4

6 回答 6

2

die()设置 Location 标头后不要忘记。这就是真正阻止人们使用他们不应该使用的页面的原因。

于 2013-04-25T17:39:30.650 回答
2

header()使用是安全的,但这意味着您必须在您不希望非管理员查看的每个页面中包含该调用。

更好的方法是拥有一个经过身份验证的用户类来处理这个问题。好处是,它会干燥你的代码。

<?php
class User
{
    public function __construct()
    {
        // create your user however, i.e. fetch a record from your database
    }    

    public function isAdmin()
    {
        return ($this->user->role == 'admin');
    }

    public function redirect()
    {
        header('Location: index.php');
        exit;
    }
}

然后在您的代码中使用它:

<?php

$user = new User();

if (!$user->isAdmin()) {
    $user->redirect();
}

// continue with your page as normal; user here is an admin
于 2013-04-25T17:42:25.677 回答
1

你需要放在exit;标题之后

于 2013-04-25T17:40:07.243 回答
1

我觉得更好的方法是退出页面并阻止任何其他代码执行。我不确定,但如果用户愿意,他们可能能够忽略标头重定向请求。

我总是只添加一个小片段,例如“对不起,这仅对管理员可用”,然后返回;或退出;

编辑:伟大的googly moogly你们很快就可以平局了。

于 2013-04-25T17:41:19.633 回答
1

所以这里发生的情况是,通过设置Location标签,您实际上是在返回一个 HTTP 30x 请求,将用户浏览器指向新页面。但它在浏览器的手中尊重它。如果浏览器/用户是恶意的,他可能会忽略它。

因此,您需要在发送 Location 标头后立即停止输出die()。比它更安全 - 浏览器没有得到任何它不应该得到的数据

于 2013-04-25T17:44:05.033 回答
0

使用die(header("Location:..."));杀死页面

于 2013-04-25T17:59:52.967 回答