【问题标题】:PHP Is there a better way to protect my pages than using header(location)?PHP 有没有比使用标题(位置)更好的方法来保护我的页面?
【发布时间】: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? 的可能重复项

标签: php session login header location


【解决方案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 的文件是供经过身份验证的用户访问的。
        猜你喜欢
        • 2013-04-06
        • 1970-01-01
        • 2010-09-21
        • 2011-10-16
        • 1970-01-01
        • 2012-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多