Foros del Web » Programando para Internet » PHP »

Seguridad $_POST. ¿Evitar modificaciones?

Estas en el tema de Seguridad $_POST. ¿Evitar modificaciones? en el foro de PHP en Foros del Web. Ando dándole vueltas a cómo proteger los formularios de mi web de los ataques mediante modificación de los mismos... realmente no sé si es lo ...
  #1 (permalink)  
Antiguo 04/02/2010, 09:03
 
Fecha de Ingreso: septiembre-2006
Mensajes: 68
Antigüedad: 18 años, 3 meses
Puntos: 0
Seguridad $_POST. ¿Evitar modificaciones?

Ando dándole vueltas a cómo proteger los formularios de mi web de los ataques mediante modificación de los mismos... realmente no sé si es lo que se conoce por ataques CSRF (Cross-Site Request Forgeries), intuyo que no, ya que las soluciones que he leído mediante tokens no me sirven en mi caso, o éso o es que me he perdido algo al aplicarlas

El problema...
Un usuario está logado en mi aplicación web, con su correspondiente variable de sesión llamémosla $_SESSION['user'], llega a una página con un formulario, saca el código fuente, copia el formulario, hace sus modificaciones, lo guarda y lo ejecuta...

Las soluciones propuestas en muchos sitios, por ejemplo...
http://shiflett.org/articles/cross-s...uest-forgeries

No me sirven, ya que en el código fuente queda reflejado el valor de $_SESSION['token']
Únicamente valdría si el atacante no está logado en mi aplicación web, pero supongo que si alguien quiere atacarme es porque está usando mi aplicación, está logado y por tanto en la página de recepción de datos del formulario la variable $_SESSION['token'] existe (se ha creado en la página del formulario) y coincide con $_POST['token']

¿Me estoy equivocando en mi razonamiento?
Si estoy en lo cierto, ¿Hay alguna manera de asegurarse realmente de que el usuario viene de mi formulario y no de uno modificado?

Gracias!
  #2 (permalink)  
Antiguo 04/02/2010, 09:07
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 8 meses
Puntos: 839
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

No entiendo muy bien, ¿de qué modificaciones precisamente estás tratando de protegerte?

Un formulario fácilmente puede modificarse con el protocolo javascript: o con cualquier herramienta como Firebug.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 04/02/2010, 09:09
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

Una forma de que te puedes asegurar que es un usuario que está usando tu formulario es usando el captcha.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #4 (permalink)  
Antiguo 04/02/2010, 09:12
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 15 años, 4 meses
Puntos: 150
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

Cita:
Iniciado por falotron Ver Mensaje
Ando dándole vueltas a cómo proteger los formularios de mi web de los ataques mediante modificación de los mismos... realmente no sé si es lo que se conoce por ataques CSRF (Cross-Site Request Forgeries), intuyo que no, ya que las soluciones que he leído mediante tokens no me sirven en mi caso, o éso o es que me he perdido algo al aplicarlas

El problema...
Un usuario está logado en mi aplicación web, con su correspondiente variable de sesión llamémosla $_SESSION['user'], llega a una página con un formulario, saca el código fuente, copia el formulario, hace sus modificaciones, lo guarda y lo ejecuta...

Las soluciones propuestas en muchos sitios, por ejemplo...
http://shiflett.org/articles/cross-s...uest-forgeries

No me sirven, ya que en el código fuente queda reflejado el valor de $_SESSION['token']
Únicamente valdría si el atacante no está logado en mi aplicación web, pero supongo que si alguien quiere atacarme es porque está usando mi aplicación, está logado y por tanto en la página de recepción de datos del formulario la variable $_SESSION['token'] existe (se ha creado en la página del formulario) y coincide con $_POST['token']

¿Me estoy equivocando en mi razonamiento?
Si estoy en lo cierto, ¿Hay alguna manera de asegurarse realmente de que el usuario viene de mi formulario y no de uno modificado?

Gracias!
La prioridad en la seguridad de una web respecto a los formularios NO ESTA en el formulario en sí, sino en el tratamiento de las variables que se envían previo al proceso en sí.

Un ejemplo muy tonto:

-Tienes una web con un campo de lista en un formulario llamado CATEGORIA, y dicha lista tiene 10 valores, de 1 a 10. ¿tienes temor a que puedan copiarte el formulario y enviarte un 11? Pues que lo envien! tu luego en el php donde se recogen las variables haces las validaciones pertinentes para que dicho valor sea un valor entero entre 1 y 10 y listo


Otro detalle es usar la variable reservada: $_SERVER['HTTP_REFERER'] , para controlar desde que pagina llega el envio

Última edición por Vun; 04/02/2010 a las 09:17
  #5 (permalink)  
Antiguo 04/02/2010, 09:17
 
