Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Codeigniter Phil Strugeon REST服务器-Digest Auth中真的存在安全漏洞吗?或者我误解了什么?_Codeigniter_Rest - Fatal编程技术网

Codeigniter Phil Strugeon REST服务器-Digest Auth中真的存在安全漏洞吗?或者我误解了什么?

Codeigniter Phil Strugeon REST服务器-Digest Auth中真的存在安全漏洞吗?或者我误解了什么?,codeigniter,rest,Codeigniter,Rest,最近我下载了CodeIgniter。 我回顾了源代码,当谈到摘要身份验证时,我看到了以下代码: if ($this->input->server('PHP_AUTH_DIGEST')) { $digest_string = $this->input->server('PHP_AUTH_DIGEST'); } elseif ($this->input->server('HTTP_AUTHORIZATION')) { $digest_string

最近我下载了CodeIgniter。 我回顾了源代码,当谈到摘要身份验证时,我看到了以下代码:

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_字符串是否存在以及用户名是否存在后:

// 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;
}
    
在中,我看到以下关于HTTP摘要身份验证的文本:

对于后续请求,十六进制请求计数器(nc)必须大于它使用的最后一个值,否则攻击者可以简单地“重放”具有相同凭据的旧请求。由服务器来确保为其发出的每个nonce值增加计数器,从而适当地拒绝任何错误请求

服务器应该记住它最近生成的nonce值。它可能还记得每个nonce值是在什么时候发出的,在一定的时间后过期。如果使用了过期值,则服务器应使用“401”状态代码进行响应,并将stale=TRUE添加到身份验证标头,指示客户端应使用提供的新nonce重新发送,而不提示用户输入其他用户名和密码

然而,我在源代码中看不到任何关于检查cnonce、nc或nonce的内容。 这是否意味着记录从客户端到服务器的请求并通过身份验证的人将来可能只是“重放”它,并接收新的资源价值


真的是易受攻击吗?或者我误解了什么?

我在查看codeigniter restserver时也注意到了这一点。它很容易受到重播攻击,因为正如您所说,它不强制执行nonce

摘要身份验证需要握手:

  • 客户端通过授权发出请求。它将失败,因为客户端还不知道nonce
  • 服务器使用WWW Authenticate标头进行响应,该标头包含要使用的正确nonce
  • 客户端使用服务器响应中提供的nonce发出相同的请求
  • 服务器检查nonce是否匹配,并提供请求的url
  • 要实现这一点,您需要在REST服务器上启动一个会话来记住nonce。确保nonce始终唯一的一个简单方案是使用uniqid()之类的函数基于当前时间