Estaba buscando algunos ejemplos de detección automática de locale, ya que necesitaba hacer lo mismo en mi aplicación PHP. La mayoría de las respuestas que encontré fueron similares, solo que diferían en los métodos de análisis. Un ejemplo 'pseudo-código':
$supportedLocales = ['en, 'bg', 'pl'];
$locale = 'en'; // default fallback locale
$userLangs = preg_split('/,|;/', $_SERVER["HTTP_ACCEPT_LANGUAGE"]);
foreach($userLangs as $lang)
{
if(in_array($lang, $supportedLocales))
{
$locale = $lang;
break;
}
}
Pero, después de un rato de experimentar con el encabezado Accept-Language en mi navegador para ver si todo funciona correctamente, noté que en realidad podía hacer el encabezado muy largo, haciendo que el servidor haga muchos bucles porque el código los bucles anteriores se distribuyen a través de toda la matriz $ supportedLocales para cada clave de la matriz $ userLangs. De hecho, podría enviar fácilmente un encabezado forjado en Accept-Language con más de 25000 idiomas falsos que no eran compatibles con la aplicación, generando más de 100000 iteraciones en total. Sin incluir las iteraciones utilizadas para comparar los valores de cadena.
Incluso aquí, en los sitios web de Stack, podría enviar más de unos miles de idiomas antes de recibir el error '400 Bad Request'. Si esto puede considerarse un ataque, ¿cómo se puede proteger su sitio web de tales encabezados falsificados? Sé que podría limitar la cantidad de idiomas, pero aún así, ¿qué cantidad puede considerarse normal?