PHP 有没有比使用标题(位置)更好的方法来保护我的页面?
Posted
技术标签:
【中文标题】PHP 有没有比使用标题(位置)更好的方法来保护我的页面?【英文标题】:PHP Is there a better way to protect my pages than using header(location)? 【发布时间】:2011-04-06 10:07:15 【问题描述】:我通过检查我的会话值来保护我的页面。如果会话无效,除了更改标题位置之外,是否有更安全的方法来保护我的页面???我做对了吗???
我在每一页的顶部都有以下内容:
<?php
session_start();
//VERIFY LOGIN
$validkey = 'br1ll1ant)=&';
if ($_SESSION['valid'] != (hash('sha256',$validkey)) && $_SESSION['tokenconfirm'] != hash('sha256',$_SESSION['tokenID']))
header("location:/login/");
;
?>
【问题讨论】:
为什么要在会话中放置散列值?用户不能直接访问它们;我想他们无论如何都会提前知道这些值。那么有什么意义呢? 附注:实际上您的 header() 调用不符合 RFC。应该始终使用协议和主机名指定一个有效的 URL。关于会话中的哈希:我发现这是一个很好的做法,因为这样攻击者可以在不知道密码的情况下读取会话文件。 (攻击者可以通过其他错误适当地读取系统上的任意文件 - 以防万一!);) 在会话中散列密码仍然不会改变密码以明文形式存储的事实。如果一个漏洞允许攻击者查看临时会话变量(通常是世界可读的),那么同一个攻击者应该能够读取 Web 根文件(通常是世界可读的),包括包含密码的 PHP 源代码。跨度> 实际上,Location 标头不保护任何东西。虽然脚本终止确实如此。注意 knittl 的回答。大师的方法是另一种方式。 How to make a redirect in PHP? 的可能重复项 【参考方案1】:使用header()
很好,但在调用header()
后不要忘记exit();
你的脚本。用户代理不必尊重标头,因此可以编写一个客户端,它只会读取标头调用之后的部分。
if(!session_is_valid())
header('Location: index.php');
exit;
【讨论】:
【参考方案2】:您使用的是模板系统吗?如果是,那么如果用户未经过验证,您只需输出登录表单而不是页面内容。即使您没有使用一个,如果用户无效,您也可以更改输出(例如,不同的包含集)。这样您就不必依赖最终用户的浏览器来保护内容。
【讨论】:
【参考方案3】:标题应该没问题,我还没有看到人们使用太多其他东西。
最好先进行身份验证才能访问该页面,然后在每个页面上检查该身份验证。如果失败,重定向到登录。
使用 MVC 模式,最好在他们到达页面之前检查登录状态,如果未登录则重定向,或者加载登录视图。
【讨论】:
【参考方案4】:使用前端控制器模式,您可以将所有 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;
【讨论】:
实际上是要走的路,但我猜 OP 的文件是供经过身份验证的用户访问的。以上是关于PHP 有没有比使用标题(位置)更好的方法来保护我的页面?的主要内容,如果未能解决你的问题,请参考以下文章
有没有比使用 Console.Clear() 更好的方法来制作控制台游戏?