PHP有没有比使用标题(位置)更好的方法来保护我的页面?

时间:2010-08-31 17:53:31

标签: php session login header location

我通过检查会话的值来保护我的页面。如果会话无效,是否有更安全的方法来保护我的页面而不是更改标题位置?我做对了吗???

我在每页的顶部都有以下内容:

<?php
     session_start();

     //VERIFY LOGIN
     $validkey = 'br1ll1ant)=&';

     if ($_SESSION['valid'] != (hash('sha256',$validkey)) && $_SESSION['tokenconfirm'] != hash('sha256',$_SESSION['tokenID']))  {

            header("location:/login/");

         };

?>

4 个答案:

答案 0 :(得分:7)

使用header()很好,但在调用exit();后不要忘记header()脚本。用户代理不必尊重标题,因此可以编写一个客户端,它只会读取标题调用之后的部分。

if(!session_is_valid()) {
  header('Location: index.php');
  exit;
}

答案 1 :(得分:2)

您使用的是模板系统吗?如果您是,那么如果用户未经过验证,您只需输出登录表单而不是页面内容。即使您没有使用一个,如果用户无效,您也可以更改输出(例如,不同的包括)。这样您就不会依赖最终用户的浏览器来保护内容。

答案 2 :(得分:0)

标题应该没问题,我没有看到人们使用其他任何东西。

最好进行身份验证以获取对页面的访问权限,然后在每个页面上检查该身份验证。如果失败,请重定向到登录。

使用MVC模式,最好在他们访问页面之前检查登录状态,如果没有登录则重定向,或者加载登录视图。

答案 3 :(得分:0)

使用前端控制器模式,您可以将所有php文件放在Web根目录之外。这样,它们无法直接从URL访问。这在PHP框架中是相当普遍的做法,包括使用Zend'Framework'构建的框架。

如果您的文件位于Web根目录中,您可以考虑的另一种方法是使用常量。这就是CodeIgniter的做法。在前端控制器中定义一个常量,如果未定义,则将它们发送到Web根目录。以下是CI如何使用常量。

到处使用的常数

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

如何定义。

define('BASEPATH', $system_folder.'/');

$ system_folder上面几行。

$system_folder = realpath(dirname(__FILE__)).'/'.$system_folder;