Foros del Web » Programando para Internet » PHP »

Cómo mejorar la seguridad de esta página?.

Estas en el tema de Cómo mejorar la seguridad de esta página?. en el foro de PHP en Foros del Web. Feliz semana, a quien pueda interesar "la historia completa", puede ver este post: http://www.forosdelweb.com/showthrea...gura+del+mundo Y hay este link para quienes esten interesados: http://www.forosdelweb.com/showthrea...gura+del+mundo Con las ...
  #1 (permalink)  
Antiguo 07/02/2004, 10:09
 
Fecha de Ingreso: enero-2004
Mensajes: 89
Antigüedad: 13 años, 11 meses
Puntos: 0
Cómo mejorar la seguridad de esta página?.

Feliz semana, a quien pueda interesar "la historia completa", puede ver este post:

http://www.forosdelweb.com/showthrea...gura+del+mundo

Y hay este link para quienes esten interesados:

http://www.forosdelweb.com/showthrea...gura+del+mundo

Con las indicaciones recibidas allí, he "mejorado" la página/script de esta forma:

En la session se guardan unas variables de las cuales depende los accesos.
Las variables de session solo son registradas si el acceso $_POST['variable'] contiene el valor correcto
La seguridad depende 100% del valor registrado en las 2 variables de session:

"esteserdelespacio" y "lapersonaesvalida"

Finalmente lo unico que se me ocurre es COPIAR (y pegar) las cabeceras sugeridas por CLUSTER:

// No almacenar en el cache del navegador esta página.
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Expira en fecha pasada
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // Siempre página modificada
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Pragma: no-cache"); // HTTP/1.0

##################################3

01 // Podria un hacker reescribir los archivos de session?
02 // A + variables de session utilizadas en el condicional de acceso mayor seguridad?
03 // Como puedo hacer este condicional:

