
Регулярное выражение для сопоставления URL. Поддерживаемая, безопасная и совместимая с браузерами версия url-regex. Устраняет CVE-2020-7661 для серверов Node.js.
Регулярное выражение для сопоставления 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 открытых pull request'ов, а также не поддерживает браузеры, я решил написать этот пакет для всех и объединить все открытые pull request'ы.
Этот пакет, надеюсь, должен более точно соответствовать реальному предполагаемому использованию регулярного выражения для URL, а также позволять пользователю настраивать его по своему усмотрению. Пожалуйста, загляните в [Forward Email][forward-email], если этот пакет вам помог, и изучите наш исходный код на GitHub, где показано, как мы используем этот пакет.
ПРИМЕЧАНИЕ: По умолчанию этот пакет пытается загрузить re2 (это опциональная peer-зависимость, используемая для предотвращения отказа в обслуживании с помощью регулярных выражений и многого другого). Если вы хотите использовать это поведение, у вас должен быть установлен re2 через npm install re2 – в противном случае будет использоваться обычный RegExp. Начиная с версии v4.0.0 мы добавили опцию, если вы хотите заставить пакет даже не пытаться загружать re2 (например, он есть в вашем node_modules, но вы не хотите его использовать) – просто передайте re2: false в качестве опции.
[npm][]:
npm install url-regex-safe
Мы устранили [CVE-2020-7661][cve], включив [RE2][] для использования с Node.js. Вам больше не придётся вручную оборачивать регулярные выражения для URL с помощью new RE2(urlRegex()) через url-regex-safe (мы делаем это автоматически).
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