
29/01/2014, 13:03
|
| | Fecha de Ingreso: junio-2013 Ubicación: Mar del Plata
Mensajes: 122
Antigüedad: 11 años, 8 meses Puntos: 0 | |
Que consideraciones tomar para mi sistema de upload de imagenes ? Hola gente tengo una pregunta.
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:
<?
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);
}
}
?>
por ejemplo, en el modulo "add_img" hice algo como esto:
Código:
<?
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();
}
?>
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 |