4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

console.logでMac版Firefoxをクラッシュさせる。

Last updated at Posted at 2021-12-20

この記事は、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"

このようなコードを実装することは絶対にやめましょう。
上記のコメントのような文字列を入力することで、膨大な量の標準出力をさせることができそうです。

宣伝

株式会社オプティマインドでは、一緒に働く仲間を大募集中です。
カジュアル面談も大歓迎ですので、気軽にお声がけください。

【エンジニア領域の募集職種】

【ビジネス領域の募集職種】

『オプティマインドってどんな会社?』については、こちらから
Wantedlyでもこちらで募集中

  1. https://developer.mozilla.org/ja/docs/Web/API/console#outputting_text_to_the_console#using_string_substitutions

  2. ChromeやNode.jsでは動作しません。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?