Foros del Web » Programando para Internet » PHP »

PHP OO Seguridad en imagenes

Estas en el tema de Seguridad en imagenes en el foro de PHP en Foros del Web. Hola, la verdad que no estoy muy ducho con el tema, y vengo trabajando con un codigo hace ya muchos anos, pero la verdad que ...
  #1 (permalink)  
Antiguo 01/04/2020, 17:13
Usuario no validado
 
Fecha de Ingreso: octubre-2003
Mensajes: 7
Antigüedad: 20 años, 6 meses
Puntos: 0
Seguridad en imagenes

Hola, la verdad que no estoy muy ducho con el tema, y vengo trabajando con un codigo hace ya muchos anos, pero la verdad que estoy teniendo muchos problemas de vulnerabilidad, me estan cada 2 dias ingreando y hackeando el sitio. por lo general encuentro los archivos hack dentro de la carpeta /imgprod que es justamente donde yo subo los archivos de imagenes y pdf de un listado de producto que administro.

voy a tratar de dejar el codigo lo mas sencillo posible, dado que luego repite mucho, pero lo ideal seria que alguien me ayude agregar seguridad sobre lo actual que tengo.

como veran mi gran problema es que hago una subida de archivo... pero este no tiene ningun tipo de seguridad, me podrian ayudar un poco en este principio de codigo para hacerlo mas seguro?
dejo abajo tambien la linea de html del form que contiene el

Código:
if ($HttpVars->TraerPost('envio') != '') { 
	$pathabs1 = "";
	$pathabs2 = "";
	$nombre = $HttpVars->TraerPost('nombre');	

	$sql="SELECT nombre from tbl_productos where nombre = '" . $nombre . "'";
	$result = mysqli_query( $conexion, $sql );
	if($result->num_rows > 0) { 
		$existe = 1;
	}else{	
		$archivo1=$_FILES['imgch']['tmp_name'];
		$nomarchivo1=$_FILES['imgch']['name'];

		if (is_dir( PATHIMAGEN ) == false) {
			mkdir( PATHIMAGEN );
		}

		$directorio = PATHIMAGEN ;
		$archfinal1 = $directorio . $nomarchivo1 ;		
		if (file_exists ($archivo1)){
			$pathabs1 = "" ;
			move_uploaded_file ($archivo1, $archfinal1 ); 
			if (file_exists ($directorio . $nomarchivo1))
			{
				$patharch1 = $directorio . $nomarchivo1 ;
				$pathabs1=str_replace("\\","\\\\",$patharch1);
			}
		}

		
		
		$nombre = $HttpVars->TraerPost('nombre') ;
		$keywords = $HttpVars->TraerPost('keywords') ;
		$chkpubli = $HttpVars->TraerPost('chkpubli') ;
		$destacado = $HttpVars->TraerPost('chkdestacado') ;
		$oferta = $HttpVars->TraerPost('chkoferta') ;
		if ($chkpubli == "") $chkpubli = 0;
		if ($destacado == "") $destacado = 0;
		if ($oferta == "") $oferta = 0;


		$dcorta = $HttpVars->TraerPost('dcorta') ;
		$dlarga = $HttpVars->TraerPost('dlarga') ;
		$tips = $HttpVars->TraerPost('tips') ;
		$dosis = $HttpVars->TraerPost('dosis') ;
		$codigo = $HttpVars->TraerPost('codigo') ;
		$precio = $HttpVars->TraerPost('precio') ;
		$id_cate = $HttpVars->TraerPost('cmbcategoria') ;
		$id_plaga = $HttpVars->TraerPost('cmbplaga') ;
		$id_subcate = $HttpVars->TraerPost('cmbsubcate') ;

		$sql="INSERT into tbl_productos( nombre, keywords, codigo, precio, dcorta, dlarga, tips, dosis, pathch, filech, destacado, oferta, publicado)  VALUES " . 
		                         "('".$nombre."','".$keywords."','".$codigo."',".$precio.",'".$dcorta."','".$dlarga."','".$tips."','".$dosis."','".$pathabs1."','".$nomarchivo1."','".$pathadj1."',".$destacado.",".$oferta.",".$chkpubli.")";
		
		$result = mysqli_query( $conexion, $sql );
		$agregada = 1;		
		
		//grabo las categorias en la tabla relcateprod
		$sql = "SELECT MAX(id_prod) as id_prod FROM tbl_productos";
		$result = mysqli_query( $conexion, $sql );
		$myrow = mysqli_fetch_assoc($result);
		$id_prod = $myrow["id_prod"];

		$idcate=$HttpVars->TraerPost('id_cate');
		while (list ($key,$val) = @each ($idcate)) {
			$sql = "INSERT INTO tbl_relcateprod(id_prod, id_cate) VALUES (".$id_prod.",".intval($val).")";
			$result = mysqli_query( $conexion, $sql );
		} 
		$idplaga=$HttpVars->TraerPost('id_plaga');
		while (list ($key,$val) = @each ($idplaga)) {
			$sql = "INSERT INTO tbl_relplagaprod(id_prod, id_plaga) VALUES (".$id_prod.",".intval($val).")";
			$result = mysqli_query( $conexion, $sql );
		} 
	}
}
y el simple campo input file esta de la siguiente forma