Fecha de Ingreso: enero-2010
Mensajes: 152
Antigüedad: 14 años, 11 meses
Puntos: 5
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

entgre otras cosas, lo que metas en $_SESSION[x...] no será visible para el usuario, solo en el servidor.

Puedes verificar que la URL de origen corresponda con la de tu formulario.

Puedes simplemente hacer dos cosas:

Primero generas dos tokens,

El token uno lo sumas al token 2 y aplicas md5 guardando el resultado en una variable de sesion.
El token 2 lo guardas tambien en una variable de sesion.
El token 1 lo envías en un campo oculto al desplegar el formulario.
Recibes el token de vuelta junto con el formulario, unes el token 1 con el token 2, generas el md5 y lo comparas con el que tenias antes y, si empatan, el formulario es el correcto.

De esa manera el usuario jamas conocera el valor de Token2, aunado a que el formulario solo puede venir de tu URL pues.....
  #6 (permalink)  
Antiguo 04/02/2010, 09:20
 
Fecha de Ingreso: septiembre-2006
Mensajes: 68
Antigüedad: 18 años, 3 meses
Puntos: 0
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

Cita:
Iniciado por Vun Ver Mensaje
La prioridad en la seguridad de una web respecto a los formularios NO ESTA en el formulario en sí, sino en el tratamiento de las variables que se envían previo al proceso en sí.

Un ejemplo muy tonto:

-Tienes una web con un campo de lista en un formulario llamado CATEGORIA, y dicha lista tiene 10 valores, de 1 a 10. ¿tienes temor a que puedan copiarte el formulario y enviarte un 11? Pues que lo envien! tu luego en el php donde se recogen las variables haces las validaciones pertinentes para que dicho valor sea un valor entero entre 1 y 10 y listo


Otro detalle es usar la variable reservada: $_SERVER['HTTP_REFERER'] , para controlar desde que pagina llega el envio
No conocía ésto del $_SERVER['HTTP_REFERER']
¿Pero ésto no soluciona por ejemplo modificaciones hechas con Firebug, no? No sé exactamente cómo funciona Firebug, pero tengo entendido que hace los cambios 'en caliente'
  #7 (permalink)  
Antiguo 04/02/2010, 09:22
 
Fecha de Ingreso: septiembre-2006
Mensajes: 68
Antigüedad: 18 años, 3 meses
Puntos: 0
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

Cita:
Iniciado por paynalton Ver Mensaje
entgre otras cosas, lo que metas en $_SESSION[x...] no será visible para el usuario, solo en el servidor.

Puedes verificar que la URL de origen corresponda con la de tu formulario.

Puedes simplemente hacer dos cosas:

Primero generas dos tokens,

El token uno lo sumas al token 2 y aplicas md5 guardando el resultado en una variable de sesion.
El token 2 lo guardas tambien en una variable de sesion.
El token 1 lo envías en un campo oculto al desplegar el formulario.
Recibes el token de vuelta junto con el formulario, unes el token 1 con el token 2, generas el md5 y lo comparas con el que tenias antes y, si empatan, el formulario es el correcto.

De esa manera el usuario jamas conocera el valor de Token2, aunado a que el formulario solo puede venir de tu URL pues.....
mmm...
Suena muy bien, lo probaré
  #8 (permalink)  
Antiguo 04/02/2010, 09:22
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 8 meses
Puntos: 839
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

Vuelvo a la pregunta, ¿qué cambios en realidad temes?

Como ya te explicaron, sólo tienes que validar los datos del lado del servidor. No puedes evitar que cambien los datos del formulario, eso es muy fácil de hacer.

Por otro lado, sólo recordar que no todos los agentes de usuario envían la cabecera HTTP_REFERER (o por lo menos no un dato válido), no es recomendable depender de eso.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #9 (permalink)  
Antiguo 04/02/2010, 09:23
 
Fecha de Ingreso: enero-2010
Mensajes: 152
Antigüedad: 14 años, 11 meses
Puntos: 5
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

firebug no es el unico, hay muchas aplicaciones que te permiten hacer todo dentro del ambiente de dominio.... ante eso lo unico que te queda es comprobar cada valor recibido y, sobretodo, no confiar en nada que venga del uusario.
  #10 (permalink)  
Antiguo 04/02/2010, 09:24
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 6 meses
Puntos: 1517
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

Estoy de acuerdo con David, por eso te recomiendan lo de los token o captcha.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #11 (permalink)  
Antiguo 04/02/2010, 09:26
 
Fecha de Ingreso: julio-2003
Ubicación: Cochabamba Bolivia
Mensajes: 300
Antigüedad: 21 años, 5 meses
Puntos: 14
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

Mira en si no explicas bien cual es el problema que te crea el usuario, pero desde ya te digo que si quieres que los formularios solo lleguen desde tu pagina pues hay muchas formas de controlar eso pero la mas facil y la que te recomiendo es que uses captchas asi el formulario servira una sola ves.

