Foros del Web » Programando para Internet » PHP »

Evitar que un script se llame directamente

Estas en el tema de Evitar que un script se llame directamente en el foro de PHP en Foros del Web. Buenas, Sabéis de que manera se puede restringir para que un script solo se ejecute si procede de la misma máquina? Quiero añadir seguridad a ...
  #1 (permalink)  
Antiguo 17/06/2010, 16:29
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Evitar que un script se llame directamente

Buenas,

Sabéis de que manera se puede restringir para que un script solo se ejecute si procede de la misma máquina?
Quiero añadir seguridad a mis scripts para que no se ejecuten de forma remota, y sea inútil acceder a ellos, a no ser que sea internamente desde la web.

Actualmente tengo esto...

Código PHP:
Ver original
  1. $url = explode("?",$_SERVER['HTTP_REFERER']);
  2. $pag_referida=$url[0];
  3. // chequear si se llama directo al script.
  4. if ($_SERVER['HTTP_REFERER'] == ""){
  5.     die (Header ("Location: ../error/no_encontrada.php"));
  6.     exit;
  7.     }

Pero es fácil saltárselo mediante CURL si añadimos que venimos desde una página.

¿Se os ocurre algún otro método preventivo?

Muchas gracias de antemano!
  #2 (permalink)  
Antiguo 17/06/2010, 19:56
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Evitar que un script se llame directamente

Por eso es que no se debe verificar si procede del mismo servidor. Lo mejor es verificar que los datos estén correctos y escapar los caracteres que pueden provocar un ataque XSS. No es útil intentar verificar si el código procede del mismo servidor.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 17/06/2010, 23:16
 
Fecha de Ingreso: abril-2003
Ubicación: Mexico
Mensajes: 604
Antigüedad: 21 años
Puntos: 23
Respuesta: Evitar que un script se llame directamente

Buenas!!!

pues a mi se me ocurre que incluyas una "bandera" que sea verificada mediante sessiones verificando que asi es llamado el scrip por otro del mismo servidor

es obvio que esa bandera tiene que ser dinamica para que tenga efecto porque si es una estatica en cuanto alguien se fije de como funciona ya no tendra que acceder

eh utilizado este metodo con mucho exito... sobre todo en referente a sesiones ;)

un saludo!!
__________________
¡El Respeto al Derecho Ajeno Es la Paz!
  #4 (permalink)  
Antiguo 17/06/2010, 23:55
Avatar de zerpico_01  
Fecha de Ingreso: enero-2008
Ubicación: Wilde - Avellaneda -
Mensajes: 421
Antigüedad: 16 años, 3 meses
Puntos: 13
Respuesta: Evitar que un script se llame directamente

pues con un token o un cortafuego.... es muy complejo de explicarlo

tambien puedes configurar tu .htaccess



pero te recomiendo que sigas el consejo de abimaelrc
trata de hacer tu codigo seguro...

saludos!!
  #5 (permalink)  
Antiguo 18/06/2010, 00:31
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Evitar que un script se llame directamente

Cita:
Iniciado por abimaelrc Ver Mensaje
Por eso es que no se debe verificar si procede del mismo servidor. Lo mejor es verificar que los datos estén correctos y escapar los caracteres que pueden provocar un ataque XSS. No es útil intentar verificar si el código procede del mismo servidor.
Pero aunque verifiques que los datos son correctos, cuando se descubre que variables se están enviando al script lo login.php puedes amañarte un script con curl que vaya probando user y pass no? puede que los datos que envies sean correctos, pero te estan enviando muchiisimas peticiones cada minuto, o cada día si el tio sigue intentandolo.

Llegados a ese punto imagino que quizás vale más la pena mirar los logs del apache y localizar la IP desde la que se hacen los intentos y bloquearla... De ahí que me digas que no es útil verificar si el código procede del mismo servidor

Muchas gracias a todos
  #6 (permalink)  
Antiguo 18/06/2010, 06:50
Avatar de zerpico_01  
Fecha de Ingreso: enero-2008
Ubicación: Wilde - Avellaneda -
Mensajes: 421
Antigüedad: 16 años, 3 meses
Puntos: 13
Respuesta: Evitar que un script se llame directamente

Cita:
Iniciado por neodani Ver Mensaje
Pero aunque verifiques que los datos son correctos, cuando se descubre que variables se están enviando al script lo login.php puedes amañarte un script con curl que vaya probando user y pass no? puede que los datos que envies sean correctos, pero te estan enviando muchiisimas peticiones cada minuto, o cada día si el tio sigue intentandolo.

Llegados a ese punto imagino que quizás vale más la pena mirar los logs del apache y localizar la IP desde la que se hacen los intentos y bloquearla... De ahí que me digas que no es útil verificar si el código procede del mismo servidor

Muchas gracias a todos
Oop!! pero haber que no entiendes, el tema es mas complejo de lo que se te podria explicar aqui, y el solo hecho de darte un ejemplo implicaria una chorrada de codigo... lo que podemos es decirte como hacerlo para evitar problemas.

1.- tu formulario loguin debe tener un regristro de errores, si el usuario comete mas de 7 errores tomar y ejecutar accioenes:
a- banear el ip
b- relacionar el ip con cuentas de usuarios
c- almacenar log del script

