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関数を使用して分割されます。この関数は、次のような特定の文字シーケンスを解釈します。

  • 一重引用符と二重引用符
  • \x16進数
  • \ n、\ r、\ t、\ b、\aなどの特殊文字

ここで問題となるのは、パスワードに二重引用符が1文字含まれていることです。文字列の最後に一致する二重引用符がないため、解析は失敗します。その場合、sdssplitargs関数はNULLポインターを返します。このポインタがconfig.cコードで適切にチェックされていないため、コアダンプが発生します。

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

これは、IMOに提出する必要があるバグです。

簡単な回避策は、二重引用符またはその他の解釈された文字を16進シーケンス(つまり、二重引用符の場合は\ 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 に答える