Ahora no importa si el se crea su formulario ya que tu al momento de recoger las variables tienes que validar los campos que te envian para aceptar solo lo que tu quieras sea texto, numeros , etc. no te preocupes en que si el se crea un formulario ya que los spamers son mucho peores tienen programas especialmente para rellenar formulario a la mala y si no validas lo que recoges pues tendras muchos mas problemas a futuro.

Saludos.
__________________
:policia: Uno para todos y todos para uno.
  #12 (permalink)  
Antiguo 04/02/2010, 09:35
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 4 meses
Puntos: 1532
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

aquí te explican muy bien que es un CSRF: http://www.eslomas.com/index.php/arc...icaciones-web/

puedes verificar la existencia de firebug, con este simple código:

Código Javascript:
Ver original
  1. if(window.console && window.console.firebug){
  2.             alert("El sistema no puede funcionar si la consola de depuración se encuentra activada");
  3.             window.location='error.php';
  4.         }

pero eso no garantiza ni protege contra modificaciones directas por otros componente, suerte!
  #13 (permalink)  
Antiguo 04/02/2010, 09:43
 
Fecha de Ingreso: septiembre-2006
Mensajes: 68
Antigüedad: 18 años, 3 meses
Puntos: 0
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

Cita:
Iniciado por David Ver Mensaje
Vuelvo a la pregunta, ¿qué cambios en realidad temes?

Como ya te explicaron, sólo tienes que validar los datos del lado del servidor. No puedes evitar que cambien los datos del formulario, eso es muy fácil de hacer.
Sí sí... los datos siempre los valido

Entonces, ¿tan sencillo es de modificar los datos de un formulario 'en caliente', aparte de Firebug?
Quiero decir, si consigo asegurarme de que los datos vienen exclusivamente del formulario de mi página (por ejemplo mediante el sistema de tokens posteado por arriba, y con lo cual evitaría modificaciones 'en frío') y consigo deshabilitar Firebug, como he visto que han posteado... ¿Aún quedarían maneras de modificar mis formularios 'en caliente'?
  #14 (permalink)  
Antiguo 04/02/2010, 09:46
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 8 meses
Puntos: 839
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

Créeme, intentar impedir que cambien los datos del formulario es perder el tiempo.

Como ya indiqué, ni siquiera necesitas más que el protocolo javascript: para hacerlo.

La solución práctica es validar todos los datos que recibas del formulario, comprueba que realmente tengan los tipos de valores que esperas recibir.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #15 (permalink)  
Antiguo 04/02/2010, 09:47
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 16 años, 4 meses
Puntos: 1532
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

Cita:
Iniciado por falotron Ver Mensaje
Sí sí... los datos siempre los valido

Entonces, ¿tan sencillo es de modificar los datos de un formulario 'en caliente', aparte de Firebug?
Quiero decir, si consigo asegurarme de que los datos vienen exclusivamente del formulario de mi página (por ejemplo mediante el sistema de tokens posteado por arriba, y con lo cual evitaría modificaciones 'en frío') y consigo deshabilitar Firebug, como he visto que han posteado... ¿Aún quedarían maneras de modificar mis formularios 'en caliente'?
Sí, tal como dice david
  #16 (permalink)  
Antiguo 04/02/2010, 09:48
 
Fecha de Ingreso: enero-2010
Mensajes: 152
Antigüedad: 14 años, 11 meses
Puntos: 5
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

Si, por ejemplo yo uso esto:

http://chrispederick.com/work/web-developer/

Para ayudarme en el desarrollo, pero muchas cosas puedesn ser empleadas para modificar formularios en caliente y atacar de la forma en que describes.

Además estan los expertos que son capaces de crear su propio navegador que ignore distintas políticas de seguridad que tienen los navegadores comunes (como las políticas crossDomain).

Al final no puedes confiar en nada que provenga desde fuera de tu servidor (y a veces nisiquiera desde dentro)
  #17 (permalink)  
Antiguo 04/02/2010, 09:54
 
Fecha de Ingreso: septiembre-2006
Mensajes: 68
Antigüedad: 18 años, 3 meses
Puntos: 0
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

Cita:
Iniciado por David Ver Mensaje
Créeme, intentar impedir que cambien los datos del formulario es perder el tiempo.

Como ya indiqué, ni siquiera necesitas más que el protocolo javascript: para hacerlo.

La solución práctica es validar todos los datos que recibas del formulario, comprueba que realmente tengan los tipos de valores que esperas recibir.
Pues todo mi gozo en un pozo
Validar el tipo de datos, limpiarlo y demás siempre lo hago

Lo que quería ahorrarme es todo el porrón de comprobaciones, consultas a DB y demás, que podría ahorrarme si supiera a ciencia cierta que los valores recogidos vienen de mis formularios...
  #18 (permalink)  
