
URL용 정규식 매칭. url-regex의 유지 관리되고 안전하며 브라우저 친화적인 버전입니다. Node.js 서버의 CVE-2020-7661을 해결합니다.
URL을 위한 정규식 매칭. url-regex의 유지 관리되는 안전한 브라우저 친화적 버전입니다. Node.js 서버용 CVE-2020-7661을 해결합니다. Node v14+ 및 브라우저에서 작동합니다. Spam Scanner 및 Forward Email을 위해 유지 관리됩니다.
CVE-2020-7661을 발견하고 (Spam Scanner 및 Forward Email에서의 작업을 통해) 공개적으로 공개한 후 – 잘못된 URL 매치를 걸러내기 위해 url-regex 구현체에 약간의 추가 접착 코드를 더해 사용했습니다.
그러나 주당 수십만 통의 이메일을 처리하는 Forward Email 프로덕션에서 사용한 후, url-regex에서 핵심 문제 몇 가지를 더 발견하고 문서화했습니다.
url-regex가 더 이상 활발히 유지 관리되지 않고, 이 글을 쓰는 시점에 9개의 열린 풀 리퀘스트가 있으며, 브라우저 지원도 부족하다는 것을 깨닫고 – 이 패키지를 모든 사람을 위해 작성하고 모든 열린 풀 리퀘스트를 병합하기로 결정했습니다.
이 패키지는 URL 정규식의 실제 의도된 사용 방식에 더 가깝게 동작하고, 사용자가 원하는 대로 구성할 수도 있기를 바랍니다. 이 패키지가 도움이 되었다면 Forward Email을 확인해 주시고, GitHub에서 이 패키지를 어떻게 사용하는지 보여주는 소스 코드도 살펴보세요.
참고: 이 패키지의 기본 동작은 re2를 로드하려 시도합니다 (정규식 서비스 거부 공격 등을 방지하는 데 사용되는 선택적 peer dependency입니다). 이 동작을 사용하려면 npm install re2를 통해 re2를 설치해야 합니다. 그렇지 않으면 일반 RegExp 인스턴스를 사용하도록 대체됩니다. v4.0.0부터는 이 패키지가 re2 로드를 시도조차 하지 않도록 강제하려는 경우를 위한 옵션을 추가했습니다 (예: node_modules에 있지만 사용하고 싶지 않은 경우) – 옵션으로 re2: false를 전달하기만 하면 됩니다.
npm:
npm install url-regex-safe
Node.js 사용을 위해 RE2를 포함하여 CVE-2020-7661을 해결했습니다. 이제 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은 여전히 클라이언트 측 문제입니다. 그러나 최악의 경우 브라우저 탭이 충돌할 뿐이므로 심각하지 않습니다 (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
github.com 자체를 매치하고 싶지 않다면 기본값을 재정의하여 strict: true로 설정해야 합니다 (strict: false에서도 www.github.com은 작동합니다).
더 이상 사용되지 않고 유지 관리되지 않는 url-regex 패키지와 달리 몇 가지를 다르게 처리합니다:
strict를 false로 설정합니다 (url-regex는 true로 설정되어 있었습니다)auth 옵션을 추가했으며 기본값은 false입니다 (url-regex는 Basic Authentication과 매치했으며 true로 설정되어 있었습니다 - 그러나 이는 Chromium에서 더 이상 사용되지 않는 동작입니다).parens 및 ipv6 옵션을 추가했으며 기본값은 각각 false와 true입니다 (url-regex는 parens가 true로 설정되어 있었고 ipv6는 존재하지 않거나 false로 설정되어 있었습니다).이 제한 사항은 re2를 사용하는 경우에만 적용됩니다: RE2 제한으로 인해 정규식의 "negative lookbehind" 기능을 사용할 수 없으므로 이 풀 리퀘스트의 로직을 병합할 수 없었습니다. 이 로직을 통해 example.jpeg는 example.jp인 경우에만 매치되도록 할 수 있었겠지만, 지금 example.jpeg를 전달하면 .jp가 TLD이므로 example.jp가 추출됩니다. 대안적인 해결책이 존재할 수 있으며, 이 문제에 대한 커뮤니티 기여를 환영합니다.
| 이름 | 웹사이트 |
|---|---|
| Forward Email LLC | https://forwardemail.net |
| Kevin Mårtensson | |
| Diego Perini |
| 속성 | 유형 | 기본값 | 설명 |
|---|
re2 | Boolean | true | 새 정규식 인스턴스를 만들 때 RegExp 대신 사용할 re2를 로드하려 시도합니다. re2: false를 전달하면 re2 로드가 시도조차 되지 않습니다. | |
exact | Boolean | false | 정확한 문자열만 매치합니다. 문자열이 URL인지 확인하는 regex.test(str)과 함께 유용합니다. github.com과 같은 문자열 값을 매치하기 위해 기본값을 false로 설정했습니다 (프로토콜이나 www 하위 도메인을 요구하는 대신). 이것이 이 패키지의 실제 의도된 사용 방식에 더 가깝다고 생각합니다. | |
strict | Boolean | false | true로 설정하면 URL이 유효한 프로토콜 또는 www로 시작하도록 강제합니다. true이면 최소 2개의 유효한 문자만 있으면 모든 TLD를 허용합니다. false이면 tlds를 사용하여 유효한 TLD 목록과 대조하여 매치합니다. | |
auth | Boolean | false | Basic Authentication 헤더와 매치합니다. Chromium에서 더 이상 사용되지 않으므로 기본값을 false로 설정했습니다. 그렇지 않으면 사용자에게 원치 않는 URL 매치가 남게 됩니다 (기본값도 false로 설정하여 이 패키지의 실제 의도된 사용 방식에 더 가깝게 했습니다). | |
localhost | Boolean | true | URL 호스트명 부분에서 localhost를 허용합니다. localhost 테스트와 원치 않을 수 있는 값을 반환하는 방식에 대한 자세한 내용은 test/test.js를 참조하세요. "pic.jp" 대 "pic.jpg" 문제를 해결하기 위한 풀 리퀘스트가 고려될 것입니다. | |
parens | Boolean | false | Markdown 스타일의 후행 괄호와 매치합니다. Markdown URL 구문 분석은 사용자의 몫이어야 하므로 false로 설정했습니다. | |
apostrophes | Boolean | false | 아포스트로피와 매치합니다. background: url('http://example.com/pic.jpg'); 문자열이 http://example.com/pic.jpg'로 매치되는 것을 원하지 않기 때문에 false로 설정했습니다. 자세한 내용은 이 이슈를 참조하세요. | |
trailingPeriod | Boolean | false | 후행 마침표와 매치합니다. 실제 동작에서는 example.com. 대신 example.com이 매치되기를 원하므로 기본값을 false로 설정했습니다 (해당 패키지에서 후행 마침표를 매치하는 url-regex와 다릅니다). | |
ipv4 | Boolean | true | IPv4 URL과 매치합니다. | |
ipv6 | Boolean | true | IPv6 URL과 매치합니다. | |
tlds | Array | tlds | 특정 tlds 목록 또는 tlds에서 제공하는 기본 목록과 매치합니다. | |
returnString | Boolean | false | RegExp 대신 문자열로 RegExp를 반환합니다 (Spam Scanner에서 했던 것처럼 사용자 정의 로직에 유용합니다). |
apostrophe 옵션을 추가했으며 기본값은 false입니다 (url-regex는 true로 설정되어 있었습니다).trailingPeriod 옵션을 추가했으며 기본값은 false입니다 (매치에 후행 마침표가 포함되지 않음을 의미하며, url-regex는 true로 설정되어 있었습니다).