如何在 Sabre DAV 的 PDO 类中获取用户的明文密码?

Posted

技术标签:

【中文标题】如何在 Sabre DAV 的 PDO 类中获取用户的明文密码?【英文标题】:How to get user's plain password in PDO class of Sabre DAV? 【发布时间】:2021-05-07 08:47:34 【问题描述】:

如何在 Sabre DAV 库的以下文件中获取当前登录用户的明文密码?

https://github.com/sabre-io/dav/tree/master/lib/CardDAV/Backend

in Baikal, this file is at:
\baikal\vendor\sabre\dav\lib\CardDAV\Backend\PDO.php
<?php

declare(strict_types=1);

namespace Sabre\CardDAV\Backend;

use Sabre\CardDAV;
use Sabre\DAV;
use Sabre\DAV\PropPatch;

/**
 * PDO CardDAV backend.
 *
 * This CardDAV backend uses PDO to store addressbooks
 *
 * @copyright Copyright (C) fruux GmbH (https://fruux.com/)
 * @author Evert Pot (http://evertpot.com/)
 * @license http://sabre.io/license/ Modified BSD License
 */
class PDO extends AbstractBackend implements SyncSupport
...
...

【问题讨论】:

如果您能够从该库中获取用户的明文密码,那么没有人会使用它。获取这个值的目的是什么?你想达到什么目的? 我正在尝试使用用户的密码来实现加密。所以实际上我正在努力提高安全性。 你是说这个库使用纯文本密码并且你想为其他目的对其进行散列(注意加密和散列不是一回事,加密是可逆的,而散列不是' t)? 我在问一个关于这个 webdav 实现的具体问题。评论或答案最好指导我更改一些构造函数或设置一些全局变量。如果您需要了解更多关于这个库的信息,可以在我提供的链接中查找(lib 是 sabre-io)。该库使用普通密码进行身份验证,然后对其进行哈希处理以匹配存储的密码。 请分享更多细节 - 为什么任何数据库都应该以明文形式存储密码?后果很可怕,所以没有人会使用它,甚至你也不应该 【参考方案1】:

对于基本身份验证,文件是这样的:

\baikal\Core\Frameworks\Baikal\Core\PDOBasicAuth.php

普通密码位于 validateUserPass 函数中,它可以存储在全局变量中(或问题的 cmets 中提到的会话中):

function validateUserPass($username, $password) 
        
        global $ptp;
        
        $stmt = $this->pdo->prepare('SELECT username, digesta1 FROM ' . $this->tableName . ' WHERE username = ?');
        $stmt->execute([$username]);
        $result = $stmt->fetchAll();

        if (!count($result)) 
            return false;
        

        $hash = md5($username . ':' . $this->authRealm . ':' . $password);
        if ($result[0]['digesta1'] === $hash) 
            $this->currentUser = $username;
            
            $ptp = $password;
                    
            return true;
        

        return false;
    

然后,在 \baikal\vendor\sabre\dav\lib\CardDAV\Backend\PDO.php 文件中,可以使用 global $ptp; 检索 $ptp var 的值

【讨论】:

以上是关于如何在 Sabre DAV 的 PDO 类中获取用户的明文密码?的主要内容,如果未能解决你的问题,请参考以下文章

sabre/dav - 服务器指定了一个无效的日历主页

在连接类中使用 PDO 时如何显示 mysql 错误?

php+mysql 请问:用pdo如何获取某个表中记录的数目?

php+mysql 请问:用pdo如何获取某个表中记录的数目?

你如何从一个类中获取最后插入的 ID 到重定向 [重复]

sabre:循环通过 TEL-property 不能提供预期的结果