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() 更好的方法来制作控制台游戏?

有没有比 `const` 更好的方法来存储大块文本?

有没有比在开头使用 1=1 更好的方法来动态构建 SQL WHERE 子句?

如何保护网站代码 PHP/JS? [关闭]

有没有比计时更好的方法来对 C 程序进行基准测试?

有没有比 redux persist 更好的方法来为生产环境持久化 redux 状态数据