Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
現在のmbstringの立ち位置 これからどうなっていくのか
Search
てきめん tekimen
PRO
December 20, 2023
Programming
640
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
現在のmbstringの立ち位置 これからどうなっていくのか
第159回PHP勉強会@東京
https://phpstudy.connpass.com/event/304155/
てきめん tekimen
PRO
December 20, 2023
More Decks by てきめん tekimen
See All by てきめん tekimen
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
850
ChatGPTを使ってRaspberry Pi Picoの処理系を書いた
youkidearitai
PRO
0
98
PHP Internals わいわい #3 PIEを使ってみよう
youkidearitai
PRO
0
73
grapheme_strrev関数が採択されました(あと雑感)
youkidearitai
PRO
1
360
Limit of code point for grapheme cluster in programming language side.
youkidearitai
PRO
0
95
Unicodeどうしてる? PHPから見たUnicode対応と他言語での対応についてのお伺い
youkidearitai
PRO
2
3.7k
PHP 8.5の裏話
youkidearitai
PRO
0
160
CJK and Unicode From a PHP Committer
youkidearitai
PRO
0
460
PHP Internals わいわい #3 mb_*関数を作ってみよう
youkidearitai
PRO
0
170
Other Decks in Programming
See All in Programming
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
240
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.8k
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
340
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
1
240
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
190
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
540
AIが無かった頃の素敵な出会いの話
codmoninc
1
390
Foundation Models frameworkで画像分析
ryodeveloper
1
590
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
210
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
3
750
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
210
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
210
Featured
See All Featured
Between Models and Reality
mayunak
4
380
A better future with KSS
kneath
240
18k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
How to Talk to Developers About Accessibility
jct
2
490
Into the Great Unknown - MozCon
thekraken
41
2.7k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
660
Leo the Paperboy
mayatellez
8
2.1k
Technical Leadership for Architectural Decision Making
baasie
3
470
Designing for humans not robots
tammielis
254
26k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
260
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
400
Transcript
現在のmbstringの立ち位置 これからどうなっていくのか
自己紹介 てきめん • https://tekitoh-memdhoi.info • X: @youkidearitai • https://github.com/youkideari tai
オレ
mbstringとは • PHPのマルチバイト処理を司るPHP拡張 • C言語でできている – libmbflというライブラリに依存している • UCS方式(目的の文字コードに変換する前にUCSに変換する) –
コードポイントごとに処理する – 対する方式としてCSI方式がある(Rubyが代表的) • もちろん組合せ爆発はあるものの独自の文字エンコーディングとかできたりするのでこっち もメリットが有る
今までのmbstring • PHP 5.6くらいまでは活発に日本人が開発・利用して いた – コミッターもいらっしゃった – 諸説あるけど7ではもうほとんどいなくなってた •
セキュリティの専門家もいる • 徳丸先生とかがいるのはかなり強い
現在のmbstring • 実はmbstringという名前の通り、色々な国・地域の人々が使ってい たPHP拡張だった • 当然のことながら「海外に徳丸先生は居ない」ため、不適切な使われ 方が散見されるようになる • PHP 8.1で判明した大規模改修で注目されているのは
「mb_detect_encoding」 – これを使って文字コードを判定してたので困り果てる日本・海外ユーザー 多数
統一されていない内部エンコーディング • 実は内部で使用する文字コードはバラバラ – mb_strposではUTF-8に変換する • https://github.com/php/php-src/issues/9613 で不正なバイト 列で ?
がマッチするというIssueを作ったことがある – mb_substr他、大体の関数ではUTF-32(UCS-4)に変換する – この挙動の不統一さによって、セキュリティ問題が発生する可 能性があると指摘される
日本のユーザーはどうやってたか • 我々には徳丸先生がいる – コミッターの大垣さんもいた • mb_check_encodingを作ってくれたのでまずはそれを通し て不正なバイト列を弾くということをする – そうすれば先程の不統一さは気にしなくても良くなる
普通書くならこうですよね
海外のユーザーでは? ぎょっとしましたがこれをXSS対策だと言ってきました: https://externals.io/message/121889#121924 ま、まあ海外に徳丸先生は居ないから…
いやあ…それは違うでしょうと言いたいが • mb_check_encodingを使って入力された文字コードのチェックをするなんて本当に やっているのか? – 日本のユーザーならこんな話はしないはず • https://www.docswell.com/s/ockeghem/ZVM1XZ-PHPCON-2010-character-code-securit y –
13年前に徳丸先生が「文字コードちゃんとチェックしろよ」って言ってくれた • しかし、フールプルーフのような考え方をするならば、このような方法を想定しなければ ならないのでは? – つまり、色々なユースケースを考えないといけないよなということ などと考えるようになりました。
Character indices used by mb_strpos and mb_substr have same meaning,
even on invalid strings #12913 • https://github.com/php/php-src/pull/12913 – Alexさんが作ってくれました • mb_substrの挙動の変更ということになります • SJIS-macで動かない文字が発生しましたが… – 使ってないだろうしいいだろうということで一致しています
つまりこれからのmbstringは • 徳丸先生のいない世界線のmbstringの使われ方 を想定しないといけない – そういう人たちにはmbstringはレイヤーが低め • 日本人が作り、日本人が使っていたというユース ケースから、日本人はユーザーのうちの一人になっ てしまった
最新のmbstringの動向 • 最近Alex Dowadさんに呼び出されているのは、主 にmb_strcut関数についてです – Alexさんによると「libmbflに依存している最後の関数」 だそうです – libmbflからの脱却を図っているという認識です
• そうすると使われない数千行のコードを削除できます
最近のわたし • mb_strcutってよくわからん関数ですね – 切られ方が違ってる可能性があるので注意してくださ い(挙動が違ってる可能性ありと言いたい) – 正がわからなくなってくる – レビューするからには全力でやっていきます
mbstringとは関係ありませんが 次のようなことがありました
「みんなUTF-8だからUTF-8にしようぜ」 • https://externals.io/message/121825 Deprecate declare(encoding='...') + zend.multibyte + zend.script_encoding +
zend.detect_unicode ? • 「いやあ…」っていうため息が感想 – Shift_JISでは5c問題がでるということ(GB 18030も出るので中国も影響がある) – Shift_JISには亜種が大量にあり、そのバイト列だけで何の漢字を指しているのかわからないこと – そもそもISO-8859シリーズでも0xC4とか何になるの?Latin-1ならISO-8859-1だけど、16まであるよね?どう やって判断するの? – RustならUTF-8デフォルトだしいいんじゃね?に対して • PHPほどの古い言語で新しい言語を比較に出すのはフェアじゃない、同じくらい歳を重ねた言語(Perl, Ruby, Python, Javaなど)と比較をすべきだと主張 – 「PSRがあってあっちではUTF-8で書けって言ってるんだからそれでいいじゃないか」と主張 • 「タブとかスペースとか縛られたくないのだが」という反論に対し、「オレが話してるのは文字コードの話。PSRの話じゃない。 論点をずらすないで」と反論 – 徹底的にぐうの音もださせないようにしました。ユニコード戦記で学んだ
まとめ • mbstringは日本人が作って使ってたから、世界中のユーザーの一人に変 わっていった • 海外に徳丸先生は居ない(日本でも永遠ではない) • libmbflから脱却しようとしている – mb_strcutの挙動が変わっている可能性がある
• 文字コードのチェックはちゃんとしましょう • 内部の文字コード処理はバラバラである
いかがでしたか? • mbstringは最早日本語の拡張ではないと思われます • こんな感じでほぼ毎日、土日もなしに議論してます★ – 国境なき技術での議論は楽しいですよ • これからも文字コードおよび文字集合の規格を掘り下げて調べて いきます
– PHPカンファレンス北海道ではよろしくお願いします。 • 資料作成中です