Riesgo de seguridad derivado de los datos pasados en $ _GET superglobal

1

Esta es una pregunta corta pero general. Soy relativamente nuevo en la programación en general. Mi sitio, que está escrito principalmente en PHP, se lanzará pronto y se está sometiendo a algunas restricciones de seguridad. Esto comenzó con la conversión de todo a PDO con declaraciones preparadas (de lo que era una configuración de MySQL) para hacer las sesiones más seguras.

Mi problema es el siguiente: uso bastante el $_GET superglobal para pasar los ID de usuario y los ID de hilo en la sección Q / A. Si un miembro hace clic en la foto de otro miembro, se envía a la página de perfil de ese usuario utilizando invariablemente un $_GET['id'] para enviar la información: el tipo de usuario habitual de los novatos.

Me preocupa que esto pueda suponer un riesgo para la seguridad, ya que los números de identificación de los miembros son esencialmente visibles en todo el sitio.

No estoy seguro de que la respuesta sea la creación de formularios con variables $_POST ocultas. He buscado respuestas sobre esto, sin éxito con respecto a esta pregunta exacta.

Sé que esto no es un código, pero agradecería alguna orientación sobre si esto realmente representa un problema, y si es así, cómo.

    
pregunta GhostRider 28.07.2014 - 21:16
fuente

3 respuestas

1

Parece que mi comentario no se publicó aquí, así que lo publicaré como respuesta:

No, no es un problema de seguridad grave. Si su sitio tiene, por ejemplo, una vulnerabilidad de inyección de SQL ciego, esto facilitaría atacar a un usuario específico. Probablemente también sea mucho más fácil raspar su sitio web para los perfiles de usuario, si eso es una preocupación suya. Pero aparte de eso, no puedo pensar en una forma de atacar esto.

Pero si todavía estás preocupado: No, las variables de publicación ocultas no son la respuesta. En su lugar, no pase los identificadores, sino que pase slugs de nombres de usuario / postnames / etc en su lugar (los slugs deben ser desinfectados, de modo que solo contengan caracteres de URL válidos). Esto también es más fácil de usar y seo.

Pero asegúrese de no enviar ningún dato proporcionado por el usuario directamente al usuario final. Primero tienes que desinfectarlo para evitar los ataques xss (y cuenta como lo suministró el usuario, incluso cuando proviene de la base de datos (si los datos de la base de datos son proporcionados por el usuario).

    
respondido por el tim 28.07.2014 - 21:48
fuente
1

El uso de POST en lugar de los parámetros de URL no tiene ningún beneficio para la seguridad. Los datos POST se pueden cambiar al igual que los parámetros de URL. De hecho, no debe confiar en ningún datos provenientes del usuario, ya sea un parámetro de URL, un parámetro POST, una cookie, un encabezado HTTP o lo que sea. Casi todas las entradas están bajo el control del usuario y pueden ser lo que quieran.

La clave es tratar cada valor que no esté codificado como una amenaza potencial y asegurarse de que no cause ningún daño. Las declaraciones preparadas son una buena opción para las consultas dinámicas, ya que aseguran que los valores se traten como datos en lugar de declaraciones SQL. Para insertar valores en su documento HTML, necesita escapar de HTML; los comandos de shell requieren que los valores se escapen de la shell y así sucesivamente.

    
respondido por el Fleche 28.07.2014 - 22:00
fuente
0

Hay dos aspectos de la pregunta aquí:

  1. ¿Es seguro usar el ID de la URL (GET)? Respuesta corta, no. Como cualquier otro dato, debe ser validado y filtrado antes de su uso. Esto evita que surjan problemas como la inyección SQL y que la aplicación quede vulnerable. Valide que sea una ID, valide que sea una ID válida y use declaraciones preparadas para reducir aún más el riesgo.

  2. Ya que son ID (enteros), ¿es seguro usar algo que el usuario pueda cambiar? Aquí es donde las cosas se ponen un poco más complejas. Esta parte del problema es menos acerca de los datos que le proporcionan (que es el número 1) y más sobre el acceso y la autenticación. Por ejemplo, en la mayoría de las aplicaciones una "vista" en un usuario está bien para que cualquiera la vea. Sin embargo, una "edición" solo se puede permitir al usuario y al administrador. Aquí es donde necesita la capa de protección que verifica quién es el usuario y qué permisos tiene para esa página / recurso. Esto está relacionado con el ítem "Referencias Inseguras de Objetos Directos" de OWASP en su Top 10. Es un problema bastante común, pero la respuesta correcta es la protección de autenticación *, no la ofuscación a través de campos de formulario POST o ocultos.

respondido por el enygma 01.08.2014 - 13:35
fuente

Lea otras preguntas en las etiquetas