アカウント名:
パスワード:
弊社のあるシステムも実は「Chrome/NN」のNN部分2桁での判定コードがあるのですけど、「バージョン 100 問題」なんて大騒ぎされていなかったら、普通に3桁になるのだろうと考えてとっくに3桁対応に改修してます。でも、WHATWGの時代になってからのブラウザ業界って直前になってからころころ対応変えたりしますんで、このように大騒ぎされていると、最終的には「やっぱりバージョン100にしたら問題発生するので 99 を最終にして 99.XXX みたいなバージョン表記にします」なんて対応になりかねません。となると、3桁対応に変更する手間が無駄になるので、バージョンが 99 がリリースされてから 100 がリリースされるまでは4週間はあるわけですから、少なくとも99がリリースされてから2週間は様子見します。
なお、「そもそもそんなの最初から数字部分を正規表現で [0-9]+ にしとけばよいだけでしょ。2桁固定なんて馬鹿げている。」なんて思っている人は、正規表現覚えたばかりの初心者かと思います。今はてブでホッテントリーになっている 正規表現の脆弱性 (ReDoS) を JavaScript で学ぶ [nmi.jp] などを見ていただければ分かりますが、UserAgent のようにユーザーが自由に設定できて、しかもアクセスごとに判定が必要なような場面で気軽に正規表現を使うべきではありません。というか、UserAgentでもブラウザ判定に正規表現なんて不要です。仮に正規表現を使うにしても、他のパターンとの組み合わせによっては文字数の何乗かのチェックが走る0~1回以上(任意長)繰り返しのマッチなんて入れないに限ります。正規表現には異常な過負荷を発生させることができる罠が山ほど仕掛けられているし、処理系によってその条件が違うので、どうしても必要な場面以外では正規表現なんて使わないのに越したことがないです(使うなら少なくともタイムアウト処理も必要)。よくあるケースとして、「フレームワークやWebサーバががNNN文字で切り捨てる仕様になってるから大丈夫」なんて考えていて、バージョンアップやサーバ側やCDNでの設定変更でその制限が無くなって文字数制限が無くなってReDoS 食らう可能性もあります。
本来であればバージョンナンバー3桁の対応はバージョン90とかそのへんで終わっているべきだった。そしてバージョン番号が3桁にならなかったらみんなであの苦労は何だったのだと嘆くのが正しい姿。問題なのは正規表現で判定するかではないし何桁で判定するかでもない。二桁決め打ちではなく一桁から3桁でも良いわけだし。問題なのは泥縄になってるところ。いや泥棒を捕まえながら縄を編んでるからちょっとだけマシ?てかバージョンなんてローカルで判断させてサーバに送らせりゃいい。
ユーザーエージェントではなく機能ベースで判定しろと言われているのだからブラウザの判定を行うのはクライアントサイドだし、変なユーザーエージェント文字列が設定されていてReDoSになったとしても自業自得としか言い様がない。
> 「やっぱりバージョン100にしたら問題発生するので 99 を最終にして 99.XXX みたいなバージョン表記にします」なんて対応になりかねません。
なりかねませんも何も実際に両方をテスト中じゃなかったっけ。どちらになるかわからないならどちらになってもいいように準備するのが普通の考え方だと思うんだが。リリース後にフラグの切り替えがリモートで行われるとか同じバージョン内でも徐々にロールアウトが行われるとかA/Bテストとか普通にあるし。
なんというかスラドのストーリーにいかに普通と違う奇抜なことを言ってやろうか競争してるみたいなコメントが必ず一つはつくのマジで何なの?
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
未知のハックに一心不乱に取り組んだ結果、私は自然の法則を変えてしまった -- あるハッカー
「バージョン 100 問題」なんて大騒ぎするから対応できないんですが (スコア:0)
弊社のあるシステムも実は「Chrome/NN」のNN部分2桁での判定コードがあるのですけど、「バージョン 100 問題」なんて大騒ぎされていなかったら、普通に3桁になるのだろうと考えてとっくに3桁対応に改修してます。
でも、WHATWGの時代になってからのブラウザ業界って直前になってからころころ対応変えたりしますんで、このように大騒ぎされていると、最終的には「やっぱりバージョン100にしたら問題発生するので 99 を最終にして 99.XXX みたいなバージョン表記にします」なんて対応になりかねません。
となると、3桁対応に変更する手間が無駄になるので、バージョンが 99 がリリースされてから 100 がリリースされるまでは4週間はあるわけですから、少なくとも99がリリースされてから2週間は様子見します。
なお、「そもそもそんなの最初から数字部分を正規表現で [0-9]+ にしとけばよいだけでしょ。2桁固定なんて馬鹿げている。」なんて思っている人は、正規表現覚えたばかりの初心者かと思います。
今はてブでホッテントリーになっている 正規表現の脆弱性 (ReDoS) を JavaScript で学ぶ [nmi.jp] などを見ていただければ分かりますが、UserAgent のようにユーザーが自由に設定できて、しかもアクセスごとに判定が必要なような場面で気軽に正規表現を使うべきではありません。というか、UserAgentでもブラウザ判定に正規表現なんて不要です。
仮に正規表現を使うにしても、他のパターンとの組み合わせによっては文字数の何乗かのチェックが走る0~1回以上(任意長)繰り返しのマッチなんて入れないに限ります。
正規表現には異常な過負荷を発生させることができる罠が山ほど仕掛けられているし、処理系によってその条件が違うので、どうしても必要な場面以外では正規表現なんて使わないのに越したことがないです(使うなら少なくともタイムアウト処理も必要)。
よくあるケースとして、「フレームワークやWebサーバががNNN文字で切り捨てる仕様になってるから大丈夫」なんて考えていて、バージョンアップやサーバ側やCDNでの設定変更でその制限が無くなって文字数制限が無くなってReDoS 食らう可能性もあります。
発散的な上に無意味な議論 (スコア:0)
本来であればバージョンナンバー3桁の対応はバージョン90とかそのへんで終わっているべきだった。そしてバージョン番号が3桁にならなかったらみんなであの苦労は何だったのだと嘆くのが正しい姿。
問題なのは正規表現で判定するかではないし何桁で判定するかでもない。二桁決め打ちではなく一桁から3桁でも良いわけだし。
問題なのは泥縄になってるところ。いや泥棒を捕まえながら縄を編んでるからちょっとだけマシ?
てかバージョンなんてローカルで判断させてサーバに送らせりゃいい。
Re: (スコア:0)
ユーザーエージェントではなく機能ベースで判定しろと言われているのだからブラウザの判定を行うのはクライアントサイドだし、
変なユーザーエージェント文字列が設定されていてReDoSになったとしても自業自得としか言い様がない。
Re: (スコア:0)
> 「やっぱりバージョン100にしたら問題発生するので 99 を最終にして 99.XXX みたいなバージョン表記にします」なんて対応になりかねません。
なりかねませんも何も実際に両方をテスト中じゃなかったっけ。どちらになるかわからないならどちらになってもいいように準備するのが普通の考え方だと思うんだが。リリース後にフラグの切り替えがリモートで行われるとか同じバージョン内でも徐々にロールアウトが行われるとかA/Bテストとか普通にあるし。
なんというかスラドのストーリーにいかに普通と違う奇抜なことを言ってやろうか競争してるみたいなコメントが必ず一つはつくのマジで何なの?