Posts de August, 2008

[Tiago Peczenyj] Despedida do Antonio

Friday, August 29th, 2008
Esta foi a ultima semana do Antonio na globo.com. A despedida foi em grande estilo, com direito a galeria gourmet. Fica o exemplo e a saudade desse grande colega.

Em clima de festa com direito a montinho e tudo:

Fico feliz por ter surpreendido do Antonio nesses poucos meses que trabalhei com ele, agora os desafios são outros (aka Expurgo…)!

Toninho, boa sorte no Yahoo!

Comments

Antonio Carlos Silveira
Pac, Boa sorte para vc tb e continue assim… You are in the right path!

[Jose Peleteiro] Installing CouchDB on Ubuntu 8

Wednesday, August 27th, 2008

Apache CouchDB is a very nice schema-free document-oriented database that I’m playing with lately.
Here’s a quick guide to get CouchDB running on Ubuntu 8:

Prepare your environment
sudo aptitude install automake autoconf libtool subversion-tools help2man spidermonkey-bin build-essential erlang erlang-manpages libicu38 libicu-dev libreadline5-dev checkinstall libmozjs-dev wget

Create a couchdb user
sudo adduser --no-create-home --disabled-password --disabled-login couchdb

Download and build the latests version
wget http://mirrors.uol.com.br/pub/apache/incubator/couchdb/0.8.1-incubating/apache-couchdb-0.8.1-incubating.tar.gz

tar -xzvf apache-couchdb-0.8.1-incubating.tar.gz

./configure --bindir=/usr/bin --sbindir=/usr/sbin --localstatedir=/var --sysconfdir=/etc

make

Install it
sudo make install

sudo chown couchdb:couchdb -R /var/lib/couchdb /var/log/couchdb

sudo update-rc.d couchdb defaults

Start the service
sudo /etc/init.d/couchdb start

CouchDB will be running on port 5984. By default it listens only for connections from the local host. To change that edit /etc/couchdb/couch.ini and restart CouchDB.

Sample code (Ruby):

#!/usr/bin/env ruby
 
# Setup
require "rubygems"
require "couchrest"
require "test/unit/assertions"
include Test::Unit::Assertions
 
# Database
couchdb = CouchRest.new("http://localhost:5984")
 
couchdb.database('helloworlds').delete! rescue nil
 
db = couchdb.create_db('helloworlds')
 
# Create
db.bulk_save([
  {"_id" => "en", "helloworld" => "Hello world"},
  {"_id" => "pt", "helloworld" => "Ola mundo"}
])
 
# Retrive
document = db.get("pt")
assert_equal "Ola mundo", document["helloworld"]
 
# Update
document["helloworld"] = "Olá mundo!!!"
db.save(document)
 
# Retrive again
assert_equal "Olá mundo!!!", db.get("pt")["helloworld"]
 
# Fails to delete, since variable msg is an only snapshot of the data
assert_raise(RestClient::RequestFailed) { db.delete(document) }
 
# But working with a last revision of the document
document_last_revision = db.get("pt")
 
assert_not_equal document["_rev"], document_last_revision["_rev"]
assert_nothing_raised { db.delete(document_last_revision) }
 
# Schema free
db.bulk_save([
  {"name" => "Maria Hernandes", "helloworld" => "Oi!"},
  {"name" => "John Wisky", "helloworld" => "Whatzup!", "age" => 24},
  {"helloworld" => "Duuuude!", "age" => 18, "country" => "Australia"},
  {"name" => "Peleteiro", "age" => 29, "country" => "Brazil", "helloworld" => "Olá"},
  {"helloworld" => "Hi guys", "name" => "Michel", "country" => "USA"}
])

[Tiago Peczenyj] SQL Injection - A fina arte de criar paginas realmente inseguras

Monday, August 25th, 2008
Este post diz tudo:



Por mais que existam alertas sobre os perigos de SQL Injection, muita gente resolve ignorar e criar sistemas cujas consultas ao banco de dados são feitas através de concatenações de strings com os dados oriundos do usuário.

Uma das primeiras coisas que aprendi quando trabalhava como testador foi tentar este código em telas de login:

' or '1' ='1

Imagine que o impacto dessa belezinha em uma query como esta:

"SELECT USUARIO FROM TABELA WHERE USUARIO = '" + usuario + "' AND SENHA = '" + senha + "'"
temos, então:

SELECT USUARIO FROM TABELA WHERE USUARIO = 'qqCoisa' AND SENHA = '' or '1' ='1'

Consegui efetuar o login devido a extrema preguiça do desenvolvedor que nunca se interessou em estudar um pouco de segurança, muito menos sabe o que é um prepared statement. Isso no melhor dos casos, posso querer inserir um DROP TABLE da vida facilmente, pois o sistema está, literalmente, de pernas abertas.

Recentemente um colega testou esse tipo de ataque contra um site de uma instituição por curiosidade. Ele conseguiu obter um arquivo contento a senha e o IP do banco de dados e conseguiu acessa-lo, perceberam o perigo?

Sinceramente? Se eu vejo um site que cai nesse truque eu não sinto pena. Não vou zoar ou fazer algo maléfico, as vezes até tento avisar, mas não sei se vale a pena: ou o sistema custou muito barato ou custou muito caro, foi produzido por uma consultoria que lucou 1980% em cima do salario do estágiario e que, por mais documentos que tenham produzido não conseguiram fazer algo básico: um site seguro contra hackers que estudam pela Wikipedia.

Se o seu site não pode receber aspas simples, duplas ou %, tenha MUITO medo, pois alguem VAI fazer algo em breve…

Comments

Marcio
Muito bom o post!
Marcio
muito bom o post!
Felipe
Essa tirinha do xkcd é uma das melhores.
Tiago Albineli Motta
Brincar com SQLInjection é divertido… principalmente em dias de tédio.

[Danilo Bardusco] XII Mostra PUC-Rio

Thursday, August 21st, 2008

Ontem estive na PUC rio para falar de Scrum e apresentar aos alunos como é o ambiente de desenvolvimento de software na globo.com.

A Mostra PUC-Rio acontece entre os dias 19 e 22 de agosto, com o tema “Os desafios da Inclusão do Conhecimento numa Economia Globalizada”.

os slides da minha apresentacão estão aqui:

[Tiago Peczenyj] Closures em Java - Parte 2

Monday, August 11th, 2008
Ainda sobre a Closures do java 7, agora será possivel fazer isso:

public class A {        public static void main(String args[]) {            @Shared int acumulador = 0;

            {int => int } xxx  = { int i =>  acumulador += i; i};

            System.out.println(xxx.invoke(1));            System.out.println(xxx.invoke(2));            System.out.println(xxx.invoke(3));            System.out.println("o valor do acumulador eh " + acumulador );

        }}

Só eu estou achando divertido?

http://gafter.blogspot.com/2008/08/java-closures-prototype-feature.html

Comments

Tiago Peczenyj
Não dá ideia!!

Logo aparece um @Global da vida… ;-)
Marcelo Martins
Fiquei com medo que tu falasse que era uma “variavel global”

hehe
Tiago Peczenyj
Martins, sem o @Shared o codigo compila mas gera um warning. É uma marcação que a variavel é compartilhada com outra closure ou bloco de código.
Marcelo Martins
O que que vem a ser aquele @shared?
Fabio Nascimento
Pois é, a única dúvida é como ele faz o autoboxing escondido(leia-se por debaixo dos panos)?
Mas no geral, tbm estou gostando, vamos ver… quando chegar a hora do SDK implementar isso de verdade mesmo.

Té +

[Claudio Figueiredo] Thought of the Day

Friday, August 1st, 2008

Isn’t loopback a redundancy?

If it’s a loop wouldn’t it be back anyway? :)