Bloqueio de Bad User Agent via htaccess ou httpd.conf

Notei diversos atauqes a servidores usando os identificadores “Mozilla/3.0 (compatible; Indy Library)” , “HTTP Client“, “libwww” e “havij” então decidí bloqueá-los permanetntemente, no meu caso useu a configuração diretamente no httpd.conf do servidor, mas também pode ser realizado via .htaccess

 

SetEnvIfNoCase User-Agent ^Mozilla.*Indy badUA
SetEnvIfNoCase User-Agent "HTTP Client" badUA
SetEnvIfNoCase User-Agent ^.*Havij badUA
SetEnvIfNoCase User-Agent "libwww-perl" badUA
Order Allow,Deny
Allow from all
Deny from env=badUA

Algumas informações que achei na net:

Indy Library – Normalmente essas requisições vem de suites de ferramentas da borland para delfi/c++
HTTP Client – Requisições genericas
libwww – Vem da lib Perl::LWP (Library for WorldWideWeb in Perl)
Havij – Ferramenta para testes de segurança em websites, usado normalmente para ataques via sql injection (em breve um post sobre a ferramenta)

———————————————-
Posted Listening: “Doctor Doctor – UFO”

Descendo ips invalidos via /sbin/ip

Ambiente Operacional: CentOS

Hoje ocorreu um problema de IP conflitante, porém ao executar /sbin/ifconfig não existia no servidor o IP que eu estava procurando.

Depois de muito fuçar no servidor, rodei o /sbin/ip e lá estava o IP como eth1 secundário.

Depois de um bocado de leitura do man (não estava disponível via shell, achei online) achei o comando pra descer a interface via ip

ip addr del 189.xx.xx.xx/24 dev eth1

A única ressalva é que o formato do ip tem que estar exatamente igual ao executar/sbin/ip addr dhow

———————————————-
Posted Listening: “Cliffs of Dover – Eric Johnson”

Tabela de cores em HTML

Essa é pra quem fica perdido na hora de inserir uma cor via style ou css, possui os códigos e os exemplos de cada cor, o que torna visualmente fácil a escolha =D

http://www.cultura.ufpa.br/dicas/htm/htm-cor1.htm

———————————-
Atualização 15/08/2012
Mais um link com tabela de cores:

http://www.mxstudio.com.br/Conteudos/Dreamweaver/Cores.htm

Lista de Mobile User Agents

O site abaixo contém uma lista bem completa de user agent usado por dispositivos móveis, na maioria celulares.

http://www.zytrax.com/tech/web/mobile_ids.html

Se deseja parsear o site e obter uma lista limpa, pode usar o código abaixo que é disponibilizado no próprio site

$page = file_get_contents('http://www.zytrax.com/tech/web/mobile_ids.html');
preg_match_all('/<(p(?:re)?)[^>]*class="g-c-[ns]"[^>]*>(.*?)</1>/s', $page, $m);

$agents = array();
foreach($m[2] as $agent) {
  $split = explode("n", trim($agent));
  foreach($split as $item) {
    $agents[] = trim($item);
  }
}
// $agents now holds every user agent string, one per array index, trimmed
foreach($agents as $agent) {
 echo($agent."n");
}

———————————————-
Posted Listening: “Starbreaker – Judas Priest”

Deletar tags com pouco ou nenhum uso no wordpress

Os comandos SQL abaixo deletam tags que estajam referenciadas em menos de 10 posts:

DELETE FROM wp_terms WHERE term_id IN (SELECT term_id FROM wp_term_taxonomy WHERE count < 10 );
DELETE FROM wp_term_taxonomy WHERE term_id not IN (SELECT term_id FROM wp_terms);
DELETE FROM wp_term_relationships WHERE term_taxonomy_id not IN (SELECT term_taxonomy_id FROM wp_term_taxonomy);

Para deletar com referencia em mais (ou menos) posts, basta efetuar ajuste na primeira linha do código acima

———————————————-
Posted Listening: “You Give Love a Bad Name – Bon Jovi”

Reduzir consumo de memoria do firefox

Enquanto o firefox7 e sua prometida “limpeza” no código de javascript para redução do consumo de memoria não saem de projeto, esse plugin quebra bem o galho.

https://addons.mozilla.org/pt-BR/firefox/addon/memory-fox/

