Categorias
PHP

Converter formato de data para o formato BR, em uma linha de código só

Vou pedir licença ao Frederico e também palpitar sobre a possibilidade de, em uma linha, converter o formato de data do banco (funciona para o MySQL e outros bancos) para o formato brasileiro em php.

$data = "2008-01-09 14:56:06";
echo date('d/m/Y H:i:s', strtotime($data)); // mostrará 09/01/2008 14:01:06.
echo date('d/m/Y', strtotime($data)); // mostrará 09/01/2008.

Update em 24/01/2023: Podemos utilizar também DateTimeImmutable:

php > $data = "2008-01-09 14:56:06";
php > echo (new \DateTimeImmutable($data))->format('d/m/Y H:i:s');
09/01/2008 14:56:06
php > echo (new \DateTimeImmutable($data))->format('d/m/Y');
09/01/2008

Simples assim. 🙂

Essa solução funciona para datas no formato yyyy-mm-dd hh:mm:ss e yyyy-mm-dd.

Categorias
Linux

Lista brasileira de equipamentos e serviços compatíveis com Linux

Ajude a divulgar a lista brasileira de equipamentos e serviços compatíveis com Linux
...e concorra a MP4 e MP3 players, mochilas Targus, períodos de VoIP grátis e até a ventiladores USB - além de contribuir automaticamente para doações para a Wikipedia e o WordPress! O BR-Linux coletou mais de 12.000 registros de compatibilidade de equipamentos e serviços (webcams, scanners, notebooks, ...) na sua Pesquisa Nacional de Compatibilidade 2007, e agora convida a comunidade a ajudar a divulgar o resultado. Veja as regras da promoção no BR-Linux e ajude a divulgar - quanto mais divulgação, maior será a doação do BR-Linux à Wikipedia e ao WordPress.

Categorias
Política

Vergonha estadual

"Crime tributário não é causa para quebra de decoro. Amanhã, isso pode ser usado contra os senhores. Porque muitos aqui têm problemas fiscais."
Francisco Dornelles, senador do PP-RJ, defendendo "tecnicamente" a absolvição de Renan (Veja, edição 2.026 - ano 40 - nº 37, de 19 de setembro de 2007)

Como diriam os baianos: Aonde?

Uma tremenda vergonha essa insinuação do senador Dornelles. Os próprios legisladores não se importando no cumprimento da lei e, pior ainda, usando uma brecha para justificar uma abolvição absurda? O senador sabe que está em erro, sabe que o senador Renan Calheiros está errado, mas...

Na página de Marcelo Crivella, outro senador do Rio de Janeiro, ele declara:

Para Crivella, voto secreto desgasta imagem do Senado

Comentando a votação pelo Plenário do projeto que pedia a perda do mandato do senador Renan Calheiros (PMDB-AL), o senador Marcelo Crivella (PRB-RJ) afirmou que o voto secreto desgastou a imagem do Senado. Disse esperar que Renan, como gratidão ao beneplácito do Plenário, se afaste ou tire uma licença e deixe os outros processos contra ele no Conselho de Ética e Decoro Parlamentar serem julgados sem sua presença no comando da Casa. Crivella lembrou ainda que, se as seis abstenções se transformassem em votos favoráveis ao parecer do conselho, Renan estaria banido da vida pública até 2019.

O resultado da votação, nesta quarta-feira (12), foi 35 votos pela perda do mandato, 40 contrários e 6 abstenções.
Agência Senado, 12/09/2007

Tá... E cadê o voto do senador? Creio que também foi a favor da absolvição, como Dornelles. Não encontrei na página do senador nenhum meio de perguntá-lo diretamente como foi o seu voto e não acredito que valha a pena perguntar pelo e-mail oficial, mesmo com sua declaração de que "voto secreto desgasta imagem do Senado" talvez sua resposta seja exatamente "desculpe, mas meu voto é secreto". Será que quebro a cara? Gostaria muito.

