2

Hasta ahora tengo esto de codigo, lo unico que he logrado es que me cree la carpeta user, pero no crear dentro la carpeta con el id del usuario. Tambien me gustaria si es posible, por ejemplo tener unos 5 archivos en una carpeta, y cuando un usuario se registre se cree la carpeta con su id y esos 5 archivos se transfieran a esa carpeta. ¿Alguien tiene una idea de como hacer eso? ¿Seria mejor hacerlo por una cookie?

require_once("conection.php");
$sql="select * from members where id_usuario='".$_GET["id"]."' ";
$res=mysql_db_query($bd,$sql,$con);

$usuario = $_GET["id"];
$nombre_carpeta = "users/".$usuario.""; 

if(!is_dir($nombre_carpeta)){ 
@mkdir($nombre_carpeta, 0700); 
}
Luis Cesar
  • 63
  • 8

2 Answers2

2

La solución que te ofrece @alo_Malbarez es sustancialmente correcta. Pero, tu código, pasando el valor sin control al que él te ofrece abre un terrible agujero de seguridad en tu sitio porque se usa directamente y sin beneficio de inventario el valor $_GET['id'], de modo que expones tanto la bd, como el sistema de archivos. Te sugiero leer ¿Cómo evitar la inyección SQL en PHP?

El problema: La variable 'id' recogida en get puede contener una cola que rompa la integridad de la consulta sql y eventualmente ejecutar código malicioso. Si lees el artículo citado lo ilustra bastante bien. Ademas, si se usa para crear directorios la cola podría afectar al sistema de archivos (no tengo certeza plena pero, esas colas, pueden resultar en desastres)

La solución:

  1. Utilizar una consulta preparada traigo el ejemplo de la repuesta del autor del artículo @Alvaro_Montoro:


  $pdo = new PDO('mysql:host=mihost;dbname=basedatos', "usuario", "contraseña");

  $id_usuario = $_POST["id"]; // en tu caso sería = $_GET['id'];

  $sentencia = $pdo->prepare("SELECT * FROM usuarios WHERE id = :idusuario");

  // Muy importante desactivar la posibilidad de emulación en consultas

  $sentencia=$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

  // pasar parámetros a la consulta

  $sentencia->bindParam(":idusuario", $id_usuario, PDO::PARAM_INT);

  // ejecutar

  $sentencia->execute();
  1. Una vez validado el usuario, con la consulta, usar el resultado para comparar el id almacenado con el recibido, si no coinciden puedes sospechar de un ataque y se puede guardar el dato para revisarlo, (convertirlo a cadena hex antes de guardarlo), más adelante y no acusar sin motivo.
  2. Si los ids coinciden proceder a crear el directorio, si no hay coincidencia el directorio no se puede crear, aunque la consulta de id devuelva que el usuario existe. En ese caso hacer un reporte dummie de fallo para no alertar al intruso en caso de que lo sea.

(tuve problemas para editar el código, por alguna razón que no percibo el lenguaje de marcación no lo reconoció y le di formato a fuerza bruta)

alo Malbarez
  • 8,871
  • 2
  • 10
  • 29
quevedo
  • 1,226
  • 4
  • 18
  • sería genial que lo complementes dirigiendole como rehacer su códdigo para que esta respuesta quede completa aquí en la comunidad –  Jun 15 '18 at 23:58
  • ¿Si elimino eso, y obtengo el id de una cookie? – Luis Cesar Jun 15 '18 at 23:59
  • Eso sería correcto. Pero, en algún momento vas a lanzar la consulta a la bd con problemas de paso de variables. En un momento edito la respuesta y te indico la solución para la consulta – quevedo Jun 16 '18 at 00:01
0

Tenes que usar el tercer parámetro para que cree las "subcarpetas"

if(!is_dir($nombre_carpeta)) {
  if(!mkdir($nombre_carpeta, 0700, true)) {
    die('Fallo al crear las carpetas...');
  }
}

enlace al manual: http://php.net/manual/es/function.mkdir.php

alo Malbarez
  • 8,871
  • 2
  • 10
  • 29