Não espere milagres, mas tenho notado uma certa diferença =)

———————————————-
Posted Listening: “Nothing =(”

Inserindo tags automaticamente no wordpress

Esyte plugin usa uma API do yahoo para obter as palavras relevantes do post e automagicamente insere essas tags no post
Uso e recomendo!

Link: http://josh-fowler.com/?page_id=230

———————————————-
Posted Listening: “The number of the Beast – Iron Maiden”

 

Método para validar erros em expressões regulares

Em um determinado momento, tive a necessidade de efetuar validações em expressões regulares inseridas pelo usuário em textbox.

Abaixo segue método que eu utilizei para esta validação:

function validaRegex($regex, $escapar=false)
	{
		if($escapar) $regex = str_replace('/', '/', addslashes($regex));
		$teste = null;
		ini_set('track_errors', 1);
		$teste = @preg_match("/{$regex}/", "<a href="http://$1" target="_blank">[LINK]</a>", $teste);
		$ret = @strip_tags($php_errormsg);
		ini_set('track_errors', 0);
		$r = explode(':', $ret);
		return ($ret) ? array(false, trim($r[1])) : Array(true);
	}

Para explicar o funcionamento:
A variável $teste  (sim, faltou criatividade) recebe o resultado do preg_match, sendo que este recebe no primeiro parametro o valor digitado pelo usuário e o segundo parametro pode ser qualquer porcaria que vier em mente, já que o que nos interessa é se o regex do usuário tem erro ou não

O retorno é um array, sendo que a posição [0] retorna True ou False, e, havendo erro  no regex, a posição [1] retorna a mensagem de erro do php

———————————————-
Posted Listening: “Lights Out – UFO”

Trabalhando com triggers (insert, update delete)

Eu utilizava um rotina em php para sincronizar duas tabelas, ela rodava via cron uma vez por hora, porém isso me gerava um certo incômodo, pois as mesmas mensuravam espaço em disco em disco de alguns servidores e as vezes precisava dos dados na hora.

Até que uma hora resolví deixar a preguiça de lado e fazer de uma forma decente, via trigger.

Deixo aqui compartilhado as trigger que criei, aonde podem ser utilizadas como exemplo para after insert, after update e after delete:

After Insert:

DELIMITER $$
CREATE DEFINER=CURRENT_USER TRIGGER sincroniza_backup AFTER INSERT ON tabela_origem
  FOR EACH ROW BEGIN
    INSERT INTO tabela_destino SET
	id 				= NEW.id_servidor,
	nome			= NEW.nome_servidor,
	particao		= NEW.particao,
	tamanho			= NEW.tamanho,
	ocupado			= NEW.ocupado,
	livre			= NEW.livre,
	percentualUso	= NEW.percentual_uso;
  END;
$$
DELIMITER ;

Aqui o parametro NEW, recebe os dados da row afetada pelo insert executado

Para after update:

DELIMITER $$
CREATE DEFINER=CURRENT_USER TRIGGER sincroniza_backup_update AFTER UPDATE ON tabela_origem
  FOR EACH ROW BEGIN
    UPDATE tabela_destino sb SET
	sb.nome			= NEW.nome_servidor,
	sb.ocupado		= NEW.ocupado,
	sb.livre			= NEW.livre,
	sb.percentualUso	= NEW.percentual_uso,
	sb.testeEmail	= NEW.teste_email
	WHERE sb.nome=NEW.nome_servidor AND sb.particao=NEW.particao;
  END;
$$
DELIMITER ;

Mais uma vez o parametro NEW recebe os dados da tabela de origem (as rows afetadas pelo update)

Esse é um pouco diferente, o after delete

DELIMITER $$
CREATE DEFINER=CURRENT_USER TRIGGER sincroniza_backup_delete AFTER DELETE ON servidor_backup
  FOR EACH ROW BEGIN
    DELETE FROM ServidorBackup WHERE
	nome=OLD.nome_servidor AND particao=OLD.particao;
  END;
$$
DELIMITER ;

Nesse caso o valor que as rows deletas continham vão pro OLD

Agora o bonus stage:
Para deletar uma trigger

DROP TRIGGER sincroniza_backup_update;

———————————————-
Posted Listening: “Schools Out – Alice Cooper”