¿Es segura la redirección de URL en PHP si uso ../../ como un prefijo?

4

Estoy desarrollando una aplicación web PHP y estoy en el proceso de implementar una funcionalidad de redirección.

Sé que la redirección puede ser peligrosa cuando se puede configurar en el lado del cliente y uso ../../ como prefijo para la redirección.

¿Es esto suficiente para asegurarnos de que solo se pueda redirigir a las páginas internas? Lo probé con $_POST['redirurl'] que contenía cosas como http://www.evil.com y ; http://www.evil.com pero no funcionó.

¿Esto es seguro?

if(isset($_POST['redirurl'])){
    $redir='Location: ../../'.$_POST['redirurl'];
    header($redir);
}
    
pregunta ozzi- 02.02.2016 - 08:39
fuente

2 respuestas

3

Usted debería nunca permitir el redireccionamiento a una ruta relativa que pueda ser manipulada en el lado del cliente. Como usted dice, es peligroso ya que potencialmente permite el acceso a archivos fuera de su webroot. Un mejor enfoque es "etiquetar" o nombrar las páginas de destino y redirigirlas dentro de su código.

Por ejemplo, cuando un usuario activa un formulario, permita que publique redirpage con un cierto valor, como dashboard para redirigir a un usuario a una página del panel. Luego, en su código, solo busque un nombre de página compatible:

switch ($_POST['redirpage']) {
    case 'dashboard':
       header('Location: http://www.example.com/dashboard/');
       break;
    case 'account':
       header('Location: http://www.example.com/account/');
       break;
    default:
        // This fallback will be triggered when an "unknown" target page is set
        header('Location: http://www.example.com/');
}

De esa manera, usted controla qué redirecciones se pueden hacer y dónde terminan.

    
respondido por el Oldskool 02.02.2016 - 10:05
fuente
1

Como señala Oldskool, hay otros problemas con esta estrategia. Pero también podría ser vulnerable a la inyección de cabecera.

Del registro de cambios de header() manual de PHP :

  

5.1.2: esta función ahora evita que se envíen más de un encabezado a la vez como protección contra los ataques de inyección de encabezado.

Por lo tanto, en las versiones de PHP anteriores a la 5.1.2, podría enviar algo que contenga una nueva línea para establecer otros encabezados (o establecer nuevamente el encabezado de ubicación). Eso es un riesgo de seguridad. E incluso si tiene una versión más reciente de PHP, ¿qué sucede si alguien utiliza su código en un servidor antiguo por alguna razón que no puede prever? Mitigue este problema llamando a rawurlencode() en el parámetro.

    
respondido por el Anders 02.02.2016 - 09:42
fuente

Lea otras preguntas en las etiquetas