Foros del Web » Programando para Internet » PHP »

Seguridad en PHP

Estas en el tema de Seguridad en PHP en el foro de PHP en Foros del Web. Hola de nuevo a todos, ahora que empiezo a tener una pequeña idea de PHP, tengo un problema enorme. Tengo una página con varias secciones, ...
  #1 (permalink)  
Antiguo 20/07/2006, 15:07
 
Fecha de Ingreso: julio-2006
Ubicación: Sevilla
Mensajes: 94
Antigüedad: 17 años, 8 meses
Puntos: 1
Seguridad en PHP

Hola de nuevo a todos, ahora que empiezo a tener una pequeña idea de PHP, tengo un problema enorme.
Tengo una página con varias secciones, unas públicas y otras que pretendo sean privadas. El acceso a las privadas en principio lo hago con usuario y contraseña encriptada en una BD mysql, pero sólo en una de ellas, la que dá acceso a toda la parte restringida de la web.

¿Alguien puede orientarme sobre cuales son los mejores metodos para mantener la web medianamente protegida?
¿Cómo impido que se acceda directamente a una página privada cuando el usuario escribe su URL en el navegador sin tener que mostrarle usuario/contraseña?

¿Cómo evito que me hagan por ejemplo un defaced? ¿o que algún desaprensivo coja código y lo modifique?

Espero que me ayuden porque de seguridad estoy frito
  #2 (permalink)  
Antiguo 20/07/2006, 15:47
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
Usa sesiones.

Crea un script para el "login" donde autentifica a tu usuario y crea las variables de sesión.

En los scripts/páginas que tengan que estar protegidas, valida la existencia de tus variables de sesión creadas (con una sólo sobra: el nombre del usuario o ID en tus tablas de tus BBDD que te servirán para hacer seguimiento al usuario y demás relaciones de su actividad en tu aplicación)

Información sobre sesiones tienes en:
www.php.net/session

y en las FAQ's de este foro PHP.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 20/07/2006, 15:52
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 20 años, 5 meses
Puntos: 11
Un ejemplo:

login.php
Código PHP:
<?php
    session_start
(); //primera linea del script

    //compruebas si se escribió usuario y contraseña
    
if(isset($_POST['usuario']) && isset($_POST['password']))
    {
         
//validas el usuario y contraseña en la bd
         
....
         
//si existe el usuario creas la variable de sesion
         
$_SESSION['autentificado']="SI";
 
    }
?>
otra.php
Código PHP:
<?php
    session_start
(); //primer linea del script
    //en cada pagina validas que el usuario esté autentificado
    
if($_SESSION['autentificado']!="SI")
    {
          
//si no está autentificado redireccionas al login o pagina de error
          
header("Location: login.php"); 
          exit();
    }
?>
...

<html>
....
  #4 (permalink)  
Antiguo 20/07/2006, 15:56
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
Cita:
Iniciado por claudiovega
Un ejemplo:

login.php
Código PHP:
<?php
    session_start
(); //primera linea del script

    //compruebas si se escribió usuario y contraseña
    
if(isset($_POST['usuario']) && isset($_POST['password']))
    {
         
//validas el usuario y contraseña en la bd
         
....
         
//si existe el usuario creas la variable de sesion
         
$_SESSION['autentificado']="SI";
 
    }
?>
otra.php
Código PHP:
<?php
    session_start
(); //primer linea del script
    //en cada pagina validas que el usuario esté autentificado
    
if($_SESSION['autentificado']!="SI")
    {
          
//si no está autentificado redireccionas al login o pagina de error
          
header("Location: login.php"); 
          exit();
    }
?>
...

<html>
....
Una consulta ..

¿Por qué usar una variable de sesión como la clásica "autentificado=SI"? cuando tenemos y solemos requerir en aplicaciones desde mostrar el "nombre" del usuario autentificado hasta su "ID" (identificador sea cual sea y como se gestione) como para ir relacionando la actividad del usuario en otros sistemas.

