Posts Categorizados ‘PHP

24
Ago
09

7 coisas ultra simples de se fazer com php!

É comum ver scripts com dezenas de linhas de código pra fazer algo extremamente simples. Fica aqui meu apelo desesperado com algumas dicas rápidas.

1 – Listar arquivos de um diretório

Se não houver um motivo muito claro pra usar opendir, readdir e closedir (não consigo pensar em nenhum), a forma mais prática de listar o conteúdo de um diretório é com DirectoryIterator:
$iterator = new DirectoryIterator(‘/var/www’);

foreach ( $iterator as $entry ) {
echo $entry->getFilename(), “\n”;
}

Se for necessário listar os arquivos recursivamente, percorrendo todos os subdiretórios, é só usar o RecursiveDirectoryIterator junto com o RecursiveIteratorIterator:
$iterator = new RecursiveDirectoryIterator(‘/var/www’);
$recursiveIterator = new RecursiveIteratorIterator($iterator);

foreach ( $recursiveIterator as $entry ) {
echo $entry->getFilename(), “\n”;
}

Com um pouco de criatividade, é possível estender essas classes com qualquer lógica facilmente, como por exemplo, para montar uma árvore com a estrutura dos diretórios.
2 – montar e desmontar query strings

Mesmo que menos comum (e menos útil), colocar uma query string numa URL é um trabalho trivial demais pra ser feito com implode, concatenando tudo ou qualquer outro método engenhoso. Desde o lançamento do PHP 5 é possível contar com a http_build_query:
$dados = array(
‘hl’ => ‘pt-BR’,
‘q’ => ‘Forgetting Sarah Marshall’,
‘testa-escape’ => ‘acentuação’,
);

echo http_build_query($dados);
// hl=pt-BR&q=Forgetting+Sarah+Marshall&testa-escape=acentua%C3%A7%C3%A3o

