Mostrando postagens com marcador ADOdb. Mostrar todas as postagens
Mostrando postagens com marcador ADOdb. Mostrar todas as postagens

terça-feira, 5 de fevereiro de 2008

Segurança: Detecção de intrusão no Ubuntu 7.10 (Gutsy Gibon)

Para você que deseja instalar detecção de intrusão ou tentativas de acesso indevido, foi publicado no howto-forge um guia de como fazê-lo utilizando o MySQL, Apache2, Snort e o Base.

quinta-feira, 17 de janeiro de 2008

Restringindo seus usuários a um único login por vez.

Quantas vezes você precisou criar uma aplicação ou até mesmo um site onde o usuário só possa estar logado num único lugar por vez evitando o compartilhamento de usuário/senha?

Este tipo de situação pode ocorrer facilmente quando você está desenvolvendo uma aplicação.

Após este tipo de dificuldade ter aparecido, resolvi criar uma classe em PHP para resolver este problema.

Nesta classe, considerei as seguintes hipóteses:
  1. O usuário efetua o login e fecha o navegador sem efetuar o logout.
  2. O usuário efetua o login em uma máquina e repassa seus dados de conexão para terceiros que o utilizam no momento em que ele está logado e usando o sistema.
  3. Evitar roubo de sessão.
As respostas a cada uma dessas hipóteses, foram dadas da seguinte forma:
  • Quando o usuário efetuar um novo login, este irá desconectar todas as sessões existentes (ítens 1 e 2 acima). Afinal uma pessoa não pode estar em dois lugares ao mesmo tempo.
  • Criar um token de sessão que possa ser verificado com base em alguns dados fixos (por exemplo o id de usuário no sistema ou o seu nome), dinâmicos (id de sessão, endereço ip) e variáveis (como a senha do usuário).
  • Geração do id de sessão de tempos em tempos.
  • Duração da sessão com tempo fixo.
  • Garbage collection para as sessões.
Tendo isto tudo em mente, arquitetei a solução baseada em banco de dados para armazenar todos os dados referentes ao gerenciamento das sessões.

E, para um reaproveitamento de código e interdependência de banco de dados, utilizei o AdoDB. Assim, a mesma classe pode ser utilizada tanto com MySQL quanto PostgreSQL ou qualquer outro banco suportado pela AdoDB.

Após isto tudo, codifiquei minha classe. Em cada página instanciei-a e chamo apenas um método que faz todas as verificações. Caso uma delas não seja satisfeita, o usuário pode ser redirecionado para uma página de login, por exemplo, indicando o motivo pelo qual o login está sendo requisitado.

Em sua aplicação, como você tem feito para controlar múltiplos logins de um mesmo usuário?

MySQL & Store Procedures: Uma maneira de recuperar os múltiplos resultados.

Para quem não usa o ADOdb, pode utilizar este trecho de código disponibilizado pelo Peter Brawley no fórum de PHP no site do MySQL.

A recomendação é que seja utilizado o driver MySQLi ao invés do MySQL tradicional.

Da maneira tradicional, não há possibilidade de recuperarmos o resultado de parâmetros de retorno (OUT) utilizados nas store procedures, além da possibilidade de recebermos mensagens de erro como Procedure mySP can't return a result set in the given context.

Estas limitações não acontecem no driver MySQLi.

domingo, 30 de dezembro de 2007

ADOdb, Store procedures em MySQL e problemas.

Outro dia, deparei-me com alguns problemas ao utilizar o ADOdb. Criei algumas stored procedures (sp's) no banco de dados (MySQL) e ao chamá-las através do ADOdb, algumas mensagens de erro eram retornadas.

A primeira delas retornava a seguinte mensagem de erro:

Procedure mySP can't return a result set in the given context.

Referia-se a CLIENT_MULTI_RESULTS estar desabilitada. Como a sp executa comandos e estes produzem mais de uma saída na tela, o ADOdb trata-os como sendo mais de um RecordSet. Após algum tempo pesquisando, encontrei a maneira correta de fazê-la:

$flags = 131074;
$dsn = "mysql://user:$pwd@localhost/mydb?persist&clientflags=$flags";
$conn = ADONewConnection($dsn);

Em seguida veio outra mensagem:
Commands out of sync

Esta refere-se à execução da SP. Para resolver, configure a variável global $ADODB_COUNTRECS para FALSE.

Há duas maneiras para resolver.

1. No caso de apenas o primeiro grupo de registros interessar a você, você pode descartá-los usando o método Close() da conexão (esta não é a maneira mais elegante mas resolve).

2. Chamar o método NextRecordSet() para recuperar o próximo conjunto de resultados e dar o devido tratamento ao próximo grupo de registros.

Estas foram as principais dificuldades que encontrei até agora ao utilizar sp's junto ao MySQL com o ADOdb. Alguém mais tem alguma situação com outro SGBD utilizando o ADOdb que queira compartilhar conosco?