¿Por qué agregar un signo de interrogación evita el problema “403: Permiso denegado”?

¿Todo después del? se considera una cadena de consulta. La mayoría de los servidores web no solo sirven archivos HTML simples, sino que envían la mayoría de las solicitudes a través de una puerta de enlace donde funciona (usando PHP, Java, Python, Go, Node.JS, etc.). Estos pueden analizar la cadena de consulta para obtener información útil (esto generalmente se denomina solicitud GET). El servidor web sabe que la puerta de enlace necesita esta información de cadena de consulta y generalmente la deja sola.

La cuestión es que la cadena de consulta puede ser diferente cada vez, es decir:

www.test.com/login.html?username=bob

y

www.test.com/login.html?username=alice

Ambos apuntan al mismo archivo html, pero la cadena de consulta es diferente. Para la mayoría de los servidores web, estos se consideran diferentes “archivos” (o URL).

Entonces, si entré en la configuración de mi servidor web y bloqueé explícitamente

www.test.com/confidential.html

Podría escribir

www.test.com/confidential.html?

Y el servidor web pensaría “Oh, este archivo no está en la lista de bloqueados” y luego la puerta de enlace pensaría “Oh, la cadena de consulta está vacía, permítanme servir el archivo” y BAM obtendrá su archivo.

Esta es una gran simplificación, así que no me cite los detalles, pero espero que ayude. Hay muchas maneras de evitar que la gente use el? truco (como coincidencia de patrones y expresiones regulares, bloqueo de subdirectorios completos, etc.) pero he notado el? El truco es ideal para acceder a imágenes bloqueadas y cosas así.