【问题标题】:PHP is $_SESSION enough to secure the web page?PHP 的 $_SESSION 是否足以保护网页?
【发布时间】:2016-03-01 23:29:59
【问题描述】:

我正在运行一个简单的服务,用户必须登录才能操作特殊功能。

我的 MySQL 数据库存储 usernamepassworduser_id

当用户想要登录时,他们必须提供他们的用户名和密码,这些用户名和密码会发布到 profile.php。

profile.php 做了一个简单的检查:

// Sanity Check
if(empty($_POST['smart_email'])|| empty($_POST['smart_password']))
{

    echo 'Sorry, wrong login/passwd';
    exit;
}
else
{
    //
    $smart_email = $_POST['smart_email'];
    $smart_password=$_POST['smart_password'];

    // Check if registerd and password matches
    if(DB_IsAuthorized($smart_email, $smart_password) == true)
    {
        // Obtain proper UserID from the database
        $UserID             = DB_GetId($smart_email);

        // set the session user_id variable
        $_SESSION['user_id'] = $UserID;


        //
        // Display the User profile page
        //
    }

}

从那时起,每个与用户相关的页面都会检查 user_id$_SESSION 中设置的内容,以了解该用户是否已登录并获得授权。

if (isset($_SESSION['user_id']) && is_numeric($_SESSION['user_id']) && $_SESSION['user_id']>0) 
{ 
    // USER IS LOGGED IN 
}

问题是:$_SESSION['user_id'] 检查是否足以保护非登录用户的页面?

【问题讨论】:

  • 其实,是的,够了。但如果没有任何其他措施,您的访问者很容易受到大多数攻击他们的帐户的影响。我可以建议您使用框架并获取 ssl 证书来制作 https。不要贬低它!创建框架的人有很多经验!顺便说一句 - 我喜欢 Yii,它相当简单 :)
  • 在保护您网站上的网页方面,我认为可以做到的还远远不够。不过,我认为一般来说一个简单的$_SESSION 检查就足够了。
  • 也许我一开始就跑题了。您是否在询问使用$_SESSION 是否允许您阻止未登录用户的内容;或$_SESSION 的安全程度以及进入暴力攻击、劫持等领域。
  • 就其本身而言没关系 - 但正如 chris85 所说,您需要检查并确保人们没有使用它来暴力破解用户帐户。每当我登录用户时,我都会记录时间和 IP。之后每次我检查我的会话变量时,我还会检查该帐户是否没有更新的登录,并且 IP 没有更改。如果有,通常我会终止两个会话并强制用户再次登录。这增加了一个额外的障碍,因为攻击者无法通过劫持现有会话来采取行动——他们需要知道用户名并通过。

标签: php mysql session


【解决方案1】:

这个问题太宽泛,但简单的答案是

首先,您需要 https 来确保通过使用防火墙和其他必需的安全工具来保护用户免受黑客攻击。

其次,您需要使用 htaccess 来更改扩展名,比如显示用户 .html 而不是 .php

第三,Sessions 很容易被黑客劫持。因此,请始终尝试存储加密的会话值而不是纯文本。

还有很多问题需要处理,但过于复杂和广泛。

【讨论】:

  • 1) - 这很明显。 2) 为什么我显示 .html 而不是 .php ?重点是什么? 3) 有意义 no 的答案有点奇怪,每个页面都说在 PHP 中使用 $_SESSION - 我假设完成这 3 点之后,使用 $_SESSION 检查是安全的。
  • 关于第 2 点 security by obscurity is one of the weakest forms of security。 -php.net/manual/en/security.hiding.php
  • 将 php 更改为 html 已被证明可以减少黑客的攻击。这些点对于 $_SESSION 来说已经足够了,但对于其他攻击来说还不够。答案不是,是为了表明代码写得不好。它需要加密,也容易发生简单的sql注入。
  • @Manikiran 这很有趣,这里的 SQL 注入可能在哪里?感谢您对此的投入。
  • @PeeS 我假设您的 DB_IsAuthorized() 函数在与 DB 中的值进行比较之前不会加密或散列值。
猜你喜欢
  • 2011-07-04
  • 1970-01-01
  • 2015-05-30
  • 2018-02-04
  • 2012-08-17
  • 2015-12-12
  • 2023-03-12
  • 2012-10-24
  • 2020-09-12
相关资源
最近更新 更多