Subversion na Dreamhost
08/11/06
Hoje percebi que precisa usar o Subversion. Ficar levando arquivo de lá para cá não é muito legal. Logo pensei em ir no painel da Dreamhost. Na mosca!
A Dreamhost tem um item que permite configurar o Subversion rapidamente. Se você quer seguir adicionar esta funcionalidade à sua conta, siga os passos abaixo.
- Crie um domínio para o Subversion. Uma boa pedida é usar um subdomínio como
http://svn.seudominio.com.br/; - Depois que o DNS tiver sido propagado, vá até a opção Goodies > Subversion;
- Coloque o nome do projeto que você quer hospedar;
- Substitua os usuários por ao menos um usuário real. Os usuários que você adicionar neste campo terão permissão de escrita no repositório. Exemplo:
usuario senha123 - Você tem a opção de tornar o seu repositório público ou privado. A diferença é que no primeiro somente poderão ter acesso (leitura/escrita) os usuários que você definir. No segundo, a leitura é livre, mas a gravação necessita de um usuário cadastrado;
- Clique no botão Create my new project now!.
Pronto! Você já pode usar seu repositório! Se não tem idéia de como começar, veja algumas dicas abaixo.
Importar projeto
svn import ~/source/projeto/ http://svn.seudominio.com.br/projeto/ -m "Iniciando o projeto"
Update: O comando estava errado. Aviso do Murata.
Criar uma cópia do projeto
svn co http://svn.seudominio.com.br/projeto/
Gravar alterações no repositório
svn ci http://svn.seudominio.com.br/projeto/
Não é à toa que a Dreamhost é considerada uma das melhores empresas de hospedagem do mundo. Se você ainda não hospeda seu site lá, use o código SIMPLESIDEIAS e pague apenas US$59,40 no plano anual L1. Você vai pagar somente R$10,64 (cotação de hoje) por mês num plano com 200GB de espaço e 2TB de transferência, além de domínios ilimitados!
PHP e SQL Injection
07/11/06
Estava explicando para um amigo meu porque não se deve interpolar uma variável direto no SQL. O grande problema é que ao fazer desta maneira, seu sistema fica suscetível a SQL Injection.
Imagine que você faça algo como abaixo.
<?php
$query = "SELECT name, email, password FROM table WHERE field='".$_GET['field']."' LIMIT 1";
?>
Se alguém passar no parâmetro algo como ' OR 1=1 #, seu banco ficaria totalmente exposto, pois a string final seria modificada com uma condição que será sempre satisfeita.
SELECT name, email, password FROM table WHERE field = '' OR 1=1 #' LIMIT 1
Parabéns! Alguém acabou de pegar todos os registros de sua tabela. Para evitar esse tipo de ataque, é aconselhável usar a função mysql_real_escape_string. Ela faz o devido escape de caracteres potencialmente inseguros. A desvantagem é que você tem que fazer isso para cada um dos parâmetros que você vai passar, o que pode se tornar um pouco massante.
Então, passei para ele uma função que eu usava há algum tempo atrás.
<?php
/**
* @param string $query
* @param mixed $arg1, $arg2...$argN
*/
$QUERY = "";
function query($query)
{
global $QUERY;
$args = func_get_args();
$query = array_shift($args);
foreach ($args as $key => $arg) {
if (is_string($arg)) {
$args[$key] = mysql_real_escape_string($arg);
}
}
array_unshift($args, $query);
$query = call_user_func_array('sprintf', $args);
$QUERY = $query;
return mysql_query($query);
}
?>
Use a função acima da seguinte maneira:
<?php
$query = "SELECT name, email, password FROM table WHERE field='%s' LIMIT 1";
$resource = query($query, $_GET['field']);
while ($row = mysql_fetch_object($resource)) {
printf('<strong>%s:</strong> %s<br/>', $row->name, $row->email);
}
?>
Você pode passar quantos parâmetros precisar, seguindo as regras da função sprintf.
<?php
$query = "INSERT INTO table (amount, age, name) VALUES (%.2f, %d, '%s')";
$resource = query($query, 150, 27, 'Nando Vieira');
?>
Uma outra vantagem de usar a função acima é que se você esquecer de passar algum parâmetro que estava esperando receber, um erro será exibido. E de quebra você ganha uma variável global $QUERY com a última instrução executada.
Bug no Internet Explorer 7
26/10/06
Quer ver uma coisa bizarra? Sempre que preciso colocar uma imagem em um input "submit", uso o CSS abaixo:
input {
background: url(image.png) no-repeat;
border: none;
text-indent: -999px;
cursor: pointer;
width: 50px;
height: 50px;
/*
essas regras devem ser aplicadas
com um conditional comment, mas a título
de exemplo, vamos usar este hack.
*/
_padding: 9999px;
_overflow: hidden;
}

Funcionava perfeitamente no IE6 ou menor e no Firefox. Agora, sabe o que acontece quando tento acessar no IE7? Nada! Ele simplesmente não exibe o botão.
<html>
<head>
<title>IE7</title>
</head>
<body>
<form>
<input type="submit" value="Enviar" />
</form>
</body>
</html>

Mas olha que curioso. Se eu adicionar um elemento antes do botão, ele irá aparecer.
<body>
<form>
ABC<input type="submit" value="Enviar" />
</form>
</body>

Não adianta ter tags se elas não estiverem no mesmo nível do botão. Assim, o código abaixo também não exibirá nada.
<body>
<h1>Bug no IE7</h1>
<form>
<input type="submit" value="Enviar" />
</form>
</body>
Uma outra solução é colocar o CSS float: left.
Esse bug, no mundo real, provavelmente não iria acontecer já que um botão "submit" sozinho numa página não faz nenhum sentido. Mas que isso não faz dele menos bizarro, não faz mesmo! Se quiser ver os arquivos de exemplo, acesse a versão com bug e a versão funcionando.