2- tu archivo de llamada a la base de datos debe tener un anti flog para evitar el exeso de peticiones

3 tu archivo httaccess debe tener las configuraciones necesarias para evitar ijecciones y el abuso de peticiones

4- todas las variables que usaran datos enviados por el usuario deben ser procesado debidamente ....

5.- todos tus formularios deben ser generados dinamicamente para un solo uso y con tiempo de vencimiento.

6- toda actividad de usuarios no logueado deben ser monitoreada por la aplicacion, en el caso de que se suceda ijeccion via urls, via formulario el admin debe recibir un mail de alerta y aprobechando las nuevas tecnologias un mensaje sms

7- debes usar tecnicas token para links y formularios, debes crear una session unica que compare la fecha hora demas.... juas juaasssss

etc etc etc

y llevaria todo un dia explicar un plan de defensa


PARA TU EJEMPLO TAMBIEN PUEDES USAR variables de servidor :

'SCRIPT_NAME'
Contiene la ruta del script actual. Ésta es útil para páginas que necesitan apuntar a ellas mismas. La constante __FILE__ contiene la ruta completa y nombre del archivo actual (es decir, incluido).
'REQUEST_URI'
El URI que fue dado para acceder a esta página; por ejemplo, '/index.html'.

'HTTP_HOST'
Contenidos de la cabecera Host: de la petición actual, si existe.
'HTTP_REFERER'
La dirección de la página (si la hay) la cual refirió al agente de usuario a la página actual. Este valor es definido por el agente de usuario. No todos los agentes de usuario lo definen, y algunos proveen la capacidad de modificar HTTP_REFERER como una característica del software. En resumen, no se puede confiar realmente en este valor.

para ver mas sobre esto visita el manual oficial php !!
saludos!!!
  #7 (permalink)  
Antiguo 18/06/2010, 08:45
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Evitar que un script se llame directamente

Yo creo sí es tan delicado tu script lo deberías poner fuera del WebRoot, así tu puedes mandarlo llamar directamente y no esta accesible vía Web.

Saludos.
  #8 (permalink)  
Antiguo 18/06/2010, 13:18
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Evitar que un script se llame directamente

Cita:
Iniciado por GatorV Ver Mensaje
Yo creo sí es tan delicado tu script lo deberías poner fuera del WebRoot, así tu puedes mandarlo llamar directamente y no esta accesible vía Web.

Saludos.
Me recomiendas entonces que el fichero donde tengo las claves de la base de datos y demás que utilizo para hacer las conexiones a la base de datos, lo tenga fuera de la carpeta www? en un nivel superior?

Por ejemplo en windows...
Lugar del site
C:\wamp\www\web01

Lo puedo tener en C:\wamp\ y estaría seguro, y luego hacer desde los scripts un

include ("../../claves.php");

Muchas gracias
  #9 (permalink)  
Antiguo 18/06/2010, 13:20
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Evitar que un script se llame directamente

Lo que te indica GatorV es eso mismo de indicarlo fuera del root de las páginas web, pero que el cron vea directamente el código y lo ejecute, no que incluyas en algún archivo de PHP el código.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #10 (permalink)  
Antiguo 18/06/2010, 13:44
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Evitar que un script se llame directamente

Cita:
Iniciado por abimaelrc Ver Mensaje
Lo que te indica GatorV es eso mismo de indicarlo fuera del root de las páginas web, pero que el cron vea directamente el código y lo ejecute, no que incluyas en algún archivo de PHP el código.
No si la idea de poner fuera un script "confidencial" que solo quieres ejecutar tu, lo tengo claro que debe ir fuera de la carpeta pública de la web.

Mi ejemplo iba, para los tipicos ficheros que guardas datos sensibles como las claves de conexión a la base de datos en tus scripts de la web. Pero por tu comentario intuyo que dado que se hace un include a un fichero dentro del directorio público de la web, da igual ponerlo fuera que dentro... correcto?

Gracias ;)
  #11 (permalink)  
Antiguo 18/06/2010, 13:46
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Evitar que un script se llame directamente

Cita:
Iniciado por neodani Ver Mensaje
Me recomiendas entonces que el fichero donde tengo las claves de la base de datos y demás que utilizo para hacer las conexiones a la base de datos, lo tenga fuera de la carpeta www? en un nivel superior?

Por ejemplo en windows...
Lugar del site
C:\wamp\www\web01

Lo puedo tener en C:\wamp\ y estaría seguro, y luego hacer desde los scripts un

include ("../../claves.php");

Muchas gracias
Siempre es recomendable tener toda la logica de la aplicacion fuera del document root, así es menos vulnerable tu aplicación.

Saludos.
  #12 (permalink)  
Antiguo 18/06/2010, 13:48
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Evitar que un script se llame directamente

Oh, entonces, en el caso que estás indicando, sí es conveniente colocarlo fuera y llamarlo entonces directamente en el archivo. Así como muestras en el ejemplo.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #13 (permalink)  
Antiguo 18/06/2010, 13:56
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Evitar que un script se llame directamente

Muchas gracias a ambos por vuestros sabios consejos, así lo haré

Etiquetas: Ninguno
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 20:20.