
Corrispondenza tramite espressioni regolari per URL. Versione mantenuta, sicura e compatibile con i browser di url-regex. Risolve la CVE-2020-7661 per i server Node.js.
Espressione regolare per il matching degli URL. Versione mantenuta, sicura e compatibile con i browser di url-regex. Risolve CVE-2020-7661 per i server Node.js. Funziona in Node v14+ e nei browser. Mantenuta per Spam Scanner e Forward Email.
Dopo aver scoperto CVE-2020-7661 e averla divulgata pubblicamente (grazie al mio lavoro su Spam Scanner e Forward Email) – ho utilizzato un'implementazione di url-regex con una sorta di "collante" aggiuntivo per filtrare le corrispondenze URL errate.
Tuttavia, dopo averla usata su Forward Email in produzione (che elabora centinaia di migliaia di email a settimana), ho trovato e documentato molti altri problemi principali con url-regex.
Resomi conto che url-regex non è più mantenuto attivamente, ha 9 pull request aperte al momento in cui scrivo e inoltre non supporta i browser – ho deciso di scrivere questo pacchetto per tutti e di unire tutte le pull request aperte.
Questo pacchetto dovrebbe, si spera, avvicinarsi maggiormente all'uso reale previsto di un'espressione regolare per URL, consentendo anche all'utente di configurarlo come desidera. Se questo pacchetto ti è stato utile, dai un'occhiata a Forward Email ed esplora il nostro codice sorgente su GitHub, che mostra come utilizziamo questo pacchetto.
NOTA: Il comportamento predefinito di questo pacchetto tenterà di caricare re2 (è una dipendenza peer opzionale utilizzata per prevenire attacchi di denial of service tramite espressioni regolari e altro). Se desideri utilizzare questo comportamento, devi avere re2 installato tramite npm install re2 – altrimenti verrà utilizzato un normale RegExp come fallback. Dalla v4.0.0 abbiamo aggiunto un'opzione se desideri forzare questo pacchetto a non tentare nemmeno di caricare re2 (ad esempio se è presente nei tuoi node_modules ma non vuoi usarlo) – basta passare re2: false come opzione.
npm:
npm install url-regex-safe
Abbiamo risolto CVE-2020-7661 includendo RE2 per l'uso con Node.js. Non dovrai più avvolgere manualmente le tue espressioni regolari per URL con new RE2(urlRegex()) tramite url-regex-safe (lo facciamo automaticamente per te).
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'));
Poiché RE2 non è pensato per il browser, non verrà utilizzato e quindi CVE-2020-7661 è ancora un problema lato client. Tuttavia non è grave, poiché al massimo potrebbe far crashare la scheda del browser (mentre lato Node.js avrebbe fatto crashare l'intero processo e sollevato un'eccezione di memoria esaurita).
Questa è la soluzione per te se stai semplicemente usando tag <script> ovunque!
<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>
Se stai usando browserify, webpack, rollup o un altro bundler, puoi semplicemente seguire l'utilizzo di Node qui sopra.
Per usare questo pacchetto con TypeScript, puoi installare il pacchetto @types/url-regex-safe per le definizioni dei tipi.
npm install --save-dev @types/url-regex-safe
Devi sovrascrivere il valore predefinito e impostare strict: true se non desideri che github.com venga riconosciuto da solo (anche se www.github.com funzionerà con strict: false).
A differenza del pacchetto deprecato e non mantenuto url-regex, facciamo alcune cose in modo diverso:
strict a false di default (url-regex lo aveva impostato a true)auth, impostata a false di default (url-regex trova corrispondenze con l'autenticazione di base (Basic Authentication); aveva questo valore impostato a true - tuttavia è un comportamento deprecato in Chromium).parens e ipv6, impostate rispettivamente a false e true di default (url-regex aveva parens impostato a true e ipv6 non esisteva o era impostato a ).Questa limitazione si applica solo se stai usando re2: poiché non possiamo usare la funzionalità dei "negative lookbehind" delle espressioni regolari (a causa delle limitazioni di RE2), non abbiamo potuto integrare la logica di questa pull request. Questo ci avrebbe permesso di fare in modo che example.jpeg corrispondesse solo se fosse example.jp, ma se adesso passi example.jpeg estrae example.jp da esso (poiché .jp è un TLD). Potrebbe esistere una soluzione alternativa e accogliamo con piacere i contributi della community su questo problema.
| Name | Website |
|---|---|
| Forward Email LLC | https://forwardemail.net |
| Kevin Mårtensson | |
| Diego Perini |
| Property | Type | Default Value | Description |
|---|
re2 | Boolean | true | Tenta di caricare re2 da usare al posto di RegExp per creare nuove istanze di espressioni regolari. Se passi re2: false, non verrà nemmeno tentato il caricamento di re2. | |
exact | Boolean | false | Corrispondenza solo con una stringa esatta. Utile con regex.test(str) per verificare se una stringa è un URL. Impostiamo questo valore a false di default per poter trovare corrispondenze in stringhe come github.com (invece di richiedere un protocollo o il sottodominio www). Riteniamo che questo assomigli di più all'uso reale previsto di questo pacchetto. | |
strict | Boolean | false | Impone agli URL di iniziare con un protocollo valido o con www se impostato a true. Se true, consente qualsiasi TLD purché abbia un minimo di 2 caratteri validi. Se false, confronta il TLD con l'elenco dei TLD validi usando tlds. | |
auth | Boolean | false | Corrispondenza con le intestazioni di autenticazione di base (Basic Authentication). Impostiamo questo valore a false di default poiché è stato deprecato in Chromium, e altrimenti lascerebbe all'utente corrispondenze URL indesiderate (anche questo assomiglia di più all'uso reale previsto di questo pacchetto, avendolo impostato a false di default). | |
localhost | Boolean | true | Consente localhost nella parte hostname dell'URL. Vedi test/test.js per maggiori dettagli sul test di localhost e su come possa restituire un valore potenzialmente indesiderato. Una pull request verrebbe presa in considerazione per risolvere il problema "pic.jp" vs. "pic.jpg". | |
parens | Boolean | false | Corrispondenza con parentesi finale in stile Markdown. Impostiamo questo valore a false perché dovrebbe essere l'utente a occuparsi del parsing degli URL in Markdown. | |
apostrophes | Boolean | false | Corrispondenza con gli apostrofi. Impostiamo questo valore a false perché non vogliamo che la stringa background: url('http://example.com/pic.jpg'); restituisca http://example.com/pic.jpg'. Vedi questo issue per maggiori informazioni. | |
trailingPeriod | Boolean | false | Corrispondenza con i punti finali. Impostiamo questo valore a false di default poiché in un comportamento reale si vorrebbe example.com come corrispondenza, non example.com. (a differenza di url-regex, che in quel pacchetto include il punto finale). | |
ipv4 | Boolean | true | Corrispondenza con URL IPv4. | |
ipv6 | Boolean | true | Corrispondenza con URL IPv6. | |
tlds | Array | tlds | Corrispondenza con un elenco specifico di TLD, oppure con l'elenco predefinito fornito da tlds. | |
returnString | Boolean | false | Restituisce l'espressione regolare come stringa invece di un RegExp (utile per logica personalizzata, come abbiamo fatto con Spam Scanner). |
falseapostrophe, impostata a false di default (url-regex la aveva impostata a true).trailingPeriod, impostata a false di default (il che significa che le corrispondenze non conterranno punti finali, mentre url-regex aveva questo valore impostato a true).