
Correspondência de expressão regular para URLs. Versão mantida, segura e compatível com navegadores do url-regex. Resolve o CVE-2020-7661 para servidores Node.js.
Correspondência de expressões regulares para URLs. Versão mantida, segura e compatível com navegadores do url-regex. Resolve o CVE-2020-7661 para servidores Node.js. Funciona no Node v14+ e em navegadores. Mantido para Spam Scanner e Forward Email.
Após descobrir o CVE-2020-7661 e divulgá-lo publicamente (através do meu trabalho no Spam Scanner e no Forward Email) – usei uma implementação do url-regex com uma camada extra para filtrar correspondências de URL indesejadas.
No entanto, após usá-lo no Forward Email em produção (que processa centenas de milhares de e-mails por semana), encontrei e documentei vários problemas principais adicionais com o url-regex.
Percebendo que o url-regex não é mais mantido ativamente, possui 9 pull requests abertos até o momento da escrita e também não suporta navegadores – decidi escrever este pacote para todos e mesclar todos os pull requests abertos.
Este pacote deve, esperançosamente, se aproximar mais do uso pretendido no mundo real de uma expressão regular de URL, além de permitir que o usuário a configure como desejar. Por favor, confira o Forward Email se este pacote ajudou você, e explore nosso código-fonte no GitHub que mostra como usamos este pacote.
NOTA: O comportamento padrão deste pacote tentará carregar o re2 (é uma dependência opcional usada para evitar ataques de negação de serviço por expressão regular e mais). Se você deseja usar este comportamento, deve ter o re2 instalado via npm install re2 – caso contrário, ele usará instâncias normais de RegExp. A partir da v4.0.0, adicionamos uma opção caso você queira forçar este pacote a nem mesmo tentar carregar o re2 (ex.: ele está no seu node_modules mas você não quer usá-lo) – basta passar re2: false como opção.
npm:
npm install url-regex-safe
Resolvemos o CVE-2020-7661 incluindo o RE2 para uso no Node.js. Você não precisará mais envolver manualmente suas expressões regulares de URL com new RE2(urlRegex()) através do url-regex-safe (fazemos isso automaticamente para você).
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'));
Como o RE2 não foi feito para o navegador, ele não será usado e, portanto, o CVE-2020-7661 ainda é um problema no lado do cliente. No entanto, não é grave, pois o máximo que faria é travar a aba do navegador (no lado do Node.js, teria travado todo o processo e lançado uma exceção de falta de memória).
Esta é a solução para você se estiver usando apenas tags <script> em todo lugar!
<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>
Supondo que você esteja usando browserify, webpack, rollup ou outro bundler, basta seguir o uso do Node acima.
Para usar este pacote com TypeScript, você pode instalar o pacote @types/url-regex-safe para definições de tipos.
npm install --save-dev @types/url-regex-safe
Você deve substituir o padrão e definir strict: true se não desejar corresponder github.com sozinho (embora www.github.com funcione se strict: false).
Ao contrário do pacote obsoleto e não mantido url-regex, fazemos algumas coisas de forma diferente:
strict como false por padrão (url-regex definia como true)auth, que é false por padrão (url-regex correspondia à Autenticação Básica; tinha isso como true – no entanto, é um comportamento depreciado no Chromium).parens e ipv6, que são false e true por padrão (url-regex tinha parens como true e ipv6 era inexistente ou definido como ).Esta limitação se aplica apenas se você estiver usando re2: Como não podemos usar a funcionalidade de "lookbehinds negativos" de expressões regulares (devido às limitações do RE2), não pudemos mesclar a lógica deste pull request. Isso teria nos permitido fazer com que example.jpeg correspondesse apenas se fosse example.jp, no entanto, se você passar example.jpeg agora, extrairá example.jp dele (já que .jp é um TLD). Uma solução alternativa pode existir, e recebemos contribuições da comunidade sobre este problema.
| Nome | Website |
|---|---|
| Forward Email LLC | https://forwardemail.net |
| Kevin Mårtensson | |
| Diego Perini |
| Propriedade | Tipo | Valor Padrão | Descrição |
|---|
re2 | Boolean | true | Tentar carregar re2 para usar em vez de RegExp para criar novas instâncias de expressão regular. Se você passar re2: false, nem mesmo tentará carregar re2. | |
exact | Boolean | false | Corresponder apenas a uma String exata. Útil com regex.test(str) para verificar se uma String é uma URL. Definimos como false por padrão para corresponder a valores de String como github.com (em vez de exigir um protocolo ou subdomínio www). Acreditamos que isso se aproxima mais do uso pretendido no mundo real deste pacote. | |
strict | Boolean | false | Forçar URLs a começarem com um protocolo válido ou www se definido como true. Se true, permitirá qualquer TLD desde que tenha no mínimo 2 caracteres válidos. Se for false, corresponderá o TLD contra a lista de TLDs válidos usando tlds. | |
auth | Boolean | false | Corresponder a cabeçalhos de Autenticação Básica. Definimos como false por padrão, pois foi depreciado no Chromium e, caso contrário, deixa o usuário com correspondências de URL indesejadas (também se aproxima mais do uso pretendido no mundo real deste pacote ao defini-lo como false por padrão). | |
localhost | Boolean | true | Permite localhost na parte do hostname da URL. Veja test/test.js para mais informações sobre o teste de localhost e como ele pode retornar um valor indesejado. Um pull request seria bem-vindo para resolver o problema "pic.jp" vs. "pic.jpg". | |
parens | Boolean | false | Corresponder a parênteses finais no estilo Markdown. Definimos como false porque deve ser responsabilidade do usuário analisar URLs do Markdown. | |
apostrophes | Boolean | false | Corresponder a apóstrofos. Definimos como false porque não queremos que a String background: url('http://example.com/pic.jpg'); resulte em http://example.com/pic.jpg'. Veja esta issue para mais informações. | |
trailingPeriod | Boolean | false | Corresponder a pontos finais. Definimos como false por padrão, pois o comportamento no mundo real desejaria example.com em vez de example.com. como correspondência (diferente do url-regex que corresponde ao ponto final naquele pacote). | |
ipv4 | Boolean | true | Corresponder a URLs IPv4. | |
ipv6 | Boolean | true | Corresponder a URLs IPv6. | |
tlds | Array | tlds | Corresponder a uma lista específica de tlds, ou a lista padrão fornecida por tlds. | |
returnString | Boolean | false | Retornar a RegExp como uma String em vez de um RegExp (útil para lógica personalizada, como fizemos com Spam Scanner). |
falseapostrophe, que é false por padrão (url-regex tinha isso como true).trailingPeriod, que é false por padrão (o que significa que as correspondências não conterão pontos finais, enquanto url-regex tinha isso como true).