[atualização-03/10/2007]Tem vezes que estar certo não é bom. E adivinhar o que o Crivella responderia foi uma dessas vezes.[/atualização]

O terceiro senador é Paulo Duque. Está na vaga, se não me engano, de Sérgio Cabral. O que será que ele votou?

Além de meu descontentamento com o que aconteceu no senado, ainda maior descontentamento com a declaração de Dornelles e a percepção de que todos os votos do Rio de Janeiro foram a favor da absolvição de Renan Calheiros, não quero ser contado entre os de memória curta. Ficará registrado o que aconteceu para que eu não vote em nenhum dos três na próxima eleição. Quem colabora com o crime é cúmplice.

Quem souber de outras manifestações sobre os senadores de seu estado, por favor, me avise.

[atualização-03/10/2007]
Confira como votaram os senadores. E é interessante o detalhe que "o resultado divulgado pela Casa apontou que 40 senadores votaram pela absolvição, 35 pela cassação, enquanto outros seis se abstiveram. Ouvidos pelo Terra, no entanto, 41 senadores disseram que votaram a favor da perda de mandato."
[atualização]

Textos relacionados:

Categorias
Cotidiano

Para amar uma mulher

Recebi de um amigo que se lembrou de mim e minha esposa. Natural que eu dedique a ela, com quem sou um.

Para amar uma mulher é preciso saber escutar
cada sorriso.
Sejam abertos ou fechados,
ou apenas prenunciados.
Numa pluralidade, o valor singular.
Em seu disfarce ou sinceridade,
a forma da mulher se expressar:
Quando um "não" é dito como "sim" ...

Para amar uma mulher é assim:
sinta cada fio
do seu cabelo.
Fronteira entre a força e a delicadeza
No toque macio,
enxergar a aspereza e as dores
que ela guarda dentro do peito
e querer saná-las de qualquer modo,
custe o que custar,
de qualquer jeito.

Para amar uma mulher
faça dela o primeiro plano, tua estrela.
Entre o universo de amigos,
aquele futebol, a televisão domingueira,
escolher ficar com ela, surpreende-la.
Até assumir um estilo romântico, Shakesperiano...
Sussurrar que a amará por duzentos anos,
a toda hora, a vida inteira.
Só um poeta e uma mulher sabem o poder das palavras....

Para amar uma mulher ainda que não a entendas,
aceita-a,
e a deita em teu colo no desespero
daquele choro sem motivo,
em exagero.
Elogia aquele batom que te convida,
daquele sem finalidades,
em despedida....
Perdoa suas fraquezas,
seu lado enciumado,
compreenda que neste campo mimado,
se a pisares, ela explodirá.

Para amar uma mulher, não é preciso esperar...
Ela já te espera, sabe que existes.

Para amar uma mulher
é necessário ser doce feito mel...
deixando-se deitar-se e lambuzar-se nele.

Para amar uma mulher,
basta fazer com que ela se sinta amada.

(Autor desconhecido)

"Por isso deixará o homem a seu pai e a sua mãe, e unir-se-á à sua mulher, e serão os dois uma só carne; assim já não são mais dois, mas uma só carne."

Marcos 10.7 e 8

Categorias
Internet

Quem você lê e acompanha?

Tenho estado deveras ocupado, mesmo assim me senti honrado pelo convite do meu xará, e traçarei algumas linhas para dizer quem eu leio e acompanho sempre.

  • FechaTag - Já começo com uma similaridade com meu xará. Para quem gosta de tecnologia de verdade, a "pena" do Élcio é um prato cheio. Lá tem tudo o que gosto (e o que quero gostar em breve, como python). E feche a tag!
  • Márcio d'Ávila - Tanto o site como o blog são fontes de informação cuidadosa e direta sobre tecnologia, principalmente no que trabalho.
  • Peopleware - Programas interessantes para tudo. Repositório maravilhoso!
  • Contraditorium - E não é contraditório pensar.
  • Dicas-L - Dica para uma infinidade de temas tecnológicos.

