【问题标题】:PHP User class security assistance?PHP 用户类安全辅助?
【发布时间】:2011-06-22 11:56:20
【问题描述】:

我是 PHP 类开发的新手,但我仍然对会话的概念感到困惑。

问题 1:可以通过客户端操作更改会话吗?如果不能,我可以设置静态会话并在没有验证的情况下使用它们吗?

问题 2:我应该如何管理我的用户帐户?

我确实使用 SALT,但是,在注册过程中会生成一个代码并插入到用于登录参考的数据库中。非常感谢任何带有解释的更正,以及有关客户修改会话的任何内容。

class user {
    private $username   = '';   
    private $password   = '';
    private $salt       = '';
    public  $prefix     = 'rhs_';

    function __construct () {
        $this->username = '';
        $this->password = '';
        $this->salt     = '';

        session_start();
    }

    public function login ($username, $password) {
        $mysql_conn = Database::obtain();
        $username = $mysql_conn->escape($username);
        $sql = 'SELECT `password`, `salt`, `first_name`, `last_name`, `permission` FROM `accounts` WHERE `username`="'.$username.'"';
        $row = $mysql_conn->query_first($sql);

        if(!empty($row['password'])) {
            $encrypted = md5(md5($mysql_conn->escape($password)).$row['salt']);
            if ($encrypted == $row['password']) {
                $_SESSION[$this->prefix.'username']     = $username;
                $_SESSION[$this->prefix.'password']     = $password;
                $_SESSION[$this->prefix.'name']         = $row['first_name'].' '.$row['last_name'];
                $_SESSION[$this->prefix.'permission']   = $row['permission'];
                header('location: ?page=cpanel');
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

【问题讨论】:

标签: php class session


【解决方案1】:

会话是服务器上的一个文件,可以在其中写入和保存变量。每个会话文件对应于您网站的一位活跃访问者。 PHP 会自动删除大约 24 分钟未读取或写入的文件。

会话通过 cookie 链接到用户。当用户浏览到您使用会话的页面时,PHP 会检查是否随请求一起发送了一个特别命名的 cookie,其中包含他们的会话标识符。

  • 如果 cookie 存在,该标识符会告诉 PHP 打开和读取哪个会话文件以填充 $_SESSION
  • 如果不存在 cookie,则会生成一个新标识符并将其作为 cookie 发送给用户,并创建一个新的空会话文件。

由于会话是您服务器上的文件,您的用户无法修改它们。

【讨论】:

  • 这是否意味着我需要更新会话,否则它们将变为非活动状态?如果是这样,调用会话不会更新它们吗?
  • 当访问者点击您调用session_start() 的站点页面时,会读取会话文件。这会重置文件的过期时间。您不必编写任何特殊代码。
  • 用户是否可以随时更改该数据,或者保持静态是否可以?
  • 用户不能在您的服务器上编辑文件,而 不能在 您的 家用计算机上编辑文件。他们不能。
【解决方案2】:

我是 PHP 类开发的新手

即使您是经验丰富的程序员,制作不安全的身份验证系统也很容易。您应该改用 OpenID(或类似的系统,例如 facebook connect)。他们有安全专家作为雇员。我创建了一个little library you can use for this。你可以在http://westerveld.name/php-openid//看到一个演示

客户端可以更改会话吗 操纵?如果没有,我可以设置静态 会话并在没有的情况下使用它们 验证?

它不能被客户端更改,但用户会话可能会被黑客窃取。你需要防止session-fixation => session_regenerate_id

我应该如何管理我的用户 帐户?

你可能不应该这样做,因为你犯的错误是很大的。但以下是一些快速提示:

  • 您应该使用phpass 将您的密码存储在数据库中。因为我确实注意到您没有使用key stretching。您应该执行一个基准测试,如果您可以快速生成哈希,那么您肯定没有安全地保护您的密码。 Bcrypt 非常适合散列(由 phpass 使用。你应该使用那个库),因为它是摩尔定律的证明。
  • 保护您的用户免受CSRF 的侵害。
  • 您应该阅读the OWASP top 10

我还创建了一个小authentication library 只是为了好玩。而且我认为这是相当安全的,尽管例如logout.php 仍然容易受到CSRF 的攻击,尽管这并不是一个真正的大问题(而且修复很容易)。

【讨论】:

  • 该网站的开发允许用户通过登录获得访问权限,然后通过添加查询(安全)来调整服务器。所有查询都得到正确处理和转义,如有必要,还可以清除任何漏洞。
  • 此时唯一让我担心的是,我不会重新验证会话权限,我觉得这可以打开漏洞的大门,让用户可以进入 CPanel 并进行调整。我是否应该进行 MySQL 检索并与会话进行比较以确认它们在页面加载时是否正确?
  • 另外,用户不可能使用我的表单跨站点,因为它们是在服务器端处理的,这意味着除非客户端在现场提交并且它已经过服务器验证,否则它不会做任何事情.
  • 防止会话固定(session_regenerate_id)、sql-injections(PDO)和XSS-holes(输入过滤),使cookies只http-only以获得额外的安全性,你很高兴!会话在您的服务器上,无法更改,但如果您有会话固定,则可能会被盗。也可以使用 phpass 来存储你的密码!!!
猜你喜欢
  • 2015-04-17
  • 2013-07-18
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
  • 1970-01-01
相关资源
最近更新 更多