我通过检查会话的值来保护我的页面。如果会话无效,是否有更安全的方法来保护我的页面而不是更改标题位置?我做对了吗???
我在每页的顶部都有以下内容:
<?php
session_start();
//VERIFY LOGIN
$validkey = 'br1ll1ant)=&';
if ($_SESSION['valid'] != (hash('sha256',$validkey)) && $_SESSION['tokenconfirm'] != hash('sha256',$_SESSION['tokenID'])) {
header("location:/login/");
};
?>
答案 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;