Páginas

sexta-feira, 23 de agosto de 2013

20 truques de segurança para Apache

Deve-se ter em conta que algumas destas recomendações podem diminuir o rendimento de seu servidor dependendo de sua configuração e das especificações do sistema. 

Primeiro, certifique-se de ter instalado os últimos parches de segurança 

Não faz sentido colocar uma fechadura mais resistente na sua porta se você deixa uma janela aberta. Da mesma forma se você não tem os últimos parches de segurança instalado não teria sentido continuar com a otimização de segurança. 

Apagar Imagens em Lote no Flickr

Clique no menu principal em ORGANIZAR . Depois clique em TODO SEU CONTEÚDO . Vai abrir uma janela e vão aparecer embaixo todas suas fotos . Aí você arrasta para cima no quadro cinza todas as fotos que quer excluir . Depois olha na 2a barra bem em cima do lado esquerdo tem a opção EDITAR FOTOS . Clica nela e você verá a opção EXCLUIR . É só clicar aí .

segunda-feira, 19 de agosto de 2013

Classe para upload de imagens em PHP com redimensionamento


Quem é que nunca precisou fazer algum site ou sistema que faça upload de arquivos? Porém, há muitos casos em que apenas o upload não resolve o problema, como no caso de algumas imagens, já que elas atualmente são grandes devido a alta qualidade dos dispositivos de captura, ficando inviável usar essas imagens em uma aplicação web. Também não é nada prático o usuário do sistema ter que usar uma ferramenta externa para redimensionar a imagem para poder fazer o upload. Então a ideia desse artigo é desenvolvermos uma classe genérica usada para o upload de qualquer arquivo e quando for uma imagem, que faça o redimensionamento automático sempre que necessário. Para fazer esse redimensionamento usaremos a biblioteca GD que é responsável pelo tratamento das imagens.
O envio do arquivo ocorrerá quando acontecer o clique no botão de submissão do formulário, neste momento será criada uma instância da classe e serão passados os seguintes parâmetros: arquivo a ser enviado, altura e largura máxima e pasta de destino respectivamente.
Então, mãos na massa para ver se funciona.
Vamos começar criando a estrutura de diretórios e arquivos. Será criada uma pasta chamada “fotos” que é onde os arquivos ficarão salvos, o arquivo index.php contém o formulário e por fim o Upload.class.php contém toda a lógica de funcionamento.
Observação: se você estiver usando Linux será preciso alterar a permissão da pasta de uploads para 777, permitindo a leitura, gravação e execução.


Figura 1: Estrutura de diretórios
Listagem 1: Arquivo Upload.class.php
<?php
    /*
        Desenvolvido por Marco Antoni <marquinho9.10@gmail.com>
    */
    class Upload{
        private $arquivo;
        private $altura;
        private $largura;
        private $pasta;
        function __construct($arquivo, $altura, $largura, $pasta){
            $this->arquivo = $arquivo;
            $this->altura  = $altura;
            $this->largura = $largura;
            $this->pasta   = $pasta;
        }
         
        private function getExtensao(){
            //retorna a extensao da imagem 
            return $extensao = strtolower(end(explode('.', $this->arquivo['name'])));
        }
         
        private function ehImagem($extensao){
            $extensoes = array('gif', 'jpeg', 'jpg', 'png');     // extensoes permitidas
            if (in_array($extensao, $extensoes))
                return true;   
        }
         
        //largura, altura, tipo, localizacao da imagem original
        private function redimensionar($imgLarg, $imgAlt, $tipo, $img_localizacao){
            //descobrir novo tamanho sem perder a proporcao
            if ( $imgLarg > $imgAlt ){
                $novaLarg = $this->largura;
                $novaAlt = round( ($novaLarg / $imgLarg) * $imgAlt );
            }
            elseif ( $imgAlt > $imgLarg ){
                $novaAlt = $this->altura;
                $novaLarg = round( ($novaAlt / $imgAlt) * $imgLarg );
            }
            else // altura == largura
                $novaAltura = $novaLargura = max($this->largura, $this->altura);
             
            //redimencionar a imagem
             
            //cria uma nova imagem com o novo tamanho  
            $novaimagem = imagecreatetruecolor($novaLarg, $novaAlt);
             
            switch ($tipo){
                case 1: // gif
                    $origem = imagecreatefromgif($img_localizacao);
                    imagecopyresampled($novaimagem, $origem, 0, 0, 0, 0,
                    $novaLarg, $novaAlt, $imgLarg, $imgAlt);
                    imagegif($novaimagem, $img_localizacao);
                    break;
                case 2: // jpg
                    $origem = imagecreatefromjpeg($img_localizacao);
                    imagecopyresampled($novaimagem, $origem, 0, 0, 0, 0,
                    $novaLarg, $novaAlt, $imgLarg, $imgAlt);
                    imagejpeg($novaimagem, $img_localizacao);
                    break;
                case 3: // png
                    $origem = imagecreatefrompng($img_localizacao);
                    imagecopyresampled($novaimagem, $origem, 0, 0, 0, 0,
                    $novaLarg, $novaAlt, $imgLarg, $imgAlt);
                    imagepng($novaimagem, $img_localizacao);
                    break;
            }
             
            //destroi as imagens criadas
            imagedestroy($novaimagem);
            imagedestroy($origem);
        }
         
        public function salvar(){                                  
            $extensao = $this->getExtensao();
             
            //gera um nome unico para a imagem em funcao do tempo
            $novo_nome = time() . '.' . $extensao;
            //localizacao do arquivo
            $destino = $this->pasta . $novo_nome;
             
            //move o arquivo
            if (! move_uploaded_file($this->arquivo['tmp_name'], $destino)){
                if ($this->arquivo['error'] == 1)
                    return "Tamanho excede o permitido";
                else
                    return "Erro " . $this->arquivo['error'];
            }
                 
            if ($this->ehImagem($extensao)){                                            
                //pega a largura, altura, tipo e atributo da imagem
                list($largura, $altura, $tipo, $atributo) = getimagesize($destino);
                // testa se é preciso redimensionar a imagem
                if(($largura > $this->largura) || ($altura > $this->altura))
                    $this->redimensionar($largura, $altura, $tipo, $destino);
            }
            return "Sucesso";
        }                      
    }
