URL にマッチする正規表現。メンテナンス済みで安全、ブラウザ対応版の [url-regex][] です。[CVE-2020-7661][cve] を Node.js サーバー向けに解決します。Node v14+ とブラウザで動作します。[Spam Scanner][spam-scanner] と [Forward Email][forward-email] のためにメンテナンスされています。
[CVE-2020-7661][cve] を発見し、公に開示した後([Spam Scanner][spam-scanner] と [Forward Email][forward-email] での作業を通して)、私は [url-regex][] の実装に余分なロジックを追加して、不正な URL マッチをフィルタリングしていました。
しかし、[Forward Email][forward-email] で本番環境で使用したところ(週に数十万のメールを処理しています)、[url-regex][] に関してさらにいくつかの核心的な問題を見つけて文書化しました。
[url-regex][] がもう積極的にメンテナンスされておらず、現時点で 9 件のオープンプルリクエストがあり、ブラウザのサポートも欠けていることに気づき、私はこのパッケージを皆さんのために作成し、すべてのオープン PR をマージすることにしました。
このパッケージは、URL 正規表現の現実世界の意図された使用法により近づき、ユーザーが自由に設定できるようにすることを目指しています。このパッケージが役に立ったなら、[Forward Email][forward-email] をチェックしてみてください。GitHub のソースコードもご覧いただけます。そこではこのパッケージの使用方法が示されています。
注意: このパッケージのデフォルトの動作は、re2 を読み込もうとします(正規表現のサービス拒否攻撃などを防ぐためのオプションのピア依存関係です)。この動作を利用するには、npm install re2 で re2 をインストールする必要があります。インストールされていない場合は、通常の RegExp インスタンスを使用するようにフォールバックします。v4.0.0 以降、re2 の読み込みをまったく試みないように強制するオプションが追加されました(例えば、node_modules に存在するが使用したくない場合)。オプションとして re2: false を渡すだけです。
[npm][]:
npm install url-regex-safe
[CVE-2020-7661][cve] を Node.js 向けに [RE2][] を含めることで解決しました。url-regex-safe を使用すると、URL 正規表現を new RE2(urlRegex()) で手動でラップする必要はありません(自動的に行います)。
const urlRegexSafe = require('url-regex-safe');
const str = 'some long string with url.com in it';
const matches = str.match(urlRegexSafe());
for (const match of matches) {
console.log('match', match);
}
console.log(urlRegexSafe({ exact: true }).test('github.com'));
[RE2][] はブラウザ向けに作られていないため、使用されません。したがって、[CVE-2020-7661][cve] はクライアントサイドでも問題です。ただし、Node.js 側でプロセス全体がクラッシュしてメモリ不足例外がスローされるのに対して、ブラウザ側ではタブがクラッシュする程度なので、それほど深刻ではありません。
<script> タグをそのまま使っている場合の解決策です。
<script src="https://unpkg.com/url-regex-safe"></script>
<script type="text/javascript">
(function() {
var str = 'some long string with url.com in it';
var matches = str.match(urlRegexSafe());
for (var i=0; i<matches.length; i++) {
console.log('match', matches[i]);
}
console.log(urlRegexSafe({ exact: true }).test('github.com'));
})();
</script>
[browserify][]、[webpack][]、[rollup][] などのバンドラーを使用している場合は、上記の Node での使用方法に従ってください。
このパッケージを TypeScript で使用するには、型定義のために @types/url-regex-safe パッケージをインストールできます。
npm install --save-dev @types/url-regex-safe