mty_win32 (20071012) | 2007-10-12 20:30 |
mty_win_x64 (20071012) | 2007-10-12 20:32 |
snapshots_unstable (20081222_CAL_beta) | 2008-12-22 23:05 |
w2t_win32 (20070517) | 2007-05-17 20:03 |
掲示板にトリップ機能を搭載したものの、利用者から"2chトリップ検索スレで探してもらったトリップが使えない"などの苦情が出てしまった。そんな管理者・サイト作成者のために、2chトリップと同じものを出力する方法をまとめてみました。
2ch掲示板システム(以降2ch)の投稿処理スクリプト(以降bbs.cgi)に実装されているトリップの仕様において、重要な事項を以下に挙げます。
以下、2ch実装の現状ではあるが仕様不備であると考えられる項目を挙げます。2ちゃんねる文字化け対策@レアトリップ配信所も参考にしてください。
また、クライアント(ブラウザ)依存の問題として、クライアントが扱う文字コードは純粋な Shift_JIS ではないという点があります。これに関しては掲示板システム実装者が積極的に関知する必要はありません。
基本的に、以下の項目に従えば、2chトリップと互換であると見なされます。逆に、以下を逸脱している場合には、2chトリップと同じものを出力することは困難となります。
2ch と同様の結果を得るためには、さらに以下の項目を実施することになります。いずれを施さなくても、利用者側でキーを一部改竄することにより対応可能なので、必須ではありません。
以下のコードはbbs.cgiにて使われているものとほぼ同様のものです。
$FORM{FROM} はエスケープなどがすでに行われています。本質的にはエスケープを行う必要はありません。
(後日加筆予定)
(後日加筆予定)
ここでは、トリップにてCRYPT(3)のために用意するSaltの生成規則について説明します。
Salt は、トリップキーの2文字目および3文字目それぞれから文字を取り出し、以下の規則を用いて決定します。
取り出した文字 | 生成する文字 | 全角文字の2バイト目 | 備考 |
ピリオド【.】 スラッシュ【/】 数字【0-9】 | そのまま | - | |
アルファベット大文字【A-Z】 アルファベット小文字【a-z】 | そのまま | ○ | |
【:】 | 【A】 | - | |
【;】 | 【B】 | - | |
【<】 | 【C】 | - | 2chでは先だってエスケープ処理により消滅するため該当ナシ。 |
【=】 | 【D】 | - | |
【>】 | 【E】 | - | 2chでは先だってエスケープ処理により消滅するため該当ナシ。 |
【?】 | 【F】 | - | |
【@】 | 【G】 | ○ | |
【[】 | 【a】 | ○ | |
【\】 | 【b】 | ○ | |
【]】 | 【c】 | ○ | |
【^】 | 【d】 | ○ | |
【_】 | 【e】 | ○ | |
【`】 | 【f】 | ○ | |
それ以外 | 【.】 | △ | 0x7B-0x7E【{|}~】および 0x80-0xFC は、全角文字の2バイト目に含まれます。 |
以上の変換規則をキャラクタコード順に並べると以下の表のようになります。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
0x00 | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x10 | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x20 | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | / |
0x30 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
0x40 | G | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
0x50 | P | Q | R | S | T | U | V | W | X | Y | Z | a | b | c | d | e |
0x60 | f | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
0x70 | p | q | r | s | t | u | v | w | x | y | z | . | . | . | . | . |
0x80 | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x90 | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0xA0 | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0xB0 | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0xC0 | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0xD0 | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0xE0 | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0xF0 | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
昔はこうだった系の読み物です。うんちくネタにどうぞ。もちろん知らなくても掲示板システムにトリップを実装することはできます。
数年前、新鯖トリップと言われる仕様が突如出現しました。このとき2chではトリップ仕様変更が行われたワケではなく、単にサーバOSの更新が行われただけでした。
トリップ仕様が変更になったように見えたのは、実は、仕様に定められていない範囲外のSaltをCRYPT(3)に渡していたが故の、OS(ライブラリ)依存の仕様外動作によるものでした。2chにトリップが実装され始めた頃のサーバは libc5 ベースのSlackware, "新鯖トリップ"が出る鯖は glibc2 ベースの OS でした。
さらに FreeBSD ベースのサーバが導入された際、単に期待したトリップが出ないだけでなく、トリップそのものが何も出ない状態になってしまいました。FreeBSDライブラリのCRYPT(3)は、仕様外Saltをエラー扱いするようになったためです。そのため2ch側もbbs.cgiにおける対策が必要となってきたのです。対策されて以降、基本的にトリップ仕様は揺れ動いていません。
範囲外Saltにおける動作は、公開されているそれぞれのライブラリ(libc5, glibc2, FreeBSD)のソースコードを追跡することで裏付けを取ることができます。glibc2の場合、0xFF→0x00 が連続していて、0x7F→0x80 が不連続であるのがミソです。
以下は対策前のトリップ算出コードです。ひろゆき(2ch初代管理人)により公開されました。このままではSaltに仕様範囲外の文字を渡すことができるどころか、拡張暗号化指定すら紛れ込ませることが可能になるため、"MD5トリップ"を表示させることも可能になっていました。末尾に / 0 1 を表示させることができていたのです。もちろん現在ではMD5トリップの表示は対策により不可能になっています。
新鯖(glibc2)によるSalt変換表を以下に示します。漢字など全角文字が含まれるトリップキーにおいて、Saltの互換が取れなくなってしまうことがわかるでしょう。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
0x00 | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V |
0x10 | W | X | Y | Z | a | b | c | d | e | f | g | h | i | j | k | l |
0x20 | m | n | o | p | q | r | s | t | u | v | w | x | y | z | . | / |
0x30 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
0x40 | G | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
0x50 | P | Q | R | S | T | U | V | W | X | Y | Z | a | b | c | d | e |
0x60 | f | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
0x70 | p | q | r | s | t | u | v | w | x | y | z | . | / | 0 | 1 | 2 |
0x80 | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V |
0x90 | W | X | Y | Z | a | b | c | d | e | f | g | h | i | j | k | l |
0xA0 | m | n | o | p | q | r | s | t | u | v | w | x | y | z | . | / |
0xB0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
0xC0 | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V |
0xD0 | W | X | Y | Z | a | b | c | d | e | f | g | h | i | j | k | l |
0xE0 | m | n | o | p | q | r | s | t | u | v | w | x | y | z | . | / |
0xF0 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |