最近我为 CodeIgniter 下载了Phil Strugeon REST 服务器。我查看了源代码,当我进行摘要身份验证时,我看到了以下代码:
if ($this->input->server('PHP_AUTH_DIGEST'))
{
$digest_string = $this->input->server('PHP_AUTH_DIGEST');
}
elseif ($this->input->server('HTTP_AUTHORIZATION'))
{
$digest_string = $this->input->server('HTTP_AUTHORIZATION');
}
else
{
$digest_string = "";
}
稍后在检查是否存在 $digest_string 和存在用户名之后:
// This is the valid response expected
$A1 = md5($digest['username'].':'.$this->config->item('rest_realm').':'.$valid_pass);
$A2 = md5(strtoupper($this->request->method).':'.$digest['uri']);
$valid_response = md5($A1.':'.$digest['nonce'].':'.$digest['nc'].':'.$digest['cnonce'].':'.$digest['qop'].':'.$A2);
if ($digest['response'] != $valid_response)
{
header('HTTP/1.0 401 Unauthorized');
header('HTTP/1.1 401 Unauthorized');
exit;
}
在Wikipedia中,我看到以下有关 HTTP Digest Auth 的文本:
对于后续请求,十六进制请求计数器 (nc) 必须大于它使用的最后一个值——否则攻击者可以简单地“重放”具有相同凭据的旧请求。由服务器来确保计数器针对它发出的每个 nonce 值增加,从而适当地拒绝任何错误请求。
服务器应该记住它最近生成的 nonce 值。它还可以记住每个 nonce 值的发布时间,并在一定时间后过期。如果使用了过期的值,服务器应该以“401”状态码进行响应,并将 stale=TRUE 添加到身份验证头中,指示客户端应该使用提供的新随机数重新发送,而不提示用户输入另一个用户名和密码。
但是,我看不到任何有关在源代码中检查 cnonce、nc 或 nonce 的信息。这是否意味着记录从客户端到服务器的请求通过身份验证的人将来可能只是“重放”它并获得新的资源价值?
真的是脆弱吗?还是我误解了什么?