?>
    

Entendendo o código

Repare que foram criados quatro atributos privados que são:
  • $arquivo: armazena a estrutura de uma variável do tipo $_FILE do PHP;
  • $altura e $largura: armazenam um número inteiro indicando a altura e largura máxima que a imagem terá após o upload.
  • $pasta: armazena uma string contendo a pasta de destino dos uploads.
Toda a lógica de funcionamento da classe está no método salvar. Ele funciona da seguinte maneira: obtém a extensão do arquivo, gera um novo nome baseado no tempo, se o arquivo é uma imagem do tipo permitidos é efeito um teste para saber se é preciso redimensionar e então o arquivo estará salvo.
Agora que temos o caminho absoluto do arquivo ($destino), será feito o envio para o servidor. Se houver algum erro durante esse processo, a execução do script será interrompida devido ao return. Neste ponto o arquivo já está salvo no servidor, se tudo acorrer certo o próximo passo é descobrir se o arquivo é uma imagem, para isso foi implementada a função ehImagem, que recebe como parâmetro uma string contendo a extensão do arquivo. Nela existe um vetor contendo as extensões que são “permitidas”, ou seja, as imagens que poderão serem redimensionadas (através do método redimensionar) posteriormente caso excedam os limites permitidos, esse método retorna verdadeiro.
Então, se o arquivo é uma imagem, iremos pegar a largura, altura, tipo e atributo da imagem usando a funcão getimagesize. Depois testamos se a largura ou altura da imagem excedem os limites (atributos da classe), caso um deles exceda, a imagem tem que ser redimensionada e esse procedimento é feito através do método redimensionar, que recebe como parâmetros a largura, altura, tipo e o endereço absoluto da imagem.
Finalmente o método redimensionar testa as dimensões da foto gerando o novo tamanho sem perder a proporção da imagem. A variável $novaimagem recebe uma imagem vazia recém criada com as novas dimensões. O processamento da imagem agora é feito com base no tipo da imagem (Ex: 1 é um GIF) .
  • $origem: recebe uma cópia da imagem que está sendo redimensionada (imagefromgif, imagemfromjpg, etc..).
A função imagecopyresampled copia uma imagem para dentro de outra com os respectivos tamanhos, após esse procedimento a variável $novaimagem contém a imagem redimensionada. Agora usamos uma das funcões (imagegif, imagejpg, etc) para substituir a imagem antiga pela nova.
Nesse ponto o método vai encerrar, retornando ao método salvar que retornará “Sucesso”.
O próximo passo é criar o nosso formulário dentro do arquivo index.php, vamos ao código.
Listagem 2: Arquivo index.php
<html>
    <form method='post' enctype='multipart/form-data'><br>
        <input type='file' name='foto' value='Cadastrar foto'>
        <input type='submit' name='submit'>
    </form>
    <?php           
        include "Upload.class.php";
                     
            if ((isset($_POST["submit"])) && (! empty($_FILES['foto']))){
                $upload = new Upload($_FILES['foto'], 1000, 800, "fotos/");
                    echo $upload->salvar();
            }
        ?>
    </body>
