2

我想设置一个密码来连接到 Redis 服务器。

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

但是,在设置值之后,我在重新启动 Redis 时得到了这个:

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

这是为什么?

4

3 回答 3

5

密码长度限制为 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)。

于 2012-12-20T10:12:31.610 回答
4

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

我尝试了 160 个字符(只是数字),效果很好。这

9hhNiP8MSHZjQjJAWE6PmvSpgVbifQKCNXckkA4XMCPKW6j9YA9kcKiFT6mE

也。但是这个

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

才不是。

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

于 2012-12-19T21:30:12.677 回答
0

刚刚把这个钉在了:

  • php: urlencode('crazy&char's^pa$$wor|]');
  • -或者-
  • js: encodeURIComponent('crazy&char's^pa$$wor|]');

然后它可以在通过(通常)tcp发送到redis服务器的任何地方使用

于 2016-05-13T15:48:08.640 回答