Foros del Web » Programando para Internet » PHP »

evitar hackeo por envio de variables ($_post)

Estas en el tema de evitar hackeo por envio de variables ($_post) en el foro de PHP en Foros del Web. estimados amigos una base de datos ha sido vulnerada , al parecer se fijaron en el nombre del archivo que ejecuta el action (form) y ...
  #1 (permalink)  
Antiguo 05/01/2018, 00:15
 
Fecha de Ingreso: febrero-2008
Mensajes: 409
Antigüedad: 16 años, 10 meses
Puntos: 2
Pregunta evitar hackeo por envio de variables ($_post)

estimados amigos una base de datos ha sido vulnerada , al parecer se fijaron en el nombre del archivo que ejecuta el action (form) y enviaron las variables $_post desde otro archivo/otro servidor.

Lo que se me ha ocurrido para prevenir esto es, poner en el archivo que tiene la action a ejecutar (que es el que lleva el comando SQL) un filtro, verificando que el archivo anterior (desde donde se envian las variables POST) está en el mismo servidor mío, así que cualquier otro formulario falso creado para vulnerar la data, simplemente no sea ejecutado....

mi pregunta es... con qué comando verifico si el archivo anterior es uno de mi servidor ? como se verifica la url inmediata anterior ?

a alguien le ha pasado esto ? gracias !
  #2 (permalink)  
Antiguo 05/01/2018, 02:42
Avatar de fbedia  
Fecha de Ingreso: julio-2010
Mensajes: 159
Antigüedad: 14 años, 5 meses
Puntos: 8
Respuesta: evitar hackeo por envio de variables ($_post)

Cita:
Iniciado por jiten Ver Mensaje
estimados amigos una base de datos ha sido vulnerada , al parecer se fijaron en el nombre del archivo que ejecuta el action (form) y enviaron las variables $_post desde otro archivo/otro servidor.

Lo que se me ha ocurrido para prevenir esto es, poner en el archivo que tiene la action a ejecutar (que es el que lleva el comando SQL) un filtro, verificando que el archivo anterior (desde donde se envian las variables POST) está en el mismo servidor mío, así que cualquier otro formulario falso creado para vulnerar la data, simplemente no sea ejecutado....

mi pregunta es... con qué comando verifico si el archivo anterior es uno de mi servidor ? como se verifica la url inmediata anterior ?

a alguien le ha pasado esto ? gracias !
Yo orientaría la solución por otro lado, ya que también pueden llegarte tanto peticiones $_post como $_get manipuladas desde tu propio servidor.

Lo que deberias de hacer en la pagina que procesas las variables, seria filtrar cada una de elllas... por ejemplo:

