为什么Redis不能使用requirepass指令?

时间:2012-12-19 21:30:13

标签: authentication redis

我想设置密码以连接到Redis服务器。

执行此操作的适当方法是在配置文件中使用requirepass指令。 http://redis.io/commands/auth

然而,在设置值之后,我在重启Redis时得到了这个:

Stopping redis-server: redis-server.
Starting redis-server: Segmentation fault (core dumped)
failed

为什么?

3 个答案:

答案 0 :(得分:3)

密码长度限制为512个字符。

在redis.h中:

#define REDIS_AUTHPASS_MAX_LEN 512

在config.c中:

    } else if (!strcasecmp(argv[0],"requirepass") && argc == 2) {
        if (strlen(argv[1]) > REDIS_AUTHPASS_MAX_LEN) {
            err = "Password is longer than REDIS_AUTHPASS_MAX_LEN";
            goto loaderr;
        }
        server.requirepass = zstrdup(argv[1]);
    }

现在,配置文件的解析机制非常基础。使用sds(字符串管理)库的sdssplitargs函数拆分所有行。此函数解释特定的字符序列,例如:

  • 单引号和双引号
  • \ x十六进制数字
  • 特殊字符,例如\ n,\ r,\ t,\ b,\ a

这里的问题是你的密码包含一个双引号字符。解析失败,因为字符串末尾没有匹配的双引号。在这种情况下,sdssplitargs函数返回一个NULL指针。发生核心转储是因为未在config.c代码中正确检查此指针:

    /* Split into arguments */
    argv = sdssplitargs(lines[i],&argc);
    sdstolower(argv[0]);

这是一个应该提交给IMO的错误。

一个简单的解决方法是用十六进制序列替换双引号字符或任何其他解释字符(即双引号的。\ x22)。

答案 1 :(得分:2)

虽然没有记录,但似乎密码值存在限制,特别是包含的字符,而不是长度。

我尝试了160个字符(只是数字),它工作正常。 此

9hhNiP8MSHZjQjJAWE6PmvSpgVbifQKCNXckkA4XMCPKW6j9YA9kcKiFT6mE

太。但是这个

@hEpj6kNkAeYC3}@:M(:$Y,GYFxNebdH<]8dC~NLf)dv!84Z=Tua>>"A(=A<

没有。

因此,Redis不支持部分或全部“特殊字符”。

答案 2 :(得分:0)

刚刚用以下内容钉牢:

  • php:urlencode(&#39;疯狂&amp; char&#39; s ^ pa $$ wor |]&#39;);
  • - 或 -
  • js:encodeURIComponent(&#39; crazy&amp; char&#39; s ^ pa $$ wor |]&#39;);

然后它可以通过(通常)tcp

发送到redis服务器的任何地方使用