if(**** la variable **** $_POST['pasword'] **** viene de la pagina hopedada en: http://misitio.com/directoriodepagin...avalida.php*** )
{
entonces procese
}
else
{
mail("[email protected]","Me intentan fregar","El dia tal desde $REMOTE_ADDR intentan hackearme";
header('Location: http://www.google.com/');
exit;
}
04 // Es inapropiado:

Código PHP:
 $_SESSION['ip_quepuedeutilizar_estapagina'] = $REMOTE_ADDR
Código PHP:
 (if($_SESSION['ip_quepuedeutilizar_estapagina'] != $REMOTE_ADDR... // (LA ACTUAL IP) 
Es decir, en la linea 58 (que se egecuta solo una vez) agregar:


Código PHP:
 $_SESSION['ip_quepuedeutilizar_estapagina'] = $REMOTE_ADDR
y continuar validando esa variable en la linea 48 asi:

Código PHP:
 if($_SESSION['esteserdelespacio'] != 'es_aceptado') OR $_SESSION['ip_quepuedeutilizar_estapagina'] != $REMOTE_ADDR 
O es obtusa esa idea?.

--------------------------------------------------------

GRACIAS!.

Este es el script:


Código PHP:
<?php

    
//Primero creamos el nombre de la session:
    
session_name("paginasegura");
    
//(Sinceramente no se de que sirve hacerlo, si por defecto existe: PHPSESSID).

    //Segundo la solicitamos
    
session_start();

    
$inicio "<CENTER><FORM ACTION='$PHP_SELF' METHOD='POST'>Ingresa la clave: (<BR><INPUT TYPE='PASSWORD' NAME='clave'> <INPUT TYPE=SUBMIT VALUE='Ingresar'></FORM></CENTER></BODY></HTML>";
    
$laclavesecreta 'fdw';

    
//Para evitar avisos en caso de que trabajemos con [ error_reporting=E_ALL ]
    //Iniciamos las variables $clave, $intento y $accion como cadenas vacias:

    
if(!isset($_SESSION['esteserdelespacio']))
    {
    
$_SESSION['esteserdelespacio'] = '';
    
$_SESSION['lapersonaesvalida'] = '';
    echo 
$inicio;
    exit;
    }

    if(!isset(
$accion)){$accion '';}
    if(!isset(
$intento)){$intento '';}
    if(!isset(
$_POST['clave'])) {$_POST['clave'] = '';}

    
/*
    Aplicamos 2 funciones sobre la variable para quitarle cualesquier
    caracter maligno como: $_POST['clave']='<?php include("file_x.php"); ?>'
    Creo que debe hacese = con todo lo que envie el usuario
    + vale prevenir...
    */
    
    
$_POST['clave'] = trim($_POST['clave']);
    
$_POST['clave'] = htmlentities($_POST['clave']);

    
//Salimos de la session si es lo que se desea
    //Y destruimos todos los datos almacenados en la session:
    
if("salir" === "$accion")
    {
    
$_SESSION = array();
    
session_destroy();
    echo 
$inicio;
    exit;
    }

    if(
$_SESSION['esteserdelespacio'] != 'es_aceptado')
    {
    
//Comprovamos la clave secreta:
    //Si es valida, registramos la session:
    
if($laclavesecreta === $_POST['clave'])
    {
    unset(
$_SESSION['intento']);
    
$_SESSION['esteserdelespacio'] = 'es_aceptado';
    
//Y tambien una variable secreta que es desconocida para el usuario:
    //La cual sera REQUERIDA para la validacion:
    
$_SESSION['lapersonaesvalida'] = 'parecequesi';
    echo 
"Bienvenido";
    
//Se continuan todas las acciones
    //Como por ejemplo:
    
echo "<A HREF='$PHP_SELF?accion=salir'>Salir</A>";
    }
    else
    {
    
//Si la persona se equivoca + de 3 veces, lo + probable es que sea un hacker
    //Entonces dejamos la cookie en la PC de la persona, y la sacamos de nuestro sitio web
    
if(isset($_SESSION['intento']))
    {
    if(
$_SESSION['intento'] > 3)
    {
    
header("Location: [url]http://127.0.0.1[/url]");
    exit;
    }
    }

    
$intento++;
    
$_SESSION['intento'] = $intento;
    
$losintentos $_SESSION['intento'];
    echo 
"$losintentos $inicio";
    exit;
    }
    }
    
    else
    {
    echo 
"Bienvenido";
    
//Se continuan todas las acciones
    //Como por ejemplo:
    
echo "<A HREF='$PHP_SELF?accion=salir'>Salir</A>";
##
##    O bien podriamos redirigir a la persona a otras paginas con:
##    header("Location: paginas_solo_para_usuarios.php");
##    exit;
##         ##    colocando al inicio de cada una de ellas:
##    include("estapagina.php");
##         
    
}

?>
GRACIAS NUEVAMENTE.

Si acaso a alguien le llega a servir este script, me gustaria saberlo, APENAS COMIENZO EN PHP, y seria muy estimulante pensar que en algo a alguien le ha servido el jijuemadre.

Salu2!.

Última edición por CHAMO01; 07/02/2004 a las 10:13
  #2 (permalink)  
Antiguo 07/02/2004, 12:33
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Las cabeceras HTTP que usas para no "cachear" la página .. también puedes usarlas desde funciones de sesiones con:

session_cache_limiter() .. con opciones como "public" .. "nocache" y algunas más ...

Si haces:
$_SESSION['var']='';

Es recomendable que hagas:
unset($_SESSION['var']) .. como de hecho lo haces en otra parte del código .. y que uses isset() y/o empty() a esa variable como ya lo usas para ver si está definida (si está creada esa variable de sesión) o si tiene valor a su vez (distinto de NULL o 0)

Por lo demás .. veo "enrredado" la lógica . con todas esas variables de sesión que vas creando tipo $_SESSION['esteserdelespacio'] o la de
$_SESSION['lapersonaesvalida'] (no he estudiado profundamente la lógica . .pero a simple vista esa es la impresión que me dá). Creo que si "pules" un poco más la lógica .. te podrías ahorrar alguna de esas variables de sesión y seguiría siendo seguro tu aplicación ...

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 07/02/2004, 13:48
 
Fecha de Ingreso: enero-2004
Mensajes: 89
Antigüedad: 13 años, 11 meses
Puntos: 0
Gracias.

Realice 4 preguntas en el post.

Podrias comentar algo sobre ellas por favor?.

Muy amable.

Yo comprendo que ustedes tiene + de 100 mensajes para leer por dia, y lograr sus respuestas es un logro!.
  #4 (permalink)  
Antiguo 07/02/2004, 14:01
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
1) ... Pues si .. "exploits" y fallas de seguridad siempre hay .. ya sean de PHP o del sistema operativo que use ese servidor. A todo esto .. a los "hackers" les ayuda una mala configuración de PHP o del servidor que se use. Esto es el cuento de nunca acabar .. cuando un cree que su sistema es "seguro" .. llega otro que sabe más que uno y le tira por tierra todo su sistema ...

2) Pues no .. con una sola sobra ya que todas viajan en la misma sesión y esta es identificada de forma única bajo un mismo SID (Identificador único de sesión).

3) Con la variable de servidor HTTP_REFERER (la puedes acceder por $_SERVER['HTTP_REFERER']) pero no es 100% segura .. esa variabel de servidor es obtenida de las cabeceras HTTP del cliente que conecta al servidor HTTP (y que PHP "le pregunta" a este por ese valor entregandoselo) .. por ende .. es "facil" relativamente "simular" hasta tu própa cadena de "referrer" que vas a buscar (tu domino).

4) .. No es necesario que metas en una variable de sesión la variable de servidor REMOTE_ADDR (que por cierto .. DEBES accederla por el array asociado $_SERVER si quiers seguridad y no asumirla como global como lo estás haciendo con $nombre_variable_servidor ...) .. Tus condicionales de "seguridad" siempre pueden acceder directametne a esa variable de servidor para hacer la comparación .. Insertar esa variable en una sesión no le veo mucho sentido ya que la sesión es "temporal" y tienes ese dato a tu disposición como si de otra variable se tratase.

Un saludo,

PD: .. los +100 mensajes .. no tengo que responderlos obligatoriamente (no me pagan por venir a forosdelweb.com a ayudar en lo que pueda ..) .. Sólo que me gusta hacer comentarios a lo que veo (como te los hice).
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 07/02/2004, 14:20
 
Fecha de Ingreso: enero-2004
Mensajes: 89
Antigüedad: 13 años, 11 meses
Puntos: 0
Mestro, gracias.

NOTA: Nùnca he pensado ni insinuado que sea "obligacion".

Por ello digo: "Es un logro", y SIEMPRE OS DOY LAS GRACIAS.

Sin ustedes NUNCA habria podido pasar de echo $variable; y no es una exagaeracion, habemos personas que requerimos de un poco de explicacion y como le dije al Maestro Josemi: "Aunque uno disponga de 50 manuales, sus ayudas son + importantes que 999 manuales".

Nuevamente GRACIAS.

y disculpen la molestadera de cadas semana.
  #6 (permalink)  
Antiguo 07/02/2004, 17:27
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Tranquilo .. pregunta lo que quieras .. para eso estamos. Yo mismo suelo aprender amenudo de los desafios que Uds. proponen, es decir; a veces veo una pregunta o problema que nunca me había ocurrido o planteado .. pero en seguida me pongo a ver solución y si la encuentro .. algo más que aprendo (y si la resuelve otra persona .. pues iguamente aprendo).

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 13:32.