Antiguo 04/02/2010, 10:09
Avatar de morior  
Fecha de Ingreso: agosto-2009
Ubicación: Barcelona
Mensajes: 437
Antigüedad: 15 años, 4 meses
Puntos: 12
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

Yo creo que por ahí arriba te han dado ya la respuesta. Si lo que temes es una inyección (porque lo que comentas se refiere a ese tipo de cosas) siempre puedes hacer diferentes comprobaciones. Recuerda que como bien comentan no te puedes fiar de lo que viene de fuera, pero sí te puedes fiar de lo que hace tu programa.

Un ejemplo, si sabes que sólo vas a recibir valores numéricos y temes que alguien te pase una inyección mete una condición antes del código.

Código PHP:
if (!is_numeric($variable)){
//lo envías a otro lado e incluso te puedes guardar su variable de sesión si las tienes para saber quién te está toqueteando el código :)
}else{

//ejecutas el programa


__________________
Juego de navegador online
  #19 (permalink)  
Antiguo 04/02/2010, 10:18
 
Fecha de Ingreso: julio-2003
Ubicación: Cochabamba Bolivia
Mensajes: 300
Antigüedad: 21 años, 5 meses
Puntos: 14
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

Cita:
Iniciado por falotron Ver Mensaje
Pues todo mi gozo en un pozo
Validar el tipo de datos, limpiarlo y demás siempre lo hago

Lo que quería ahorrarme es todo el porrón de comprobaciones, consultas a DB y demás, que podría ahorrarme si supiera a ciencia cierta que los valores recogidos vienen de mis formularios...


Mira es así de simple:

Si haces poco trabajo en tu código pues poca seguridad tendrás.

Si realizas mas trabajo en tu código pues mas seguridad tendrás.

NADA ES FÁCIL EN ESTA VIDA !!!!!

Cosechas lo que siembras.

Saludos.
__________________
:policia: Uno para todos y todos para uno.
  #20 (permalink)  
Antiguo 05/02/2010, 07:28
 
Fecha de Ingreso: septiembre-2006
Mensajes: 68
Antigüedad: 18 años, 3 meses
Puntos: 0
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

Cita:
Iniciado por sander Ver Mensaje


Mira es así de simple:

Si haces poco trabajo en tu código pues poca seguridad tendrás.

Si realizas mas trabajo en tu código pues mas seguridad tendrás.

NADA ES FÁCIL EN ESTA VIDA !!!!!

Cosechas lo que siembras.

Saludos.
Lógico

La cuestión aquí es...
En mi caso concreto, aparte de validar la integridad de los datos recibidos para corregir posibles ataques a BD tengo otras muchas validaciones que hacer aparte de si un dato es númerico, alfanumérico, etc...

Imaginad esta situación (tremendamente simple)
Vendo un producto, que viene dado por las variables $referencia y $precio
Lo lógico y seguro sería pasar únicamente $referencia por formulario, y después sacar $precio de la BD... pero imaginemos el caso que quiero pasar ambas variables por formulario, si fuera seguro podría ahorrarme la consulta a la BD en el código de recepción de datos. Este ejemplo muestra el día a día de mi aplicación web, pero en lugar de 2 con muchas más variables. Por éso quería intentar asegurar este tema, aunque ya me he dado cuenta que no es posible y que en definitiva lo mejor es pasar lo justo por formularios... cest la vie
  #21 (permalink)  
Antiguo 22/09/2011, 17:45
 
Fecha de Ingreso: julio-2007
Ubicación: México DF
Mensajes: 57
Antigüedad: 17 años, 5 meses
Puntos: 4
Respuesta: Seguridad $_POST. ¿Evitar modificaciones?

Cita:
Iniciado por paynalton Ver Mensaje
entgre otras cosas, lo que metas en $_SESSION[x...] no será visible para el usuario, solo en el servidor.

Puedes verificar que la URL de origen corresponda con la de tu formulario.

Puedes simplemente hacer dos cosas:

Primero generas dos tokens,

El token uno lo sumas al token 2 y aplicas md5 guardando el resultado en una variable de sesion.
El token 2 lo guardas tambien en una variable de sesion.
El token 1 lo envías en un campo oculto al desplegar el formulario.
Recibes el token de vuelta junto con el formulario, unes el token 1 con el token 2, generas el md5 y lo comparas con el que tenias antes y, si empatan, el formulario es el correcto.

De esa manera el usuario jamas conocera el valor de Token2, aunado a que el formulario solo puede venir de tu URL pues.....


La verdad es que para mi esta es tambien una muy buena solucion si te pudiera dar puntos te los daría paynalton jeje saludos
__________________
Web Hosting y Diseño Web

Etiquetas: modificaciones, post, seguridad
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 03:22.