BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Express 5.0リリース、安定性とセキュリティにフォーカス

Express 5.0リリース、安定性とセキュリティにフォーカス

原文リンク(2025-01-11)

Express.jsチームは2014年の最初のメジャー・バージョン・リリースから10年を経てバージョン5.0.0をリリースした。このリリースは、開発者がより堅牢なNode.jsアプリケーションを作成できるよう、安定性とセキュリティにフォーカスしている。

Express 5はNode.jsの古いバージョンのサポートを終了した。リリースノートにはこう記載されている:

このリリースではNode.js v18より前のバージョンのサポートを終了しました。古いNode.jsバージョンのサポートが多くのクリティカルなパフォーマンスと保守性の改善を妨げていたため、これは重要な変更です。この変更により、より安定した保守可能な継続的インテグレーション(CI)が可能になり、新しい言語とランタイム機能の採用や、不要になった依存関係の削除を実現できます。

セキュリティ監査の結果、チームはパスルートマッチングの方法に変更を加えることを決定した。正規表現のサービス運用妨害(ReDoS)攻撃 を避けるため、Express 5では正規表現内のサブエクスプレッション、例えば/:foo(\d+) をサポートしなくなった。

// Express 4 exampleapp.get('/:id(\d+)', (req, res) => res.send(`ID: ${req.params.id}`));

Express.JS技術委員会のメンバー Blake Embrey氏は、正規表現(例./^/flights/([^/]+?)-([^/]+?)/?$/i)を'/flights/' + '-'.repeat(16_000) + '/x'に対してマッチさせると通常1ミリ秒以下で処理されるはずが300ミリ秒かかる場合があるという例を提供している。Expressチームは堅牢な入力検証ライブラリの使用を推奨している。

またExpress 5では明確性と予測可能性のために、正規表現内のワイルドカードを明示的に名前付けするか、(.*)**に置き換える必要がある。したがって、/foo*のようなパスは/foo(.*)に更新されなければならない。

ルートのオプションパラメーターの構文も変更される。以前のExpress 4の:name?{/:name}になる:

// Express 4 exampleapp.get('/user/:id?', (req, res) => res.send(req.params.id || 'No ID'));// Express 5 exampleapp.get('/user{/:id}', (req, res) => res.send(req.params.id || 'No ID'));

正規表現キャプチャ・グループの名前のないパラメータはインデックスでアクセスできなくなった。パラメータには名前を付ける必要がある:

// Express 4 exampleapp.get('/user(s?)', (req, res) => res.send(req.params[0])); // 's'// Express 5 exampleapp.get('/user:plural?', (req, res) => res.send(req.params.plural));

Express 5はさらに、サイレント・フェイルや困難なレスポンスのデバッグ作業の防御策として、有効なHTTPステータス・コードを強制する。

// Express 4 exampleres.status(978).send('Invalid status');  // Silently fails// Express 5 exampleres.status(978).send('Invalid status');  // Throws an error

Express.js 5では非同期ミドルウェアとルートでのエラー処理がより簡単になった。リジェクトされたPromiseを自動的にエラー処理ミドルウェアに渡し、try/catchブロックの必要性をなくすことで、Express 5は非同期ミドルウェアやルートでのエラー処理を改善している。

// Express 4 exampleapp.get('/data', async (req, res, next) => {  try {    const result = await fetchData();    res.send(result);  } catch (err) {    next(err);  }});// Express 5 exampleapp.get('/data', async (req, res) => {  const result = await fetchData();  res.send(result);});

Expressチームは重大な変更を最小限に抑えるよう努めているが、新しいリリースに興味のある開発者はExpressコードを新しいバージョンに移行する必要がある。開発者はオンラインで利用可能な移行ガイド を確認することができる。

Express.jsはOpenJS Foundation(At-Largeカテゴリー)のプロジェクトである。追加の技術的詳細と例については、開発者はリリースノート全文を読むことをお勧めする。

作者について

この記事に星をつける

おすすめ度
スタイル

BT