Arme un sistema de upload de imagenes, tanto de screenshot como imagenes de perfil, pero nose si es del todo seguro, ya que nose si se podra o no subir archivos de otra extension como un shell, etc. En teoria no deberia pero al no saber mucho tal vez cometi algun error que si lo permite.
Esta es la classe upload a la cual llamo cuando debo subir un archivo.
Código:
por ejemplo, en el modulo "add_img" hice algo como esto:<? if (basename($_SERVER["REQUEST_URI"]) === basename(__FILE__)) { exit(); } class nwUpload extends conexao { var $Size; var $Directory; var $Archive = ""; var $Name = ""; private $allowed=array("image/jpeg","image/gif","image/png"); var $Pixels; var $Reduce = true; var $execQuery = false; var $Dados = array(); var $Error = array(); function Check() { $this->Archive = isset($_FILES["arquivo"]) == true ? $_FILES["arquivo"] : false; $get = getimagesize($this->Archive["tmp_name"]); if (is_uploaded_file($this->Archive["tmp_name"]) == false) { $this->Error[] = "No fue posible enviar la imagen."; } if(!in_array($get["mime"], $this->allowed)) { $this->Error[] = "Formato inválido.<br />La imagen debe estar en formato <strong>JPEG,GIF,PNG</strong>."; } if ($this->Archive["size"] > $this->Size) { $this->Error[] = "La imagen paso el limite de <strong>{$this->Size}(Bytes)</strong>"; } return true; } function Send() { if ($this->Check() == true) { $this->Generate(); } } function Generate() { if (file_exists($this->Directory) == false) { $this->Error[] = "El directório no existe."; } if (count($this->Error) > 0) { foreach ($this->Error as $Err) { echo("<blockquote class=\"error\">{$Err}<br /></blockquote>"); return false; } } else { $get = getimagesize($this->Archive["tmp_name"]); switch($get["mime"]){ case "image/jpeg": $Image = $this->Directory.$this->Name.".jpg"; break; case "image/gif": $Image = $this->Directory.$this->Name.".gif"; break; case "image/png": $Image = $this->Directory.$this->Name.".png"; break; default: $Image = $this->Directory.$this->Name.".jpg"; break; } if ($this->Reduce == true) { $this->Collapse($this->Archive["tmp_name"], $Image, $this->Pixels); } else { move_uploaded_file($this->Archive["tmp_name"], $Image); } if ($this->execQuery == true) { $this->query("insert into wt_screens (author,votes,description,data) values ('{$this->Dados[1]}',0,'{$this->Dados[2]}',{$this->Dados[0]})"); } echo("<blockquote class=\"success\">La imagen '<strong>{$this->Name}</strong>' fue enviada con exito.</blockquote>"); return true; } } function Collapse($Name, $Image, $Pixels) { $get = getimagesize($Name); $obj = explode(",", $Pixels); $obj[0] = $obj[0]; $obj[1] = $obj[1]; $imgCreate = imagecreatetruecolor($obj[0], $obj[1]); switch($get["mime"]){ case "image/jpeg": $ImageC = imagecreatefromjpeg($Name); imagecopyresampled($imgCreate, $ImageC, 0, 0, 0, 0, $obj[0], $obj[1], $get[0], $get[1]); return imagejpeg($imgCreate, $Image, 250); case "image/gif": $ImageC = imagecreatefromgif($Name); imagecopyresampled($imgCreate, $ImageC, 0, 0, 0, 0, $obj[0], $obj[1], $get[0], $get[1]); return imagegif($imgCreate, $Image, 250); case "image/png": $ImageC = imagecreatefrompng($Name); imagecopyresampled($imgCreate, $ImageC, 0, 0, 0, 0, $obj[0], $obj[1], $get[0], $get[1]); return imagepng($imgCreate, $Image, 9); default: $ImageC = imagecreatefromjpeg($Name); imagecopyresampled($imgCreate, $ImageC, 0, 0, 0, 0, $obj[0], $obj[1], $get[0], $get[1]); return imagejpeg($imgCreate, $Image, 250); } imagedestroy($ImageC); } } ?>
Código:
Como ven estableci un tamaño, el tipo de extensiones, etc pero por lo que lei con tamper data y web developer que son dos extensiones de firefox se puede "alterar" esos filtros y subir archivos de otras extensiones <? if (anti_sql($_GET["exec"]) == true) { $funcoes->logado(); $funcoes->errospanel(); $funcoes->acc_char($_POST["charname"]); $funcoes->so_vip(screenshot); $time = time(); $char = $_POST["charname"]; $login = $_COOKIE[cookie_login]; $msg = anti_sql (base64_encode ($_POST["mensagem"])); require_once("modules/classes/upload.class.php"); $upload = new nwUpload(); $upload->Size = 2000000; $upload->Directory = "images/uploads/screens/"; $upload->Name = strtoupper(md5($_POST["charname"].$time)); $upload->Reduce = false; $conexao->query("insert into wt_screens (username,author,votes,description,data) values ('{$login}', '{$char}', 0, '{$msg}', {$time})"); $upload->Send(); } ?>