Tengo una función que se ejecuta antes de cada solicitud de API para verificar si la solicitud proviene de un origen válido.
Tengo una matriz de orígenes válidos.
const whitelist = [ 'a.com', 'b.co.uk' ] const validOrigin = str => { const url = new URL( str ) return whitelist.includes( url.host ) } console.log(validOrigin('https://www.a.com')) Devuelve falso debido a la www. No quiero simplemente agregar una copia con www. a la matriz de orígenes válidos. Me gustaría una forma que cubra esto y todo lo demás inesperado.
Teniendo en cuenta que, por las reglas , www.example.com y example.com son orígenes diferentes :
Si desea hacer coincidir cualquier origen en el mismo dominio o un subdominio de los dominios en la lista blanca, debe:
. seguido de la cadena (para detener la coincidencia de third-party-hacker-a.com )Entonces algo como:
const validOrigin = str => { const url = new URL( str ) const host = url.host; return whitelist.some( element => { if (element === host) return true; return element.endsWith(`.${host}`); } ) }La función Array.prototype.includes solo acepta el valor a buscar y busca una coincidencia exacta.
Necesitará usar una función que acepte una devolución de llamada para probar los elementos, por ejemplo, la función Array.prototype.findIndex .
Como menciona en los comentarios, también deberá cambiar la whitelist para poder excluir dominios cuyo nombre termine con uno de sus dominios válidos.
const whitelist = [ /(^|\.)a\.com$/i, /(^|\.)b\.co\.uk$/i ]; const validOrigin = str => { const url = new URL(str); const index = whitelist.findIndex(el => el.test(url.host)); return index !== -1; }; document.querySelectorAll("#tests > li").forEach(li => { const str = li.dataset.value; const result = validOrigin(str); li.textContent = `${str} = ${result}`; }); <ul id="tests"> <li data-value="http://a.com/foo"></li> <li data-value="http://www.a.com/foo"></li> <li data-value="http://dev.a.com/foo"></li> <li data-value="http://banana.com/foo"></li> <li data-value="http://a.com.b.ru/foo"></li> </ul>puedes intentar algo como esto
str = str.replace( new RegExp("((http)(s)?:\/\/)?(www.)?","gm"),"")esto eliminará la primera parte de la url