Redisのバイナリセキュリティ

1689 ワード

Redisには、 字が1つ保存され、3バイト、2バイトのいずれかを占めます.1つの10を保存すると2バイトを占有し、保存100は3バイトを占有する.これは,Redisがバイナリセキュリティの技術を用いて,データを変換せずにバイナリ方式で何を保存しているかのためである.そのため、同じRedisサービスのクライアントは符号化フォーマットを統一しなければならない.そうしないと、データの読み取りと保存が一致しないという問題がある.

非バイナリセキュリティ


まず、その名の「バイナリセキュリティ」の役割がデータのセキュリティを保証することであるように、彼の反例は何だろうか.
例えば、C言語のstrlen()関数は非バイナリで安全であり、文strlen("Hello,\0 World!");を使用すると、\0を文字列の終端と見なすため、結果は5である.すなわち、C言語はデフォルトで特定の文字に特別な意味があると考えられ、特殊な処理を行う.(run C online)
それに対してPHPのstrlen()関数はバイナリセキュリティであり、strlen("Hello,\0 World!");は正しく13を返します.(run PHP online)

バイナリセキュリティ


「バイナリセキュリティ」とは、あなたが私に送ったデータのバイナリがどのようなものなのか、私のところに存在するのはどのようなものなのか、私に伝えさえすれば、私はここで改ざんされないことを保証します.(私はこれらのデータを再符号化したり、シーケンス化したりしません).
Redisはバイナリセキュリティの利点を使用します:保存と取得はすべてバイト配列で来て、ここでタイプがなくて、保存したデータを変えることができなくて、オーバーフローとカバーがなくて、文字化けして問題がありません.

Redisバイナリセキュリティのいくつかの現象


それはバイナリの安全にかかわるので、私たちが気づかないうちに、「頭がつかめないように見える」問題が発生します.
例えば、Terminalが設定した符号化フォーマットが異なる場合、そのredis-cli setの中国語文字列がredisに格納されているデータは異なる.
例えば、set k1 コマンドを使用し、Terminalが設定した符号化フォーマットがUTF-8の場合、「中」は「xe 4xb 8xad」、getコマンドで取得したものもこの文字列であり、GBKで格納する場合は「xd 6xd 0」となる.strlenコマンドで返される結果も異なり、前者は3後者は2である.
これは、コマンドラインツールが異なる符号化フォーマットで中国語を異なるバイナリデータに符号化し、Redisに転送して格納するためである.
redisが返すデータのデフォルトは文字列形式で返されます.Redis-cliを起動してパラメータ--rawを加えると、redisに格納された元のバイナリデータが取得され、Terminalもこれらのバイナリデータを復号する.Terminalが自分の符号化フォーマットと異なるTerminal setのデータを取得すると文字化けしが発生する.
したがって,プロジェクトエンジニアリングでは,2つのサービスがそれぞれ1つのクライアントを開いて1つのRedisを接続する場合,符号化フォーマットが統一されているという問題に注意しなければならない.