E o inverso também é possível com as funções parse_url e parse_str:
$url = parse_url(‘http://www.google.com/search?q=anneke+van+giersbergen&num=50′);

parse_str($url['query'], $query);

echo $query['q'];
// anneke van giersbergen

Só fique atento que, por motivos alheios ao bom senso, parse_str por padrão extrai as variáveis no escopo onde foi chamada. É necessário passar um segundo argumento para ter um array gerado por referência, como no exemplo acima com a variável $query.
3 – ler páginas remotas

Dentre todas as implementações, a mais desnecessária costuma ser fsockopen, fwrite, feof, fgets e fclose para ler arquivos remotos por HTTP.

Uma função já resolve:
$contents = file_get_contents(‘http://php.net/file_get_contents’);

Isso é possível graças aos protocol wrappers que encapsulam a lógica de acesso aos respectivos protocolos, tal como HTTP. Esta forma de acesso, no entanto, depende da configuração allow_url_fopen estar habilitada no php.ini (que é o padrão).

Para ler os response headers da requisição, utilize fopen com stream_get_meta_data.

E se um dia você quiser impressionar a mulherada, veja a função stream_wrapper_register para criar o seu próprio protocol wrapper.
4 – submeter dados por post para uma página remota

A coisa fica mais complicada quando o desenvolvedor pensa em usar cURL pra submeter dados por POST para outro servidor. A extensão até tem seu mérito, mas usá-la apenas pra este propósito é um grande equívoco.

As funções que fazem uso dos protocol wrappers aceitam um objeto de stream context, criado pela função stream_context_create, para configurar alguns aspectos do protocolo. As opções de contexto do protocolo HTTP permitem definir, entre outras coisas, o método de acesso (GET, POST, etc) e o conteúdo a ser postado:
$content = http_build_query(array(
‘cidade’ => ‘Rio de Janeiro’,
‘tipo’ => ‘Apartamento’,
));

$context = stream_context_create(array(
‘http’ => array(
‘method’ => ‘POST’,
‘content’ => $content,
)
));

$contents = file_get_contents(‘http://exemplo/teste.php’, null, $context);

Quando não for necessário ler o retorno da requisição, basta chamar a url com fopen passando o contexto como quarto argumento.
5 – fazer download de um arquivo remoto

Vale lembrar que a maioria das funções de stream e filesystem aceitam URLs completas e fazem uso da abstração do protocolo. O que eu vejo muita gente esquecer é que isso inclui a função copy:
$url = “http://userserve-ak.last.fm/serve/500/4349551/Terri+Clark.jpg”;

copy($url, ‘/tmp/’ . urldecode(basename($url)));

O trecho acima vai baixar a imagem remota e salvar no arquivo local /tmp/Terri Clark.jpg. E caso não seja óbvio, “local” se refere a quem está executando o script PHP, que no caso será o seu servidor caso seja um script web, e não o cliente que está acessando pelo browser.

Se o objetivo for realmente repassar o conteúdo remoto para o cliente que estiver acessando pelo browser, o script é igualmente simples:
$url = ‘http://userserve-ak.last.fm/serve/500/4349551/Terri+Clark.jpg’;

$handle = fopen($url, ‘r’);

$meta_data = stream_get_meta_data($handle);

// Repassa todos os headers do servidor remoto para o nosso cliente
foreach ( $meta_data['wrapper_data'] as $header ) {
header($header);
}

// Repassa o conteúdo para o nosso cliente
fpassthru($handle);

Considerando que estamos apenas testando a funcionalidade. Ter um script de proxy totalmente funcional é bem mais complexo, e certamente já tem algo pronto por aí.
6 – fazer cálculo com data

Dentre todas as simplificações possíveis, a que mais costuma comover é a função strtotime. Pra quem já está acostumado, parece que não faz mais do que sua obrigação. Mas pra quem ainda faz cálculos com data multiplicando por 86400, chega a parecer mágico:
echo ‘Amanhã: ‘, strftime(‘%A’, strtotime(‘tomorrow’));
// Amanhã: domingo

echo ‘Próxima segunda: ‘, strftime(‘%d de %B de %Y’, strtotime(‘next monday’));
// Próxima segunda: 01 de junho de 2009

echo ‘Vencimento: ‘, strftime(‘%d/%m/%Y’, strtotime(‘+3 months’));
// Vencimento: 30/08/2009

Mais exemplos você mesmo pode ver no manual do PHP ou na página de Date Input Formats do projeto GNU. Para o nome dos meses e dias da semana ficarem em português, utilize setlocale(LC_TIME, ‘pt_BR’); antes de chamar a função strftime.
7 – escapar sql e html

Felizmente nunca mais vi nenhum script com aberrações anti-sql-injection, mas há algum tempo era possível encontrar pessoas removendo palavras-chave de SQL de todas as strings que íam para o banco de dados. Se o usuário digitasse palavras como select, delete ou drop, elas eram simplesmente removidas da frase. Isso quando o programador não interrompia o script e acusava o usuário de estar tentando explorar alguma falha de segurança. Eu juro, isso existia.

Ao trabalhar com PDO, a melhor opção (pra não dizer a única!) é utilizar prepare e execute pra separar a query em si dos seus parâmetros:
$conexao = new PDO(‘mysql:dbname=banco;host=localhost’, ‘login’, ’senha’);

$uf = ‘RJ’;
$idade = 18;

$sth = $conexao->prepare(‘SELECT nome FROM pessoa WHERE uf = ? AND idade > ?’);

$sth->execute(array($uf, $idade));

while ( $row = $sth->fetch() ) {
echo $row['nome'];
}

Se estiver utilizando drivers nativos, veja as funções mysql_real_escape_string ou mysqli_prepare e mysqli_stmt_bind_param, dependendo da extensão. Certamente outros bancos de dados têm a mesma funcionalidade.

A única preocupação é garantir que os parâmetros não se misturem com a query; não precisa inventar moda e remover o que o usuário digitou.

Outra confusão comum é ao escapar HTML. O objetivo é evitar que o texto digitado por um usuário seja interpretado pelo browser de todos os usuários do site.

Conceitualmente, esta é uma responsabilidade da camada de exibição. O template é que deve utilizar htmlspecialchars antes de gerar a saída na tela, e não antes de salvar no banco. Isso garante que o conteúdo que está no banco é fiel ao que foi digitado pelo usuário e pode ser reaproveitado em outras mídias além do HTML.

O que pode e deve ser feito é filtrar conteúdo realmente indevido, como caracteres inválidos ou espaços extras, dependendo da aplicação.

FONTE: http://garotosopa.wordpress.com/2009/05/30/7-coisas-simples-em-php-que-alguns-ainda-complicam/

24
Jul
09

Minhas contas whm/cpanel estão gerando arquivos core.xxx

Nada de pânico!
Se no home de seu cliente estão aparecendo muitos arquivos core.xxxx você pode resolver de forma simples!

Provavelmente o que você fez foi compilar o apache com muitos módulos, isto não é bom, então o que pode ter causado tal problema:

1 – você ativou todos os recursos do php,
2 – você ativou todos os recursos mpm (não inicialmente ativados).

Recompile seu apache sem mpm e com php 5.2.10 e será resolvido!

Abraços!

28
Abr
09

Como fazer o seu script php solicitar autenticação usando header

01
Abr
09

Ler arquivos PHP com extensões diferentes de .php, .php5 e demais – how to read extensions php

Quando você tem um servidor em suPHP e gostaria que um cliente que estivesse com um arquivo php de extensão .xyz e gostaria que o php o interpretasse tente criar um arquivo .htaccess dentro do diretório do usuário e dentro dele coloca o seguinte conteúdo:

AddType application/x-httpd-php5 .xyz

Pronto, deverá funcionar.

22
Fev
09

Evento: II encontro PHP-PB

O que é?

O segundo encontro do grupo de desenvolvedores PHP da Paraíba tem como objetivo reunir os membros do grupo, estudantes e profissionais da área de TI para troca de conhecimentos na tecnologia PHP e relacionadas. O encontro contará com palestras e momentos de networking entre os participantes.

Se você não participou do primeiro enconto, veja como foi:

* Fotos
* Apresentações

Quando?

Dia 07 de Março de 2009, a partir das 8 da manhã na Unipê, localizada na BR-230, bairro Água Fria em João Pessoa.
Unipê

Quer patrocinar?

Faça já o download do nosso plano de patrocínio e entre em contato conosco!

Inscrições

A participação no evento é gratuita, porém é necessária a prévia inscrição e a doação de 1Kg de alimento não perecível no dia do evento.

A doação será repassada à Casa da Criança com Câncer, instituição filantrópica que dá apoio aos pacientes e familiares vindos do interior em busca de tratamento no Hospital do Câncer Napoleão Laureano.

Os membros inscritos e presentes no dia do evento concorrerão a diversos brindes como livros da editora O’Reilly, camisetas, um elePHPant de pelúcia e muito mais!

Já contamos com 378 inscritos no total, sendo 1 só nas últimas 24 horas!

Inscreva-se AQUI!

Fonte: http://www.nerdblog.info/2009/02/22/ii-encontro-php-pb/

22
Fev
09

Tutorial de segurança em aplicações PHP (parte 1)

Estou anotando algumas dicas para aumentar a segurança em aplicações php (linguagem a qual programo).
Abaixo irei colocar algumas dicas sobre o que tenho aprendido, mas infelizmente de maneira resumida, definida como parte 1:

-alertas de erro -> Desabilitado (coisas como error_reporting(E_ALL);) – isto só pode ocorrer em um sistema no momento de testing.
-register_globals -> Desabilitado
-permissão ->dar o mínimo de privilégios possível no sistema, a nível
de bd e etc.
-variáveis ->setar vazios antes de atribuir strings.

Ex:

<?php

$busca = ”;

if (isset($_GET['busca']))

{

$busca = $_GET['busca'];

}

?>
- usar ssl para dados importantes, evitando exposição de dados.
- Forçar a segurança de maneira que não pese ao usuário,
se possível transparente. Ex: solicitar autenticação por medida de segurança para um transação importante de um cliente já autenticado no sistema.

- tomar sempre cuidado no ato de detecção de ataques, isso pode impedir a usabilidade do sistema.
- cuidados com interações em sistemas remotos (rss, apis remotas – web services).
- filtrar bem os dados (todos) que entram, para não operar com dados
maliciosos.

Filtrar dados é ler o que se entra por $ _GET e $ _POST e observar o que está malicioso e distinguir isto. (bem fácil de filtrar, ruim é identificar a origem)

Todas entradas têm de vir de uma fonte remota, se você não conhece as entradas, não pode se defender delas.

Entradas como $_SERVER exigem muito mais trabalho na hora da filtragem.
- A pior forma de filtrar é tentar manipular ao invés de tratar que o que é limpo é limpo e o que é sujo é sujo, do contrário, tentar manipular as informações poderá criar brechas.
Trecho que reforça a segurança quando um atacante tenta retroceder 1 diretório (ou mais):

<?php

$nomefile = $_POST['nomefile'];

while (strpos($_POST['nomefile'], ‘..’) !== FALSE)
{
$nomefile = str_replace(‘..’, ‘.’, $nomefile);
}

?>

Evidentemente, o basename() função pode substituir toda esta técnica e é uma maneira segura de atingir o objectivo pretendido. O ponto importante é que qualquer tentativa de corrigir Dados inválidos podem conter um erro e permitir a passagem de dados inválidos. Inspeção é uma alternativa muito mais seguro.

INSPECIONAR É MELHOR QUE CORRIGIR, quando se tenta corrigir geralmente se abre uma falha, o que é a real necessidade do atacante.

Se você consegue identificar com precisão e fidelidade a entrada dos dados você já fez quase tudo.
Após, o passo seguinte é criar um filtro fiel para distinguir dados ruins de dados bons.

sempre que for tratar dados o bom é criar um array vazio e atribuir dados a ele, que você realmente sabe que estão limpos.

<?php
$limpo = array( );
switch($_POST['cor']) {
case ‘vermelho’:
case ‘verde’:
case ‘azul’:
$limpo['cor'] = $_POST['cor'];
break;
}
?>

Estamos garantindo mais segurança por que a cor só pode ser uma das três e nada mais, neste caso!

você pode querer afirmar que um usuário só pode conter caracteres alfanuméricos:

<? php

$limpo = array ();

if (ctype_alnum ($ _POST [ 'user']))
(
$limpo[ 'user'] = $ _POST [ 'user'];
)

?>

Procure sempre usar funções nativas do php para segurança, isto pode lhe prevenir de problemas como erro de lógica, resultando assim em uma
brecha de segurança (o que um atacante necessita).

Para ajudar na segurança nos devemos:

Identificar saída,

Escapar saída,

Distinção entre escapara e não escapar dados .

É importante para escapar apenas dados filtrados. Embora escapar sozinho pode evitar muitas das vulnerabilidades de segurança, não deve nunca ser considerado como um substituto para a filtragem de entrada. Dados maliciosos devem ser filtrados primeiro e depois escapados.

Filtrar as entradas com htmlentities é melhor que htmlspecialchars, mas ambas são boas para converter o que vem da web, um exemplo legal é este aqui:

<?php
$htm = array( );
$htm['user'] = htmlentities($limpo['user'], ENT_QUOTES, ‘UTF-8′);
echo “<p>Olá, {$htm['user']}.</p>”; ?>

Isso garante a entrada de dados do user, e de tabela quebra a forma em que os dados vêm de maneira a traduzir caracteres “malucos” em html.

Devemos escapar todos os dados SIM, isto ajuda na segurança de sua aplicação.
htmlentities não converte caracteres alfanuméricos, mas previne que dados estranhos operem em interação do usuário com o sistema.

Outra política, voltando-se ao famoso e muito utilizado mysql é usar funções nativas para escapar entradas de dados para o banco de dados.
Usamos a função mysql_real_escape_string ().
Podemos usar também addslashes para ajudar na relação com o mysql, mas em última instância.

<?php $mysql = array( );

$mysql['username'] = mysql_real_escape_string($clean['username']);

$sql = “SELECT * FROM profile WHERE username = ‘{$mysql['username']}’”; $result = mysql_query($sql); ?>

Fonte -> http://phpsecurity.org/

16
Fev
09

PHP: Listando arquivos e pastas de um diretório

Quando o assunto é manipulação de arquivos dentro de um servidor, muita coisa pode ser feita. Inclusive para os administradores, alguns scripts são realmente úteis, como o que vamos ver a seguir.

O script que vou apresentar, é uma forma prática de listar as pastas e arquivos de um diretório (diretório este, que deverá ser remoto, ou seja, online), mostrando visualmente o que é pasta, e o que é arquivo.
Facilidade esta, que pode ser adicionada à um script de download, envio por email, etc.

Vou trabalhar aqui, com algumas funções pouco utilizadas, ou melhor dizendo, pouco exploradas.
São elas:
getcwd: http://www.php.net/manual/pt_BR/function.getcwd.php
opendir: http://www.php.net/manual/pt_BR/function.opendir.php
readdir: http://www.php.net/manual/pt_BR/function.readdir.php
sort: http://www.php.net/manual/pt_BR/function.sort.php
is_dir: http://www.php.net/manual/pt_BR/function.is-dir.php

getcwd: obtém o diretório atual
opendir: abre o diretório informado no getcwd
readdir: lê o diretório abe rto

Então esta é a primeira parte:

<?php
// pega o endereço do diretório
$diretorio = getcwd();
// abre o diretório
$ponteiro  = opendir($diretorio);
// monta os vetores com os itens encontrados na pasta
while ($nome_itens = readdir($ponteiro)) {
    $itens[] = $nome_itens;
}

O que fizemos aqui, foi justamente, pegar o diretório, abri-lo e lê-lo.

Continuando, vamos usar:

sort: ordena os vetores (arrays), de acordo com os parâmetros informados. Aqui estou ordenando por pastas e depois arquivos

// ordena o vetor de itens
sort($itens);
// percorre o vetor para fazer a separacao entre arquivos e pastas 
foreach ($itens as $listar) {
// retira "./" e "../" para que retorne apenas pastas e arquivos
   if ($listar!="." && $listar!=".."){ 

// checa se o tipo de arquivo encontrado é uma pasta
   		if (is_dir($listar)) {
// caso VERDADEIRO adiciona o item à variável de pastas
			$pastas[]=$listar;
		} else{
// caso FALSO adiciona o item à variável de arquivos
			$arquivos[]=$listar;
		}
   }
}

Vimos acima, a expressão is_dir, indicando que as ações devem esntão ser executadas, ali mesmo, no diretório que já foi aberto e lido. As ações que executamos ali, foram: ver se tem pastas, listar. Ver se tem arquivos, listar.

Agora, se houverem pastas, serão apresentadas antes dos arquivos, em odem alfabética.
Se não houverem, serão apresentados apenas os arquivos, na mesma ordem.
E se houverem os dois, serão mostrados igualmente.

// lista as pastas se houverem
if ($pastas != "" ) {
foreach($pastas as $listar){
   print "Pasta: <a href='$listar'>$listar</a><br>";}
   }
// lista os arquivos se houverem
if ($arquivos != "") {
foreach($arquivos as $listar){
   print " Arquivo: <a href='$listar'>$listar</a><br>";}
   }
?>

Para ver este script funcionando, clique aqui: http://www.flaviajobs.com.br/sistemas/revistaphp/listadir.php

O que você pode fazer, para melhorar um código como este: adicionar links às pastas e arquivos, podendo então fazer download, ou enviar um deles por email, por exemplo.
Também poderá adicionar um contador, para saber quantos arquivos tem, quantas pastas também.
Ou ainda: calcular o espaço que os arquivos estão tomando neste diretório, utilizando conjugadamente as funções filesize (ler tamanho do artigo) e disk_total_space (ver tamanho total do diretório) – Ambas funções, abordarei em outro artigo.

Fonte: http://www.revistaphp.com.br/artigo.php?id=48

08
Jan
09

Minhas URLs amigáveis pararam de funcionar depois que o cpanel atualizou ou meu apache foi atualizado

Como falei, nada de pânico… o little ajuda você (lol)… vamos ao que interessa.

Terreno

Se você teve um daqueles updates malditos que não justificam tantos problemas oriundos de tais feitos e o pior, ninguém entende por que o php está do mesmo jeito que antes, htacess intacto, a versão do apache manteve-se ou subiu e as diretivas do php.ini continuam as mesmas, e para completar o show de “bombas”, as urls amigáveis de seu site pararam como em um “toque de mágica”.

Ao combate

A única coisa que você vai habilitar e que o apache “fez o favor de desabilitar” é a funcionalidade multiviews, ele ajuda na interpretação de urls.

22
Dez
08

Um facebook grátis, opensource e de fácil utilização, tenha já o seu facebook!

Observei um pessoal em busca de um script no estilo Facebook, e não poderia deixar de compartilhar minha informação aqui. Para quem está afim de um sistema bem parecido com o facebook, opensource e grátis basta apenas acessar  o link abaixo:

http://www.elgg.org/index.php

A engenharia do sistema é bem interessante e faz o usuário sentir-se no Facebook mesmo!

Vale a pena conferir!

22
Dez
08

Adicione um Live Support Grátis, Opensource e de perfeito funcionamento

Gente, estive acessando o blog de uns mestres em aplicações web e fiquei muito feliz com uma iniciativa que avistei. Estou desenvolvendo um suite OpenSource para minha empresa e também para a comunidade e estava tentando entender bem o funcionamento dos chats online, mais precisamente os Live Supports da vida que precisava. Estava observando para preparar meus estudos e Justo agora descobri o sistema Open Web Messenger. Simplesmente maravilhoso, leve e funciona de verdade! Feito em PHP e com recursos bastante modernos, o sistema é perfeitamente elaborado.

Sua interface é limpa e muito amigável.

Se você quer um sistema de chat (live support) para seu site não deixe de acessar:

http://openwebim.org/

Obs: De bom que é será usado em meu projeto!

22
Dez
08

Fedora 10: Lamp2 – linux apache 2 mysql e php 5 + ruby + python

Vou mandar ver em um how to interessante para os amantes do LAMP sob fedora. Todos que usam Fedora devem (ou deveriam) saber que a versão atual deste fabuloso sistema encontra-se na 10. Iremos fazer um how to sobre lamp 2 no Fedora 10, então atente para estar usando Fedora 10.

Requisitos:

Internet (se rápida será melhor ainda),
Fedora 10,
Vontade de rodar o lamp2 no Fedora 10 ?:) ,
Estar logado como root.

Indo ao Combate

Após instalar seu Fedora acesse o console como root e execute os seguintes comandos:

yum update -y

Isso vai atualizar os repositórios e recursos do sistema (kernel, utilitários  e etc).

Após vamos instalar o mysql:

yum -y install mysql mysql-devel mysql-server

Isso vai instalar o mysql, mas logo após sua instalação aplique os comandos abaixo:

chkconfig –levels 235 mysqld on
/etc/init.d/mysqld start

Confirme se a porta já está ativa e esperando conexões:

netstat -tap | grep mysql

Isto deve gerar uma saída mais ou menos assim:

tcp        0      0 *:mysql                     *:*                         LISTEN      2407/mysqld

Após faça este ajuste aqui:

vi /etc/my.cnf

#skip-networking

Comentar a linha acima.

Reinicie o mysql com o comando:

/etc/init.d/mysqld restart

Pronto, defina a senha de root do mysql com os comandos abaixo:

mysqladmin -u root password Sua_nova_SENHA
mysqladmin -h maquina.meudominio.com -u root password Sua_nova_SENHA

Isso aplicará a senha de root do mysql.

Agora vamos aplicar php, python e ruby + apache 2:

yum -y install httpd php php-devel php-gd php-imap php-ldap php-mysql php-odbc php-pear php-xml php-xmlrpc php-eaccelerator php-magickwand php-magpierss php-mapserver php-mbstring php-mcrypt php-mhash php-mssql php-shout php-snmp php-soap php-tidy curl curl-devel perl-libwww-perl ImageMagick libxml2 libxml2-devel

chkconfig –levels 235 httpd on

Pronto, depois disso faça o teste com —>

/etc/init.d/httpd start

Instale o ruby:

yum install httpd-devel ruby ruby-devel

cd /tmp
wget http://www.modruby.net/archive/mod_ruby-1.3.0.tar.gz
tar zxvf mod_ruby-1.3.0.tar.gz
cd mod_ruby-1.3.0/
./configure.rb –with-apr-includes=/usr/include/apr-1
make
make install

vi /etc/httpd/conf.d/ruby.conf

LoadModule ruby_module modules/mod_ruby.so

/etc/init.d/httpd restart

yum install mod_python

/etc/init.d/httpd restart

Prontooo!

21
Dez
08

O que há de novo no PHP 5.3?

Em alguns instantes os desenvolvedores PHP se perguntam:

O que há de novo no PHP 5.3?

Aqui está a resposta elaborada por parte da IBM em um overview interessante e dividido em 2 partes (até o momento):

http://www.ibm.com/developerworks/opensource/library/os-php-5.3new1/?ca=dgr-lnxw07PHPv5.3P1&S_TACT=105AGX59&S_CMP=GRsitelnxw01
http://www.ibm.com/developerworks/opensource/library/os-php-5.3new2/index.html?ca=dgr-lnxw01os-php-5.3new2&S_TACT=105AGX59&S_CMP=GRsitelnxw01

Fonte: www.tinews.org

17
Dez
08

Detecção de Intrusos em Aplicações WEB PHP com PHPIDS

Detecção de Intrusos em Aplicações php com PHPIDS

A dica aqui vai para servidores que rodam com o apache e php5 (sob linux).
O PHPIDs é um sistema de detecção de instrusos, simples, rápido, bem estruturado e de fácil utilização. Isto cria mais uma camada de segurança para a sua aplicação web. Ele não vai filtrar entradas maliciosas, tampouco fazer maravilhas, como se estivesse com inteligência artificial, ele irá detectar o ataque e irá reagir segundo as suas configurações. O interessante é que ele tem o poder de decisão no momento de uma tentativa de invasão. Ele
pode servir para informar ao atacante que está tentando invadir de cuidade, alerta e etc, ou mesmo, notificar ao core de desenvolvimento da aplicação por email a tal tentativa de invasão.

Este how to é beta e nada aqui é GARANTIDO de funcionar, mas deve!

Requerimentos:

Os testes foram realizados na plataforma Gnu/Linux, no sabor Debian Etch, o qual teve ip

setado como 192.168.0.100, tendo por usuário e grupo de usuário do apache www-data.
Nos testes o diretório principal usado é um virtual host -> /var/www/web1/web

Por questões de segurança o diretório do PHPIDs será criado em outro lugar para evitar problemas com a estrutura, tornando-a mais difícil contra vulnerabilidade, no caso:

mkdir /var/www/web1/phpids

Criamos um diretório recursivo, evitando acesso público ao web, que deixaria o script vulnerável.

O arquivo que usamos neste tutorial é phpids-0.4.7.tar.gz, o qual temos apenas a necessidade de uso diretório lib.

cd /tmp
wget http://php-ids.org/files/phpids-0.4.7.tar.gz
tar xvfz phpids-0.4.7.tar.gz
cd phpids-0.4.7
mv lib/ /var/www/web1/phpids/

Agora mudamos o diretório para /var/www/web1/phpids/lib/IDS:

cd /var/www/web1/phpids/lib/IDS

Agora iremos fazer com que o /tmp permita escrita para o usuário do apache (log do phpids necessitará):

chown -R www-data:www-data tmp/

Agora vamos configurar o PHPIDs em seu arquivo de configuração:

cd Config/
vi Config.ini

As configurações são padrão, todavia iremos alterar o caminho de onde estão os arquivos, sendo o ajuste final idêntico a isto aqui:

; PHPIDS Config.ini

; General configuration settings

; !!!DO NOT PLACE THIS FILE INSIDE THE WEB-ROOT IF DATABASE CONNECTION DATA WAS ADDED!!!

[General]

filter_type     = xml
filter_path     = /var/www/web1/phpids/lib/IDS/default_filter.xml
tmp_path        = /var/www/web1/phpids/lib/IDS/tmp
scan_keys       = false

exceptions[]    = __utmz
exceptions[]    = __utmc

; If you use the PHPIDS logger you can define specific configuration here

[Logging]

; file logging
path            = /var/www/web1/phpids/lib/IDS/tmp/phpids_log.txt

; email logging

; note that enabling safemode you can prevent spam attempts,
; see documentation
recipients[]    = test@test.com.invalid
subject         = “PHPIDS detected an intrusion attempt!”
header                      = “From: <PHPIDS> info@php-ids.org”
safemode        = true
allowed_rate    = 15

; database logging

wrapper         = “mysql:host=localhost;port=3306;dbname=phpids”
user            = phpids_user
password        = 123456
table           = intrusions

; If you would like to use other methods than file caching you can configure them here

[Caching]

; caching:      session|file|database|memcached|none
caching         = file
expiration_time = 600

; file cache
path            = /var/www/web1/phpids/lib/IDS/tmp/default_filter.cache

; database cache
wrapper         = “mysql:host=localhost;port=3306;dbname=phpids”
user            = phpids_user
password        = 123456
table           = cache

; memcached
;host           = localhost
;port           = 11211
;key_prefix     = PHPIDS
;tmp_path       = /var/www/web1/phpids/lib/IDS/tmp/memcache.timestamp

Pronto, terminado.

Usando o PHPIDs

Nós iremos criar o arquivo que vai fazer a chamada do PHPIDs (depois iremos ajustar o arquivo para chamar automaticamente os recursos do PHPIDs para todas as contas do servidor):

<?php
set_include_path(
get_include_path()
. PATH_SEPARATOR
. ‘/var/www/web1/phpids/lib’
);

require_once ‘IDS/Init.php’;
$request = array(
‘REQUEST’ => $_REQUEST,
‘GET’ => $_GET,
‘POST’ => $_POST,
‘COOKIE’ => $_COOKIE
);
$init = IDS_Init::init(‘/var/www/web1/phpids/lib/IDS/Config/Config.ini’);
$ids = new IDS_Monitor($request, $init);
$result = $ids->run();

if (!$result->isEmpty()) {
// Take a look at the result object
echo $result;
require_once ‘IDS/Log/File.php’;
require_once ‘IDS/Log/Composite.php’;

$compositeLog = new IDS_Log_Composite();
$compositeLog->addLogger(IDS_Log_File::getInstance($init));
$compositeLog->execute($result);
}
?>

Se você chamar o arquivo no browser, perceberá que o mesmo ficará em branco, no caso http://192.168.0.100/phpids.php – porém, mas se você tentar usar um suposto ataque, nosso amigo PHPIDs vai entrar em ação, use o exemplo -> http://192.168.0.100/phpids.php?test=%22%3EXXX%3Cscript%3Ealert(1)%3C/script%3E

Pronto, agora iremos ver o caminho para que os scripts usem o PHPIDs, e o interessante aqui, você não precisará alterar todos os seus scripts, isto por que iremos chamar o script automaticamente como recurso do PHP, isto carregará o mesmo “como se fosse um módulo”, e o parâmetro que define isto bacaninha é -> auto_prepend_file, iremos apontar o arquivo no php.ini principal do servidor, isso dará força e velocidade no desenvolvimento usando tal recurso. Isto também pode ser feito em um arquivo .htaccess, desde que apontemos tudo corretamente, haverá de funcionar turbinado.

NO CASO DO PHP.INI

vi /etc/php5/apache2/php.ini

procure pela linha auto_prepend_file, se não achar, insira no meio do arquivo aberto:

auto_prepend_file = /var/www/web1/web/phpids.php

Reinicie o Apache:

/etc/init.d/apache2 restart

NO CASO DO ARQUIVO .HTACCESS

vi /var/www/web1/web/.htaccess

php_value auto_prepend_file /var/www/web1/web/phpids.php

Verifique os confs de vhost, se estão assim:

<Directory /var/www/web1/web/>
AllowOverride All
</Directory>

Caso sim, caso tenha mudado algo no apache e retorne para este padrão acima, reinicie o apache.

Crie um simples arquivo ->

vi /var/www/web1/web/info.php
dentro dele:

<?php
phpinfo();
?>

Faça um acesso simples -> http://192.168.0.100/info.php

Agora, para ver o PHPIDs em ação use http://192.168.0.100/info.php?test=%22%3EXXX%3Cscript%3Ealert(1)%3C/script%3E

Se as mensagens de alerta forem vistas é por que o script de /var/www/web1/web/phpids.php foi chamado automaticamente de dentro de /var/www/web1/web/info.php.

Sobre os logs

Podem ser vistos em /var/www/web1/phpids/lib/IDS/tmp/phpids_log.txt, para ver rapidamente o teste use:

cat /var/www/web1/phpids/lib/IDS/tmp/phpids_log.txt

Algo parecido com os termos abaixo será exibido:

“192.168.0.77″,2008-06-04T17:36:08+02:00,54,”xss csrf id rfe

lfi”,”REQUEST.test=%5C%22%3EXXX%3Cscript%3Ealert%281%29%3C%2Fscript%3E GET.test=%5C%22%3EXXX%3Cscript%3Ealert%281%29%3C%2Fscript%3E”,”%2Finfo.php%3Ftest%3D%2522%253EXXX%253Cscript%253Ealert%281%29%253C%2Fscript%253E”

Isso é bom para quem quer analisar tipos de ataques e quer reaplicar mudanças valiosas na segurança.

Vamos fazer uma mudança no nível de segurança para que seja exibida informação, caso esteja vazio o ataque, prossiga, do contrário será parado o script!

vi /var/www/web1/web/phpids.php

<?php
set_include_path(
get_include_path()
. PATH_SEPARATOR
. ‘/var/www/web1/phpids/lib’
);

require_once ‘IDS/Init.php’;
$request = array(
‘REQUEST’ => $_REQUEST,
‘GET’ => $_GET,
‘POST’ => $_POST,
‘COOKIE’ => $_COOKIE
);
$init = IDS_Init::init(‘/var/www/web1/phpids/lib/IDS/Config/Config.ini’);
$ids = new IDS_Monitor($request, $init);
$result = $ids->run();

if (!$result->isEmpty()) {
// Take a look at the result object
echo $result;
require_once ‘IDS/Log/File.php’;
require_once ‘IDS/Log/Composite.php’;

$compositeLog = new IDS_Log_Composite();
$compositeLog->addLogger(IDS_Log_File::getInstance($init));
$compositeLog->execute($result);

die(‘<h1>Go away!</h1>’);
}
?>

fonte:

http://www.howtoforge.com/intrusion-detection-for-php-applications-with-phpids

16
Dez
08

Hospedagem de Sites Grátis Brasileira!

Estou fazendo este post, mas na realidade não passa de um apontamento para um projeto o qual faço parte para que o nosso maravilhoso Google faça a indexação perfeita. Abaixo irei explicar o que é o projeto, para quem se destina e como é mantido.

O projeto LiBPHP.net

Este projeto foi criado inicialmente como um fórum e um informativo sobre linguagens de programação, em especial o php, todavia, com o fechamento de uma empresa de hosting a qual eu fazia parte do quadro majoritário, estive sem espaço para trabalhar e “fui a rua caçar portas!”. Obtive bastante apoio de muita gente a qual abriu as portas e me fortaleceu. No entanto, meu desejo por programação e linux foi querendo “aflorar” neste meio tempo, e o compartilhar da informação também.
No tempo em que estive na empresa precisei aprofundar os conhecimentos em PHP, Mysql, CSS, ajax e etc, o que me fez mais próximo ainda da Web nos últimos meses.
Neste tempo tornei-me parte do core de desenvolvimento do ISPConfig, considerado o melhor painel de controle OpenSource do Mercado. Para ler sobre este projeto e sobre nossos projetos opensource acesse www.ispconfig.org ou o nosso fórum.
O projeto surgiu baseado em soluções de hospedagem gratuita que o mercado carece (tendo poucas que realmente funcionam bem).

A quem se destina e O QUE VOCÊS GANHAM COM ISSO?
O Projeto LiBPHP.net destina-se aos desenvolvedores e aprendizes de desenvolvimento de aplicações web baseados nas seguintes linguagens:

PHP,
Ruby,
Python.

O projeto visa a hospedagem de sites grátis sem custos para que projetos como ISPConfig, LiBPHPCash e etc possam ser aprimorados e ter código-fonte bastante aproveitável.
Em breve o projeto disponibilizará SVN para os usuários.
O Lucro/ Mantimento do projeto vem dos seguintes recursos:

Publicidade,
Doações via PagSeguro,
Doações via Paypal,
Doações via Depósito Bancário,

Serviços Freelancer como Gerenciamento de Servidores Windows Plesk , Gerenciamento de Servidores Gnu/Linux com ISPConfig e Customização/Desnevolvimento WEB.
Sendo as quatro primeiras opções as mais amigáveis, pois se estivermos com tempo disponível poderemos desenvolver com mais fervor as ferramentas OpenSource – Grátis que oferecemos.

O Custo mensal do Servidor é de R$ 250 / mês, o que nos preocupa em caso de não doações, pois o serviço de hospedagem para sites grátis é mantido por donativos.

Se você deseja ajudar o projeto e não tem condições, indique o link para um amigo, isso ajudará!

Vantagens de Estar hospedando na LiBPHP.net

A Vantagem é que você terá hospedagem de sites grátis php, dentre outras linguagens, suporte via fone e ticket, mas iremos expor os mais amigáveis recursos de hospedar no projeto:

1 – Painel de Controle em Português Brasil (ou inglês, caso deseje),
2 – Emails (direito a emails e webmails como Roundcube, Squirrelmail e Webmiau),
3 – Banco de dados (direito a banco de dados Mysql e PHPMyadmin),
4 – Servidor Estável e poderoso (linha AMD Opteron).
5 – NÃO PRECISA PAGAR NADA POR ISSO, se desejar DOE (recomendado).
6 – 500 mb de espaço GRÁTIS para hospedar seu site/aplicação.
7 – Permitido hospedar blogs, fóruns e etc.
8 – Suporte via fone e ticket.
9 – Existem Sysadmins monitoriando o servidor, aplicando Patches e etc.
10 – SEM PROPAGANDA, BANNER ou LINKs.

Só não é tolerado spammer, flooder, phishing e práticas ilegais que se enquadrem em punições segundo o quadro de leis federais. (ex: pedofilia)

Nenhum dos conteúdos acima é tolerado, caso um site seja pego com isso será divulgado em uma lista de sites mundial visando restringir acessos de pessoas aos sites.

Conheça mais o projeto em: http://www.libphp.net

12
Dez
08

PHP 5.2.8 – Eu hein!

Caramba, os caras do PHP estão mais rápidos que o super-herói The Flash, já lançaram a versão 5.2.8, que na realidade não passa de um pacth rápido da versão 5.2.7.

Para conferir o lançamento “flash”, acessem:

http://www.php.net/archive/2008.php#id2008-12-08-1

08
Dez
08

Instalando php mais novo em servidores CentOs, Red Hat ou Fedora

É comum que tenhamos um servidor feito sem recursos de painéis de controle como Plesk ou Cpanel que tornam a versão do php muito antiga… porém, em observação, precisava de uma versão tunada do php para poder programar feliz e contente!

O Centos Veio com a versão 5.1.6, que nada tinha de tão importante (o que precisava), então, abaixo segue how to para subir para uma versão 5.2.x:

wget http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-2.noarch.rpm
wget http://rpms.famillecollet.com/el5.i386/remi-release-5-4.el5.remi.noarch.rpm
rpm -Uvh remi-release-5*.rpm epel-release-5*.rpm

yum --enablerepo=remi update php

pronto, depois disso só precisa verificar:

php -v

PHP 5.2.6 (cli) (built: May  7 2008 00:50:43)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies

29
Nov
08

Evento de PHP – PHPPB – assista ao vivo!@

http://www.php-pb.net/

Abração a todos!

21
Out
08

Desabilitando Funções do PHP em servidores!

Algumas funções do Php precisam ser desabilitadas em servidores web compartilhados. Altere os mesmos em:

/usr/lib/php.ini
Se o Zend foi compilado, o caminho pode ser:
/usr/local/Zend/etc/php.ini

Lozalize a linha: disable_functions = e digite as funções:

exec, system, passthru, shell_exec, escapeshellarg, escapeshellcmd, proc_close, proc_open, dl, popen

Ou, mais completo:

dl, system, exec, shell_exec, chown, chgrp, escapeshellcmd, putenv, popen, pclose, passthru, proc_open, proc_get_status, proc_nice, proc_close, proc_terminate, posix_ctermid, posix_get_last_error, posix_getcwd, posix_getegid, posix_geteuid, posix_getgid, posix_getgrgid, posix_getgrnam, posix_getgroups, posix_getlogin, posix_getpgid, posix_getpgrp, posix_getpid, posix_getppid, posix_getpwnam, posix_getpwuid, posix_getrlimit, posix_getsid, posix_getuid, posix_isatty, posix_kill, posix_mkfifo, posix_setegid, posix_seteuid, posix_setgid, posix_setpgid, posix_setsid, posix_setuid, posix_strerror, posix_times, posix_ttyname, posix_uname

fonte: http://www.forumcpanel.com.br/index.php?showtopic=368&pid=2002&mode=threaded&start=#entry2002

13
Out
08

Alterando Timezone de sua aplicação PHP

As vezes nos perguntamos:
Como alterar o timezone de uma aplicação PHP?

Simples, no script que você deseja mudar use:

putenv(“TZ=America/Sao_Paulo”);

Para mais timezones acesse:

http://www.theprojects.org/dev/zone.txt

Obs -> Só roda bem se o safe_mode estiver ON e ele estará REMOVIDO do php6!

21
Set
08

Instalação do Subversion no Ubuntu (sem frescuras!)

Estava me organizando para uma séria de projetos, nada mais justo que falar para você mesmo que você precisa ser justo com a administração de seu tempo. Estou em um domingo, descansando e disposto a dar mastigadinho (outra vez) o esquema para você:

 

Arena – ou campo de batalha

  1. Instalar o Ubuntu Server sem selecionar as opções de LAMP ou DNS Server (se desejar instalar o lamp agora siga o how to no link -> http://littleoak.wordpress.com/2008/07/04/ubuntu-804-apache2-php5-mysql5-phpmyadmin-lamp2-no-ubuntu-804/
  2. No meu caso, que tem um HD de 10GB, dividi as partições de maneira default (assistido e usar disco inteiro). Instalar o Apache e o SVN:
    • sudo apt-get install apache2 subversion libapache2-svn
  3. Criar o diretório onde ficarão os repositórios do SVN:
    • sudo mkdir /srv/svn
  4. Criar o repositório. Aqui seria um bom momento para restaurar o backup, quando for o caso:
    • sudo svnadmin create /srv/svn/{repositorio}
  5. Dar acesso ao Apache para esses diretórios:
    • sudo chown -R www-data:www-data /srv/svn
  6. Configurar o módulo webdav do subversion
    1. sudo vi /etc/apache2/mods-enabled/dav_svn.conf
    2. Descomentar a tag <Location /svn>. No início e no fim do arquivo.
    3. Descomentar a opção DAV svn
    4. Descomentar a opção SVNParentPath /var/lib/svn e mudar o caminho para a localização do repositório: /srv/svn. Foi escolhido essa ao invés da SVNPath para termos mais de um repositório nesta mesma pasta.
    5. Descomentar a opção AuthzSVNAccessFile /etc/apache2/dav_svn.authz. Para habilitar o controle de acesso aos projetos usando o arquivo informado. Mais informação sobre como criar o arquivo podem ser vistas no livro vermelho do Subversion, na seção Per-Directory Access Control. Infelizmente a versão em português ainda não foi traduzida.
    6. Descomentar, para habilitar a autenticação, as três linhas:
      1. AuthType Basic
      2. AuthName “Subversion Repository”
      3. AuthUserFile /etc/apache2/dav_svn.passwd
      4. Adicione a linha: Require valid-user
      5. Descomente a última informação de </Location>
      6. Salve o arquivo. Para isso, aperte a tecla ESC digite “:wq” sem as aspas e pressione enter
  7. Crie um usuário para acessr o SVN:
    • sudo htpasswd -cm /etc/apache2/dav_svn.passwd <username>
    • O parâmetro -c só é necessário para o primeiro usuário, pois é usado para criar o arquivo. Para os seguintes apenas o -m resolve, que é usado para criptografar a senha com o MD5.
  8. Reiniciar o apache
    • sudo /etc/init.d/apache2 restart



a