Diariamente, pelo computador, leio também a Bíblia. 🙂

Categorias
Segurança

Videos da Campanha Antispam.br

A CGI.br trabalhando por uma internet mais fácil. Excelentes vídeos, vale a pena assistir sejam profissionais ou leigos.

Estão disponíveis 2 vídeos da Campanha Antispam.br:

   * Navegar é Preciso -- trata do funcionamento da Internet, com suas vantagens, riscos e necessidade de proteção;
   * Os invasores -- apresenta os tipos de códigos maliciosos, seus efeitos e como eles podem entrar no computador do usuário.

Eles podem poder obtidos para download na seguinte URL:

* Vídeos Antispam.br
http://www.antispam.br/videos/

Os vídeos estão disponíveis na área de downloads do site Antispam.br e podem ser baixados em diferentes formatos, permitindo a sua visualização em diversos sistemas operacionais. Estes vídeos também possuem diferentes tamanhos e resoluções para download via conexão discada ou banda larga.

Outros dois vídeos serão divulgados futuramente: "Spam", aborda os tipos de spam existentes, suas diferenças e malefícios, incluindo códigos maliciosos e fraudes; e "A Defesa", cujo enfoque é o aspecto comportamental, enfatizando como usuário pode evitar a maioria das ameaças.

Atenciosamente,
--
CERT.br
https://listas.cert.br/mailman/listinfo/certbr-anuncios

Categorias
PHP

Segurança no PHP

Os 6 requisitos mínimos