</html>
O formulário com envio de arquivos deve obrigatoriamente conter o atributo enctype='multipart/form-data'. No input temos que definir o tipo file. No trecho de código do PHP testamos se foi clicado no botão submit e se foi preenchido o campo file, caso as duas condições sejam verdadeiras, será criada uma instância da classe upload e então será chamado o método para enviar o arquivo.
Agora vamos ver se funciona.
Formulário pronto
Figura 2: Formulário pronto
Arquivo enviado com sucesso
Figura 3: Arquivo enviado com sucesso



fonte : http://www.devmedia.com.br/classe-para-upload-de-imagens-em-php-com-redimensionamento/28573


quinta-feira, 1 de agosto de 2013

Validação de Formulários com JQuery

Segue o exemplo:

Exemplo de uso: http://blog.clares.com.br/validacao-de-formularios-com-jquery-plugin-atualizado/

demo download
As instruções estão no arquivo leia-me.txt
O plugin pode ser customizado de acordo com suas necessidades, as mensagens de validação podem ser alteradas no arquivo. 
fonte : http://blog.clares.com.br/validacao-de-formularios-com-jquery-plugin-atualizado/

Validação de Formulários com JQuery

Segue o exemplo:

Exemplo de uso:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
</pre>
<!DOCTYPE html>
<html>
 <head>
 <title>Validate Plugin</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
 <script src="js/jquery.min.js" type="text/javascript"></script>
 <script src="js/jquery.validate.js" type="text/javascript"></script>
 <link href="css/validate.css" type="text/css" media="screen" rel="stylesheet" />
 <!--[if lte IE 7]>
 <link href="css/validate_ie7.css" type="text/css" media="screen" rel="stylesheet" />
 <![endif]-->
 </head>
 <body>
 
 <div id="wrap">
 
<form id="f1" class="validate" action="" method="post" >
 
 <p>
 <label>Combo:</label>
 <select name="combo" id="combo" class="required">
 <option value="">Selecione um item na lista</option>
 <option value="0">AA</option>
 <option value="1">BB</option>
 </select>
 <span>Selecione um item</span>
 </p>
 
<p>
 <label>Nome:</label>
 <input type="text" name="nome" id="nome" class="required" minlength="5" />
 <span>Informe seu nome completo</span>
 </p>
 
<p>
 <label>Telefone:</label>
 <input type="text" name="fone" id="fone" class="required fone" />
 <span>Informe seu telefone com DDD</span>
 </p>
 
 <p>
 <label>Obrigatório - Mínimo 5 letras:</label>
 <input type="text" name="str" id="str" class="required" minlength="5" />
 <span>Campo requerido, informe ao menos 5 letras</span>
 </p>
 
<p>
 <label>Data:</label>
 <input type="text" name="data" id="data" class="required data" maxlength="10" />
 <span>Campo requerido, informe uma data válida</span>
 </p>
 
<p>
 <label>CPF:</label>
 <input type="text" name="cpf" id="cpf" class="required cpf" />
 <span>Campo requerido, informe um CPF válido</span>
 </p>
 
 <p>
 <label>CNPJ:</label>
 <input type="text" name="cnpj" id="cnpj" class="required cnpj" />
 <span>Campo requerido, informe um CNPJ válido</span>
 </p>
 
 <p>
 <label>Numérico Mínimo 5 caracteres:</label>
 <input type="text" name="num" id="num" class="required numeric" minlength="5" maxlength="10" />
 <span>Campo requerido, apenas números</span>
 </p>
 
<p>
 <label>Email:</label>
 <input type="text" name="email" id="email" class="required email" />
 <span>Campo requerido, informe um e-mail válido</span>
 </p>
 
<p>
 <label>Senha - Mínimmo 4 caracteres</label>
 <input type="password" name="password" id="password" class="required password" minlength="4" />
 <span>Campo requerido, informe ao menos 4 caracteres</span>
 </p>
 
<p>
 <label>Repetir Senha </label>
 <input type="password" name="rpassword" id="rpassword" class="required password" minlength="4" />
 <span>Repita a senha</span>
 </p>
 <p>
 <button class="button blue submit">Enviar</button>
 <button class="button gray reset">Limpar</button>
 </p>
 
</form>
 </div>
 </body>
</html>
<pre>
As instruções estão no arquivo leia-me.txt
O plugin pode ser customizado de acordo com suas necessidades, as mensagens de validação podem ser alteradas no arquivo. 
fonte : http://blog.clares.com.br/validacao-de-formularios-com-jquery-plugin-atualizado/