从 PHP GET 方法中的查询参数中解密基本身份验证令牌

Decrypt Basic authentication token from query param in PHP GET method

我想解密使用基本身份验证加密的用户名和密码。

在我的客户端应用程序中,我有一个文件列表。如果用户想要下载,他们将单击指向带有参数 id(即 fileId)和 token 的 PHP 文件的锚点 link。

我有一个像

这样的客户端锚标签
<a href="http://localhost:8080/management/download.php?id=1&token=YmFsYTphYWFhYWFhYWFh">
    download
</a>

令牌是使用以下 javascript 代码创建的

const token = window.btoa(username + ':' + password)

文件:download.php

$fileId = $_GET['id'];
$token = $_GET['token'];

$filePath = getFileById($fileId);

if (file_exists($filePath)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($filePath).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($filePath));
    readfile($filePath);
    exit;
}

我试图从默认值 $_SERVER['PHP_AUTH_USER'] 获取用户名和密码,但未能获取信息。

请帮助我如何从令牌中解密用户名和密码。

在PHP中使用base64_decode()得到用:分隔的用户名和密码。

<?php

$decoded = base64_decode($_GET['token']);
list($username,$password) = explode(":",$decoded);
echo $username," ",$password;

演示: https://3v4l.org/KKIlR

此外,这似乎不够安全,无法像 GET 参数那样发送密码(不确定此处描述的密码)。最好改为发送 header 之类的 Authorization: Basic YmFsYTphYWFhYWFhYWFh ,它实际上是一些客户端 ID 和客户端密码 base-64 编码。