Código PHP:
if(isset($_POST['nombre']) && isset($_POST['apellidos']) && isset($_POST['campo3']) && isset($_POST['campo4'])) {
//validacion del nombre
if(strlen($_POST['nombre'])>=&& strlen($_POST['nombre'])<=30) {
//otras validaciones.. por ejemplo una expresion regular para validar solo qe contenta texto... etc
} else {
echo 
"nombre erroneo.. fallo en logitud";
}

Si te fijas en el codigo anterior, primero validamos con un isset() que las variables esperadas existen.

Por otro lado, yo te he puesto un ejemplo con la varianle $_POT['nombre'], pero deberias hacerlo con cada una de las variables:
- valida la logitud de las cadenas dentro de un rango estimado.
- valida el tipo de variable, por ejemplo con una extesion regular... o mediante funciones propias de php, por ejemplo si esperas un numero haz un if(ctype_digit($_POST['edad'])).... o si esperas un email, hay muchas funciones por google para validar el formato email...

Espero haberte ayudado!
Salu2
__________________
Follow me on twitter @franbedia
  #3 (permalink)  
Antiguo 05/01/2018, 06:31
Avatar de zreep  
Fecha de Ingreso: octubre-2009
Ubicación: Argentina
Mensajes: 534
Antigüedad: 15 años, 2 meses
Puntos: 12
Respuesta: evitar hackeo por envio de variables ($_post)

Hola, yo uso PDO, pero esta en el uso de cada uno.

http://php.net/manual/es/pdo.prepared-statements.php


http://garage4hackers.com/showthread.php?t=6944


Saludos
__________________
Zreep
  #4 (permalink)  
Antiguo 05/01/2018, 10:49
 
Fecha de Ingreso: febrero-2008
Mensajes: 409
Antigüedad: 16 años, 10 meses
Puntos: 2
Respuesta: evitar hackeo por envio de variables ($_post)

Cita:
Iniciado por fbedia Ver Mensaje
Yo orientaría la solución por otro lado, ya que también pueden llegarte tanto peticiones $_post como $_get manipuladas desde tu propio servidor.

Lo que deberias de hacer en la pagina que procesas las variables, seria filtrar cada una de elllas... por ejemplo:

Código PHP:
if(isset($_POST['nombre']) && isset($_POST['apellidos']) && isset($_POST['campo3']) && isset($_POST['campo4'])) {
//validacion del nombre
if(strlen($_POST['nombre'])>=&& strlen($_POST['nombre'])<=30) {
//otras validaciones.. por ejemplo una expresion regular para validar solo qe contenta texto... etc
} else {
echo 
"nombre erroneo.. fallo en logitud";
}

Si te fijas en el codigo anterior, primero validamos con un isset() que las variables esperadas existen.

Por otro lado, yo te he puesto un ejemplo con la varianle $_POT['nombre'], pero deberias hacerlo con cada una de las variables:
- valida la logitud de las cadenas dentro de un rango estimado.
- valida el tipo de variable, por ejemplo con una extesion regular... o mediante funciones propias de php, por ejemplo si esperas un numero haz un if(ctype_digit($_POST['edad'])).... o si esperas un email, hay muchas funciones por google para validar el formato email...

Espero haberte ayudado!
Salu2

Gracias, pero el problema es que el campo que ha sido vulnerado es "tarifas" entonces, evidentemente ahi no puedo parametrar demasiado...

por otro lado me gustaría que me expliques cómo es eso que podrían hacer request "desde mi servidor" ? como es eso posible ? gracias
  #5 (permalink)  
Antiguo 05/01/2018, 13:31
Avatar de ArturoGallegos
Moderador
 
Fecha de Ingreso: febrero-2008
Ubicación: Morelia, México
Mensajes: 6.774
Antigüedad: 16 años, 10 meses
Puntos: 1146
Respuesta: evitar hackeo por envio de variables ($_post)

No importa que campo sea el vulnerado, siempre debes validar el valor recibido, por ejemplo dices que es un campo para tarifas, he de pensar que es valor numérico, con lo cual podrías validar con

Código PHP:
Ver original
  1. if(isset($_POST['tarifa']) && is_float($_POST['tarifa'])){
  2. ....
  3. }else{
  4. return 'error';
  5. }

o tambien puedes hacer lo contrario
Código PHP:
Ver original
  1. if(!isset($_POST['tarifa']) || !is_float($_POST['tarifa'])){
  2. return 'error';
  3. }
  4. //aqui tu codigo para procesar la info

si no es numérico podrías validar con una expresión regular
  #6 (permalink)  
Antiguo 05/01/2018, 17:32
 
Fecha de Ingreso: febrero-2008
Mensajes: 409
Antigüedad: 16 años, 10 meses
Puntos: 2
Respuesta: evitar hackeo por envio de variables ($_post)

Cita:
Iniciado por ArturoGallegos Ver Mensaje
No importa que campo sea el vulnerado, siempre debes validar el valor recibido, por ejemplo dices que es un campo para tarifas, he de pensar que es valor numérico, con lo cual podrías validar con

Código PHP:
Ver original
  1. if(isset($_POST['tarifa']) && is_float($_POST['tarifa'])){
  2. ....
  3. }else{
  4. return 'error';
  5. }

o tambien puedes hacer lo contrario
Código PHP:
Ver original
  1. if(!isset($_POST['tarifa']) || !is_float($_POST['tarifa'])){
  2. return 'error';
  3. }
  4. //aqui tu codigo para procesar la info

si no es numérico podrías validar con una expresión regular

Creo que no me he dejado entender. Es claro que puedo validar ( y valido) los datos... pero ese no es el problema... porque al final quien quiera hackear igual pone un valor numérico y ya... igual logra cambiar el valor... por ejemplo en el caso que menciono, los precios estaban en 15 y todos fueron cambiados a 5. Evidentemente no puedo simplemente restringir a un solo dígito o dos porque la idea es que siempre tenga la posibilidad de cambiar mis precios como quiera. Lo que estoy tratando de evitar es que lo haga otra persona desde otro servidor creando simplemente un form con los mismos nombres de variable POST
  #7 (permalink)  
Antiguo 05/01/2018, 19:15
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 9 años, 6 meses
Puntos: 263
Respuesta: evitar hackeo por envio de variables ($_post)

podrias crearte una variable tipo token aleatoreal al momento de ingresar al form, esta variable se valida contra la envada en el form y listo:

Código PHP:
Ver original
  1. $token = rand(5555,999999).uniqid();
  2.     $_SESSION['tmp_token'] = $token;

Código HTML:
Ver original
  1. <input type="hidden" name="token" value="<?php echo $token"/>

Código PHP:
Ver original
  1. if($_POST['token']===$_SESSION['tmp_token']){
  2.         //Proceso el Formulario
  3.     }

obviamente esta variable va a cambiar con cada ingreso en el formulario, pues al no estar declarada y no estar en una sesion, deberia de minimizar el hecho de que de manera externa te manipulen los formularios
__________________
[email protected]
HITCEL
  #8 (permalink)  
Antiguo 05/01/2018, 19:48
Avatar de ArturoGallegos
Moderador
 
Fecha de Ingreso: febrero-2008
Ubicación: Morelia, México
Mensajes: 6.774
Antigüedad: 16 años, 10 meses
Puntos: 1146
Respuesta: evitar hackeo por envio de variables ($_post)

Cita:
por ejemplo en el caso que menciono, los precios estaban en 15 y todos fueron cambiados a 5. Evidentemente no puedo simplemente restringir a un solo dígito o dos porque la idea es que siempre tenga la posibilidad de cambiar mis precios como quiera.
Estoy suponiendo que es un catalogo de productos, lo que yo suelo hacer es que al enviar el formulario con X pedido, no envió el precio del producto en cuestión, solo se enviá el ID del producto, y datos relevantes para el envió o facturación.

Si enviás el precio como has mencionado estas expuesto a que lo cambien, pero si solo enviás el basta con obtener los productos en de la base de datos en ese momento., de esa forma importa un cacahuate si alguien cambia el precio o no en el front.
  #9 (permalink)  
Antiguo 06/01/2018, 20:21
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 4 meses
Puntos: 2237
Respuesta: evitar hackeo por envio de variables ($_post)

Te recomiendo leer este aporte, aunque es antiguo, todavía puede ser muy útil: http://www.forosdelweb.com/f18/aport...a-php-1011808/
__________________
- León, Guanajuato
- GV-Foto
  #10 (permalink)  
Antiguo 07/01/2018, 23:43
 
Fecha de Ingreso: febrero-2008
Mensajes: 409
Antigüedad: 16 años, 10 meses
Puntos: 2
Respuesta: evitar hackeo por envio de variables ($_post)

Cita:
Iniciado por ArturoGallegos Ver Mensaje
Estoy suponiendo que es un catalogo de productos, lo que yo suelo hacer es que al enviar el formulario con X pedido, no envió el precio del producto en cuestión, solo se enviá el ID del producto, y datos relevantes para el envió o facturación.

Si enviás el precio como has mencionado estas expuesto a que lo cambien, pero si solo enviás el basta con obtener los productos en de la base de datos en ese momento., de esa forma importa un cacahuate si alguien cambia el precio o no en el front.
El tema es que es una lista de precios donde mis clientes no son el comprador final, mi clientes son quienes tienen productos ahí exhibidos, entonces ellos sí deberían poder modificar sus precios....y lo hacen. El problema es que el hackeo lo produjo un tercero que ingresó a uno de esos users y manejando externamente los valores del form modificó todos los precios a un mismo monto...

Ese es mi reto: debo dejar que puedan cambiar precios, pero quien lo haga sólo debería poder cambiar a su usuario (el cual es controlado con una variable session) pero de alguna forma se las ingeniaron para modificar los precios de todosss los usuarios...
  #11 (permalink)  
Antiguo 08/01/2018, 09:12
Avatar de ArturoGallegos
Moderador
 
Fecha de Ingreso: febrero-2008
Ubicación: Morelia, México
Mensajes: 6.774
Antigüedad: 16 años, 10 meses
Puntos: 1146
Respuesta: evitar hackeo por envio de variables ($_post)

En ese caso me parece un tanto mas complejo el caso, quizás podrías hacer un sistema de login de 2 o 3 pasos como lo hace digitalocean o mercado pago.

Cada que inicias sesión se te enviá un código de autorización por correo, por SMS o llamada telefónica.

----------
Ahora bien este problema se origino por un fallo/intrusión en tu server/programación, o fue porque alguien obtuvo los accesos de ese usuario?
Porque si son causas imputables al usuario tu puedes poner algo en tus términos y condiciones que te amparen de dicha situación.
  #12 (permalink)  
Antiguo 08/01/2018, 09:56
 
Fecha de Ingreso: febrero-2008
Mensajes: 409
Antigüedad: 16 años, 10 meses
Puntos: 2
Respuesta: evitar hackeo por envio de variables ($_post)

Cita:
Iniciado por ArturoGallegos Ver Mensaje
En ese caso me parece un tanto mas complejo el caso, quizás podrías hacer un sistema de login de 2 o 3 pasos como lo hace digitalocean o mercado pago.

Cada que inicias sesión se te enviá un código de autorización por correo, por SMS o llamada telefónica.

----------
Ahora bien este problema se origino por un fallo/intrusión en tu server/programación, o fue porque alguien obtuvo los accesos de ese usuario?
Porque si son causas imputables al usuario tu puedes poner algo en tus términos y condiciones que te amparen de dicha situación.
de nada sirve la parte legal. debo conseguir evitar este tipo de modificaciones con código. lo curioso es que lograron cambiar no sólo los precios de un cliente sino de varios, siendo que en el action se verifica antes que el codigo del cliente esté validado con un valor session....
  #13 (permalink)  
Antiguo 08/01/2018, 20:38
 
Fecha de Ingreso: febrero-2008
Mensajes: 409
Antigüedad: 16 años, 10 meses
Puntos: 2
Respuesta: evitar hackeo por envio de variables ($_post)

Cita:
Iniciado por xfxstudios Ver Mensaje
podrias crearte una variable tipo token aleatoreal al momento de ingresar al form, esta variable se valida contra la envada en el form y listo:

Código PHP:
Ver original
  1. $token = rand(5555,999999).uniqid();
  2.     $_SESSION['tmp_token'] = $token;

Código HTML:
Ver original
  1. <input type="hidden" name="token" value="<?php echo $token"/>

Código PHP:
Ver original
  1. if($_POST['token']===$_SESSION['tmp_token']){
  2.         //Proceso el Formulario
  3.     }

obviamente esta variable va a cambiar con cada ingreso en el formulario, pues al no estar declarada y no estar en una sesion, deberia de minimizar el hecho de que de manera externa te manipulen los formularios

ok, pero si aparece el valor del token en "hidden", de igual forma pueden ver cual es ese valor, y manteniendo esa sesión abierta simplemente corren el otro archivo e igual lo procesará...
  #14 (permalink)  
Antiguo 08/01/2018, 21:59
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 4 meses
Puntos: 2237
Respuesta: evitar hackeo por envio de variables ($_post)

Cómo haces las validaciones de usuario y campos?
Cómo ejecutas las consultas?

Basta con un ejemplo sencillo, no es necesario que pongas todo tu código.
__________________
- León, Guanajuato
- GV-Foto
  #15 (permalink)  
Antiguo 09/01/2018, 07:02
Avatar de xfxstudios  
Fecha de Ingreso: junio-2015
Ubicación: Valencia - Venezuela
Mensajes: 2.448
Antigüedad: 9 años, 6 meses
Puntos: 263
Respuesta: evitar hackeo por envio de variables ($_post)

podrias permitir que los accesos a tu sitio o peticiones POST, GET, PUT, DELET o lo uqe sea proventan golo de tu dominio:

Código PHP:
Ver original
  1. header("Access-Control-Allow-Origin:" . $_SERVER['HTTP_ORIGIN'] . "");
  2. //ó
  3. header("Access-Control-Allow-Origin: http://tudominio.com/");
__________________
[email protected]
HITCEL
  #16 (permalink)  
Antiguo 15/01/2018, 21:04
 
Fecha de Ingreso: febrero-2008
Mensajes: 409
Antigüedad: 16 años, 10 meses
Puntos: 2
Respuesta: evitar hackeo por envio de variables ($_post)

Cita:
Iniciado por Triby Ver Mensaje
Cómo haces las validaciones de usuario y campos?
Cómo ejecutas las consultas?

Basta con un ejemplo sencillo, no es necesario que pongas todo tu código.
las validaciones de usuario las hago mediante una variable session que contiene su código cuando ellos inician sesión.

la validación de campos filtra viendo tipo de info que es pasada, pero eso no sirve de mucho puesto que igual el precio fue cambiado por otro valor del mismo tipo (float, por ejemplo) ... pero no hay forma de verificar si esun cambio genuino que desea hacer el cliente o si está intentando hackear poniendo un valor bajo
  #17 (permalink)  
Antiguo 15/01/2018, 21:05
 
Fecha de Ingreso: febrero-2008
Mensajes: 409
Antigüedad: 16 años, 10 meses
Puntos: 2
Respuesta: evitar hackeo por envio de variables ($_post)

Cita:
Iniciado por xfxstudios Ver Mensaje
podrias permitir que los accesos a tu sitio o peticiones POST, GET, PUT, DELET o lo uqe sea proventan golo de tu dominio:

Código PHP:
Ver original
  1. header("Access-Control-Allow-Origin:" . $_SERVER['HTTP_ORIGIN'] . "");
  2. //ó
  3. header("Access-Control-Allow-Origin: http://tudominio.com/");
voy a probar esta opción, muchas gracias. sólo para precisar, éste header lo debo poner como encabezado del archivo action ? o en algún otro adicionalmente ?
  #18 (permalink)  
Antiguo 16/01/2018, 17:27
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 16 años, 4 meses
Puntos: 2237
Respuesta: evitar hackeo por envio de variables ($_post)

Cita:
Iniciado por jiten
la validación de campos filtra viendo tipo de info que es pasada, pero eso no sirve de mucho puesto que igual el precio fue cambiado por otro valor del mismo tipo (float, por ejemplo) ... pero no hay forma de verificar si esun cambio genuino que desea hacer el cliente o si está intentando hackear poniendo un valor bajo
Por supuesto que hay forma, el proceso sería más o menos así:

1. Validar sesión: Debes obtener y guardar en sesión información del usuario y su ID.

2. Validar datos ingresados: PHP recibe como cadena todo lo proveniente de GET, POST, etc., por lo que deberás convertirlos al tipo de dato deseado. Además, también debes eliminar la posibilidad de ataques XSS (Cross Site Scripting), aunque la intención es atacar a los usuarios, no al sitio propiamente.

3. Preparar datos antes de incluirlos en una consulta SQL: Si no trabajas con consultas preparadas, entonces debes escapar los datos, por ejemplo, con las librerías mysql y mysqli debes usar la función *_real_escape_string().

4. Verifica que cada producto pertenece al usuario que inició sesión.

Lo del token y Access Control te ayudarán a prevenir ataques de usuarios inexpertos, pero, a menos que el acceso sea HTTPS, no de quienes tengan un poco de conocimientos de HTML + Javascript + Herramientas de navegador. La parte más importante de seguridad debe ser manejada del lado del servidor.

Edito para agregar:

Se me olvidaba, también puedes hacer una "doble autentificación", lógicamente, la primera es la que usas siempre para iniciar/verificar sesión:

1. Crea una variable de sesión donde guardes fecha y hora del último formulario procesado, inicializándola en cero.
2. Establece el máximo de minutos para evitar pedir contraseña, digamos 15.
3. Al procesar el formulario, si pasaron más de 15 minutos desde la última vez que pediste contraseña, entonces guardas todos los datos del formulario en una variable de sesión, pides al usuario que ingrese su contraseña, actualizas la variable de tiempo y después recuperas los datos que guardaste en sesión y procesas el formulario.
__________________
- León, Guanajuato
- GV-Foto

Última edición por Triby; 16/01/2018 a las 17:37

Etiquetas: hack, post
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 06:00.