この記事は、OPTIMIND x Acompany Advent Calendar 2021の記事です。
この記事は、OPTIMIND 吉川が記載しています。
console.logでMac版Firefoxをクラッシュさせる
年の暮、Log4jのご対応にてご多忙の中にも活気あふれる日々をお過ごしのことと存じます。
私は、Log4jの調査の中、ロギング処理であるという共通点を持つconsole.logを利用して、Mac版Firefoxをクラッシュできることを確認できたのでキャッキャしています。
console.logは、以下のように 置換文字列
1 が利用できます。
これは以下のように出力をすることができます。
console.log('Hello %s!!!', 'World'); // Hello World!!!と出力されます。
他にも数値や、オブジェクトの出力などができます。
数値は精度による置換処理もできるため便利(?)です。2
console.log('Tax is %.2f', 1.1); // 1.10と出力されます。
つまり、console.logは文字列の状態によって、padを入れるという処理を実行しています。
これを使ってMac版Firefoxをクラッシュさせることができました。
具体的には以下のコードを実行します。
console.log('Tax is %.101f', 1);
101桁で何かしらの閾値に達してエラーが発生しているためだと思われます。
また、UbuntuのChromeでは現象は確認できていません。
蛇足
まずやらないとは思いますが、以下のような置換文字列を含む文字列をユーザの入力から動的に作成するコードを書くことは避けた方が良いです。
console.log(`Age ${input} %d`, age);
今回はMac版のFirefoxだけで確認できましたが、これがサーバサイドだった場合自体は深刻になるかもしれません。
Ruby
sprintf("Age is %d, I'm " + name, age) # name = '%1$999999999d %1$999999999d ....'
Python
("Age is %(age)d, I'm " + name) % itemMap # name = "%(age)999999999999d"
PHP
printf("Age is %d, I'm {$name}", $age) // $name = "%1$999999999999d"
このようなコードを実装することは絶対にやめましょう。
上記のコメントのような文字列を入力することで、膨大な量の標準出力をさせることができそうです。
宣伝
株式会社オプティマインドでは、一緒に働く仲間を大募集中です。
カジュアル面談も大歓迎ですので、気軽にお声がけください。
【エンジニア領域の募集職種】
- ソフトウェアエンジニア
- QAエンジニア
- Androidアプリエンジニア
- 組合せ最適化アルゴリズムエンジニア
- 経路探索アルゴリズムエンジニア
- バックエンドエンジニア
- インフラエンジニア
- UXUIデザイナー
【ビジネス領域の募集職種】
『オプティマインドってどんな会社?』については、こちらから
Wantedlyでもこちらで募集中