Código HTML:
<div class="form-group">
          <label for="imgch">Imagen del producto</label>
          <input type="file" id="imgch" name="imgch">
        </div> 
  #2 (permalink)  
Antiguo 01/04/2020, 17:29
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Seguridad en imagenes

Un aporte antiguo, pero te va a servir para solucionar el problema: http://www.forosdelweb.com/f18/aport...8/#post4265376
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 01/04/2020, 17:37
Usuario no validado
 
Fecha de Ingreso: octubre-2003
Mensajes: 7
Antigüedad: 20 años, 6 meses
Puntos: 0
Respuesta: Seguridad en imagenes

Cita:
Iniciado por Triby Ver Mensaje
Un aporte antiguo, pero te va a servir para solucionar el problema: [url]http://www.forosdelweb.com/f18/aporte-seguridad-basica-php-1011808/#post4265376[/url]
te agradezco pero la verdad que no entiendo como aplicar eso a la parte de mi codigo de la imagen, que basicamente seria esto

Código PHP:
$archivo1=$_FILES['imgch']['tmp_name'];
        
$nomarchivo1=$_FILES['imgch']['name'];

        if (
is_dirPATHIMAGEN ) == false) {
            
mkdirPATHIMAGEN );
        }

        
$directorio PATHIMAGEN ;
        
$archfinal1 $directorio $nomarchivo1 ;        
        if (
file_exists ($archivo1)){
            
$pathabs1 "" ;
            
move_uploaded_file ($archivo1$archfinal1 ); 
            if (
file_exists ($directorio $nomarchivo1))
            {
                
$patharch1 $directorio $nomarchivo1 ;
                
$pathabs1=str_replace("\\","\\\\",$patharch1);
            }
        } 
  #4 (permalink)  
Antiguo 01/04/2020, 17:59
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años
Puntos: 120
Respuesta: Seguridad en imagenes

te dieron un bueno post de lectura, trata de digerirlo todo, en el Post que te sugirieron, hay varias cosas importantes para la seguridad, bueno, primero trata de que si tieens variables que entran en tu MYSQL

como esta
Código PHP:
$nombre $HttpVars->TraerPost('nombre');    
    
$sql="SELECT nombre from tbl_productos where nombre = '" $nombre "'"
escapala, purificala limpia, evita que te agregen codigo aunque puedo suponer que "TraerPost" esa funcion lo hace,

por lo otro en Tu codigo de subida de imagenes

Cita:
Iniciado por fanatimillo Ver Mensaje
te agradezco pero la verdad que no entiendo como aplicar eso a la parte de mi codigo de la imagen, que basicamente seria esto

Código PHP:
$archivo1=$_FILES['imgch']['tmp_name'];
        
$nomarchivo1=$_FILES['imgch']['name'];

        if (
is_dirPATHIMAGEN ) == false) {
            
mkdirPATHIMAGEN );
        }

        
$directorio PATHIMAGEN ;
        
$archfinal1 $directorio $nomarchivo1 ;        
        if (
file_exists ($archivo1)){
            
$pathabs1 "" ;
            
move_uploaded_file ($archivo1$archfinal1 ); 
            if (
file_exists ($directorio $nomarchivo1))
            {
                
$patharch1 $directorio $nomarchivo1 ;
                
$pathabs1=str_replace("\\","\\\\",$patharch1);
            }
        } 
no veo que verifiques la extension del archivo subido, con ello seria facil subir un ".php" y apuesto que si te hackearon, ya tienen las contraseñas de tu MYSQL, incluso puede que acceso a las contraseñas de usuarios y demas del mysql, te sugeriria revisar todos tus archivos .php, cambiar tu contraseña FTP, si tucontraseña es compartida con tus cuentas de Email administracion, etc, cambialas,

volviendo a tu codigo, primero deberias por lo menos verificar la extension y evitar que suban archivos que no sean imagenes, luego la carpeta donde sea subida, que tenga permisos solo de lectura y escritura y no de ejecucion.
__________________
Mis aportes te ayudaron??, te hicieron ahorrar valiosos tiempo??, si quieres puedes agradecerme con un Gracias o con una donacion
https://paypal.com/pools/c/8lmNLmWnG9

Etiquetas: 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




La zona horaria es GMT -6. Ahora son las 21:40.