por Er Galvão Abbott (http://www.galvao.eti.br/) na revista PHPMagazine (http://www.phpmagazine.org.br/)

logo-phpmagazine

Apresentareremos neste artigo 6 requisitos que todo o desenvolvedor PHP deveria contemplar em sua aplicação. São boas práticas e hábitos simples que implementam um nível mínimo de segurança em qualquer sistema ou ferramenta desenvolvida com a linguagem.

A linguagem PHP é, sem dúvida, uma das mais populares quando o assunto é desenvolvimento de aplicações web. Existe, porém, um preconceito muito grande com a linguagem quando a questão é segurança. Neste artigo veremos 6 requisitos básicos que toda aplicação deveria possuir e que implementarão o mínimo de segurança em tudo o que você desenvolver.

Conceito: PHP é uma linguagem mais vulnerável do que as outras?

Atualmente impera no mercado de desenvolvimento um preconceito relacionado à segurança de aplicações PHP. A linguagem é freqüentemente alvo de duras críticas por parte da própria comunidade de desenvolvimento, e não é raro presenciarmos aplicações extremamente vulneráveis que, com toda a certeza, dão razão a essas críticas.

Este preconceito, totalmente equivocado, tem suas origens na extrema flexibilidade de configuração e uso da linguagem e no número cada vez maior de desenvolvedores inexperientes que começam sua carreira desenvolvendo aplicações PHP, ignorando questões básicas, seja por falta de conhecimento ou porque estão procurando agilizar sua produção pessoal.

Este artigo não é destinado apenas aos que estão começando. É surpreendente o número de desenvolvedores mais experientes que, por terem adquirido vícios, ainda ignoram as questões que apresentaremos aqui.

Requisito #1: Esqueça register_globals!

Register_globals é, sem dúvida alguma, a diretiva de configuração mais popular e polêmica já implementada no PHP. É popular entre os desenvolvedores por tornar o processo de programação muito mais ágil e prático. É polêmica porque retira tanto do programador quanto do interpretador da linguagem a responsabilidade em definir a origem das informações utilizadas pela aplicação.

Esta diretiva causou tantos problemas que começou a vir desabilitada por default a partir da versão 4.2.0 e será eliminada na versão 6. Por isso, se você ainda programa com register_globals ligada, está mais do que na hora de mudar.

Observe o seguinte exemplo de código:

$url = "http://www.meusite.com.br/index.php";
$errMsg = "Usuário%20não%20autenticado";
if (!$autenticado) {
header("Location: $url?erro=$errMsg");
} else {
/* A aplicação age com se o usuário estivesse autenticado */
}

Este código verifica por uma variável booleana chamada $autenticado, que tipicamente viria de uma sessão aberta quando o usuário se autenticou em nossa aplicação ou mesmo de um cookie. Ao utilizarmos os recursos da register_globals, porém, não estamos dizendo ao interpretador PHP que este dado deve vir obrigatoriamente de uma destas duas fontes.

Sendo assim, o interpretador procurará por esta variável em diversas fontes (variável do servidore web, dados de formulário, cookie, arquivos enviados por upload, query string ou sessões) das quais ele obteve informações até encontrá-la, desprezando se esta fonte está correta.

Torna-se extremamente simples "enganar" a sua aplicação PHP, basta que eu chame o seu arquivo passando a variável esperada por query string.

http://www.meusite.com.br/script.php?autenticado=1

Ao receber a query string contendo a informação "autenticado", este dado será automaticamente interpretado como uma variável pelo interpretador, quer exista sessões ou cookies ou não.

Uma dúvida freqüente é "se não tenho autorização para desligar a register_globals o que eu posso fazer?". A resposta para isso é tão simples quanto tudo o mais na linguagem: programe como se ela estivesse desligada! Veja como fica o nosso código ao não utilizar a register_globals:

$url = "http://www.meusite.com.br/index.php";
$errMsg = "Usuário%20não%20autenticado";
if (!$_SESSSION['autenticado']) {
header("Location: $url?erro=$errMsg");
} else {
/* A aplicação age com se o usuário estivesse autenticado */
}

Observe a mudança: ao utilizarmos o array super global $_SESSION, estamos explicitando para o interpretador que a informação "autenticado" tem que, obrigatoriamente, vir de uma sessão. Isto significa que será impossível para o interpretador confundir este dado com um dado enviado pela query string, pois este fica armazenado em um array super global diferente:

  • $_SERVER - Informações definidas pelo servidor web (Apache, IIS etc)
  • $_GET - Informações passadas por query string ou por um formulário web utilizando o método GET
  • $_POST - Informações enviadas, tipicamente, por um formulário web utilizando o método POST
  • $_COOKIE - Informações fornecidas por um cookie HTTP
  • $_FILES - Informações fornecidas por arquivos que foram enviados via upload HTTP
  • $_ENV - Informações fornecidas pelo ambiente do servidor
  • $_REQUEST* - Informações fornecidas por GET, POST ou COOKIE

* Cuidado: O uso do array super global $_REQUEST é quase tão perigoso quanto a register_globals em si, pois nesse caso a informação pode vir de qualquer um dos 3 métodos: GET, POST ou COOKIE.

Requisito #2: Use require e não include

O comando include e seus derivados - como include_once - são freqüentemente usados em detrimento do comando require. Este fato curioso a princípio é conseqüência da similaridade do comando include com outras linguagens, como C e Java.

O que muita gente não sabe, porém, é que este comando carrega consigo um risco muito grande para sua aplicação: se por algum motivo a inclusão do arquivo falhar - erro de digitação, disco corrompido etc - será gerado um erro de nível warning, um nível leve de erro que não causa a parada da execução do script.

Utilizando o comando require, garantimos que, no caso de falha na carga do arquivo, seja gerado, além do erro de nível warning, um erro de nível fatal. Em bom português isso significa que a execução do seu script será imediatamente interrompida neste caso. Por que é bom que seu script seja interrompido no caso de falha de inclusão de outro arquivo? Simples: no caso de falhas, as variáveis, as funções, as constantes e o que mais este arquivo carregava consigo, simplesmente, não estarão disponíveis.

Requisito #3: Filtre a entrada de dados!

Um dos principais conceitos de segurança é a filtragem dos dados que são recebidos antes de utilizá-los. A falta de fitlragem é a causa de inúmeros problemas de segurança, incluindo o infame SQL Injection, ou Injeção de SQL. Observe o seguinte código:

require_once("conecta.php");
$conn = conecta();
$sql = "SELECT email FROM usuarios WHERE usuario_id = " . $_GET['uid'];
$recordSet = mysql_query($sql);
while ($record = mysql_fetch_assoc($recordSet)) {
echo $record['email'] . '<br />';
}
mysql_close();

O problema deste código é utilizar um dado informado pela query string (uid) sem fazer nenhuma filtragem, ou seja, nosso script aceitará cegamente qualquer coisa que for digitada como valor de uid. Observe a seguinte URL:

http://www.meusite.com.br/script.php?uid=198%20OR%20'x'='x'

Após a conversão dos caracteres especiais desta URL, o valor de uid será (sem aspas duplas): "198 or 'x'='x'". Note que, quando concatenarmos isto à nossa query, ela terá sofrido uma grande modificação:

SELECT email FROM usuarios WHERE usuario_id = 198 or 'x'='x'

É por isso que a chamamos de "Injeção de SQL". A parte em vermelho acima é formada de SQL válido, mas completamente alienígena à nossa plicação: ele modifica o comportamento original da query.

Observe que, com um mínimo de esforço, um usuário conseguiu expor todos os e-mails cadastrados em nossa base de dados: como foi utilizado o operador "OR" e a segunda condição ('x'='x') é sempre verdadeira, serão exibidos todos os registros.

Para evitarmos este tipo de problema, devemos aplicar um tratamento à informação antes de utilizá-la. Caso a minha query - como neste exemplo - esteja esperando um número inteiro, a solução é simples: forçamos a conversão do dado recebido para número inteiro:

require_once("conecta.php");
$conn = conecta();

settype($_GET['uid'], integer);

$sql = "SELECT email FROM usuarios WHERE usuario_id = " . $_GET['uid'];
$recordSet = mysql_query($sql);
while ($record = mysql_fetch_assoc($recordSet)) {
echo $record['email'] . '<br />';
}
mysql_close();

A partir de agora, qualquer dado enviado pela query string será primeiro convertido para inteiro e somente depois desta conversão é que o utilizaremos. No caso de uma tentativa de Injeção de SQL, nosso script considerará apenas a parte numérica (198), como deveria ser. Além disso, se por um acaso nosso script receber apenas texto, a função settype converterá isto para o número 0.

Caso a minha query esteja esperando uma string a solução reside em criar um tratamento que valide esta string. Vejamos um exemplo: possuo uma query que busca dados de um usuário através de seu endereço de e-mail:

$sql = "SELECT nome, sobrenome FROM usuarios WHERE email = '" . $_GET['email'] . "'";

Sabemos que um endereço de e-mail é formado por um nome de usuário, uma arroba e um domínio. Para fins de simplificação do exemplo, trabalharemos como se o usuário só pudesse usar letras, números e o caracterese de ponto - para quem levar a validação de e-mail a sério consulte a RFC 822. Podemos representar isso através de uma expressão regular:

code>/^[A-Z|a-z|0-9|\.|]+\@[A-Z|a-z|0-9\.|]+/

Sendo assim, só aceitaremos o dado de endereço de e-mail se ele estiver dentro dos padrões de minha expressão regular. Nosso código então ficaria assim:

require_once("conecta.php");
if (preg_match('
/code>/^[A-Z|a-z|0-9|\.|]+\@[A-Z|a-z|0-9\.|]+/', $_GET['email'])) {
$conn = conecta();

$sql = "SELECT nome, sobrenome FROM usuarios WHERE email = '" . $_GET['email'] . "'";
$recordSet = mysql_query($sql);
while ($record = mysql_fetch_assoc($recordSet)) {
echo $record['email'] . '<br />';
}
} else {
die("O dado informado não é um endereço de e-mail válido.");
}
mysql_close();
Categorias
Technology

Blogueiro gosta mesmo é de reclamar

Quanta reclamação! Basta se descontentar com alguma coisa e lá está o texto publicado. É uma quantidade considerável a de textos reclamando de alguma coisa. E... estão certos!

Aonde mais podemos reclamar do ônibus cada vez menor e com assentos que já não cabem nossas pernas (querendo nos forçar a comprar nosso carro cada vez mais rápido)? Aonde podemos reclamar que em nossa rua não há um latão de lixo sequer e o mesmo fica todo espalhado na rua? Aonde podemos reclamar do atendimento de algum posto público? Não preciso me estender mais, senão já começo a reclamar também.

Não tínhamos voz. Só podíamos reclamar no almoço em família, com a vizinha do ônibus, no trabalho. Mas nossos amigo não podem fazer muito por nós. Não tínhamos nenhuma repercussão. Agora tudo mudou. Esse espaço é nosso. Aqui quem manda somos nós e aproveitamos nossa relevância e, finalmente, podemos fazer algum barulho. Podemos aproveitar que estamos aparecendo na primeira página do Google, que estamos sendo entrevistados, que estamos aparecendo na TV.

Tem sido muito bom poder ver nossa reclamação sem idealização política, apenas nossa vivência, nosso cotidiano, o que sofremos e o que pagamos. E ninguém pode calar a nossa voz.

Isso tudo pode ser usado para o desenvolvimento de nossa sociedade, com mais qualidade de vida, com mais respeito e com mais justiça. Seremos ouvidos? Espero muito que sim. Mas estou certo que é uma manifestação (consciente ou não) que pode fazer um mundo melhor.

Categorias
Cotidiano

Dia do trabalho

A todo instante vimos na televisão os supermercados anunciando "funcionamento normal" no dia 1º de maio, o Dia do Trabalhador.

Não foi só isso, tenho certeza. Por onde passei, a grande maioria das pequenas empresas estava aberta. É bem provável que grande parte do TeleMarketing também estivesse trabalhando, nem que fosse em escala ou hora-extra. Creio que a grande maioria dos verdadeiros necessitados do 1º de maio não usufruíram dele.

As repartições públicas e as grandes empresas fecharam no 1º de maio, sem contar os que emendaram. Mas estes já são locais onde as pessoas, se já não trabalham com o que gostam, têm excelentes condições de trabalho e/ou financeiras. Geralmente são pessoas que já têm prazer de trabalhar.

São exceções os que trabalham num supermercado, no telemarketing, na faxina, como entregador, como atendente de loja etc, por prazer. Mas esses não tiveram o seu descanso no feriado, mas serviram os que tiveram. E em tempo integral, pois tudo estava em "funcionamento normal".

O Dia do Trabalhador mudou mesmo, alías, repararam que faz tempo que só chamam de Dia do Trabalho? Deve ser por isso.

Categorias
do Senhor

O amor de Deus é…

O amor de Deus é envolvente
não é só para o crente,
mas para quem entende,
ponha isso em sua mente.
Venha, acredite, tente.

Ele vai fazer você diferente
em meio a toda gente,
pois todo o que sente
vive eternamente.

E tudo muda de repente,
não invente,
só Cristo salva verdadeiramente.
Acredite, isso é quente.

Salva você, seu amigo de trabalho e o gerente.
Salva quem não tem cabelo e quem usa pente.
Salva os banguelas e quem tem dente.
Isto é antigo, não é recente.
Cristo salva o homem para que ele viva eternamente.

No seu coração já foi plantada a semente,
vá e anuncie para o tenente
que a salvaçao é iminente.
Não deixe isso pendente!

A Palavra de Deus não mente,
é água corrente
que jorra do trono do Onipotente,
aquEle ue é Onisciente
e também Onipresente.

Vá à igreja, não fique em pé, se sente,
deixe Deus falar livremente
e então será usado poderosamente,
basta crer somente.
Isto é para todos igualmente.

Deus lhe abençoe grandemente.

--
Por Samuel Eli Santos (15/04/2007)