Esto es sólo una reflexión .. entiendo el sentido del ejemplo y para no liar .. está muy bien, pero son tantos los sistemas que veo con el dichoso "autentificado=si" rondando por ahí cuando realente usan -otras- variables que ya no me aguanté y lo dije como "reflexión" para los lectores de este mensaje.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 20/07/2006, 16:00
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 20 años, 5 meses
Puntos: 11
jeje, cierto. Jamás lo uso así, sino que le doy mejores usos, pero como ejemplo vale.
  #6 (permalink)  
Antiguo 21/07/2006, 05:21
 
Fecha de Ingreso: junio-2004
Mensajes: 266
Antigüedad: 19 años, 9 meses
Puntos: 8
el session_start() no deberia ir despues de validar el usuario? Realmente no debemos crearle ninguna sesión si no se ha autentificado antes (corregidme si me ekivoko)

Otra forma es guardar como variable de sesion el identificador de la misma y komo bien dicen, akellos valores que se vayan a requerir continuamente en nuestra aplicación web:

Código PHP:
<?
    
include_once("class/tecnico.php");    //Obtengo los valores de los parámetros
    
include_once("php/funcion_saltar.php"); 
    
$usuario $_POST['usuario'];
    
$clave $_POST['clave'];
    
    
$tecnico = new tecnico();
    if (
$tecnico->validar_usuario($usuario,$clave) == '1') {
        
//validado, hacer lo que corresponda
        
@session_start();
        
$_SESSION['usuario'] = $tecnico->get_usuario();
        
$_SESSION['nombre'] = $tecnico->get_nombre();
        
$_SESSION['apellidos'] = $tecnico->get_apellidos();
        
$_SESSION['cargo'] = $tecnico->get_cargo();
        
$_SESSION['rol'] = $tecnico->get_rol();
        
//vble de sesion para comprobar que existe sesión
        
$_SESSION["id_sesion"] = session_id();
            
        
saltar("filtrar_contrato.php");
    } else {
        
// no validado, volver al panel de identificacion
        
saltar("identificacion.php?error=1");
    }

?>

y luego un comprobar.php incluido en cada pagina restringida:

Código PHP:
<? @session_start();    
    if (
$_SESSION["id_sesion"] != session_id()) {
                
// sesion no valida, volver a panel identificacion y mostrar error
        
include("funcion_saltar.php");
        
saltar("identificacion.php?msg=0000");
    }
?>
  #7 (permalink)  
Antiguo 21/07/2006, 06:06
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 2 meses
Puntos: 129
Cita:
el session_start() no deberia ir despues de validar el usuario? Realmente no debemos crearle ninguna sesión si no se ha autentificado antes (corregidme si me ekivoko)
Según el código que presentas (script) .. como sólo lo usas para crear esas variables de sesión si pasó la validación en el login .. como mencionas crear la sesión sólo si pasó dicha validación sería lo más óptimo.

Otro detalle:
¿Registrar el ID de sesión en una variable de sesión?. Dicho valor lo obtienes usando la función session_id() en el script que lo quieras ver siempre y cuando como en todo uso de sesiones las inicies con session_start() (esto ya lo haces y lo observas)

//vble de sesion para comprobar que existe sesión
$_SESSION["id_sesion"] = session_id();

Si te fijas bien .. ese valor del SID (session_name() + session_id .. o accedido por la constante de mismo nombre: SID) siempre es el mismo si vienes de la misma sesión.

Es decir .. a efectos de validación si se hizo login o no .. siempre se dá el caso de que $_SESSION['variable_registrada'] siempre existirá si pasó por el script que la creó y en consecuencia se propagó el SID (el mismo) correctamente.

Código PHP:
sesision_start();
if (empty(
$_SESSION['variable_registrada']){
  die (
"acceso incorrecto");
}

// resto script a ejecutar ... 
Por otro lado tienes la función session_regenerate_id() .. por ejemplo para "forzar" un nuevo ID de sesión que se cree en el "login" para siempre iniciar una nueva sesión, por qué si haces un nuevo login con la sesión activa (por qué llegas a este por un link desde tu aplicación y sesión abierta ..etc) se continuará usando el mismo SID con los datos nuevos que puedas obtener de tu nuevo "login".

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:20.