Squid logando usuários em aplicações web

fba

Testei as mais diversas formas de autenticação de usuários no Squid, mas cheguei a conclusão de que gostaria de usar a minha própria lista de usuários e senhas contidas na aplicação web que estou desenvolvendo. A partir daí criei meu próprio método de autenticação, baseando-me no código-fonte do smb_auth.

[ Hits: 19.181 ]

Por: Fábio em 10/08/2006


A aplicação



Como já havia comentado, não sou programador em C, então estejam livres para fazerem as mudanças que acharem necessárias na aplicação para que ela se torne mais robusta ;)

Abaixo segue o seu código fonte, como compilar e como usar.

#include <stdio.h>
#include <netdb.h>

//define o tamanho máximo para os parâmetros enviados
#define BUFPARAMETRO 250
//define o tamanho máximo para os texto de retorno, se o tamanho do retorno for superior ele trunca o texto
#define BUFRETORNO 2500

#include <string.h>


/*desenvolvido por FBA - Fábio Adriél Beckert
copiado e alterado de acordo com as necessidades
do smb_auth.c que vem junto com o Squid

para compilar digitar no shell

gcc -o http_auth http_auth.c

para usar

echo "usuário senha" | http_auth "Host do servidor" "Porta do servidor" "Arquivo no servidor" "Nome do parâmetro usuário" "Nome do parâmetro da senha" "Parte do texto do retorno do servidor se o usuário for valido" "nodebug"

configurar no squid.conf para que ele use o http_auth
enviar como parâmetro o nome do usuário e  a senha

*/




int
main(int argc, char *argv[])
{

    char *s;
    char *user;
    char *pass;
    char buf[BUFPARAMETRO];
    char buft[BUFRETORNO];
    char bufl[100];
    int i;

    char url [BUFPARAMETRO];
    int fd;
    struct sockaddr_in addr;
    struct hostent *hostPtr;

    if (setvbuf(stdout, NULL, _IOLBF, 0) != 0)
   return 1;

   while (1) {

   if (fgets(buf, BUFPARAMETRO, stdin) == NULL)
       break;
   if ((s = strchr(buf, '\n')) == NULL)
       continue;
   *s = '{TEXTO}';

   if ((s = strchr(buf, ' ')) == NULL) {
       (void) printf("ERR\n");
       continue;
   }
   *s = '{TEXTO}';

   user = buf;
   pass = s + 1;



//se o host não for encontrado retorna erro
if ((hostPtr = gethostbyname(argv[1])) == 0)
(void) printf("ERR\n");

// estabelece a conexão
bzero((void *) &addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = ((struct in_addr *)(hostPtr->h_addr))->s_addr;
addr.sin_port = htons((short) atoi(argv[2]));


if((fd = socket(AF_INET,SOCK_STREAM,0)) == -1)
(void) printf("ERR\n");
if( connect(fd,(struct sockaddr *)&addr,sizeof (addr)) < 0)
(void) printf("ERR\n");

// envia GET para o servidor web
url[0] = '{TEXTO}';
strcat(url,"GET ");
strcat(url,argv[3]);
strcat(url,"?");
strcat(url,argv[4]);
strcat(url,"=");
strcat(url,user);
strcat(url,"&");
strcat(url,argv[5]);
strcat(url,"=");
strcat(url,pass);
strcat(url," HTTP/1.0\r\n\r\n");
write(fd,url , 1 + strlen(url));
//lê o conteúdo de retorno
buft[0] = '{TEXTO}';
do{
i = read(fd,bufl,100);
bufl[i] = '{TEXTO}';
//se o tamanho do texto de retorno estourar o tamanho do buf trunca o retorno
if(strlen(buft)+strlen(bufl) > BUFRETORNO ){break;}
strcat(buft,bufl);
}while (i > 0);


//verifica se existe o texto de validação no conteúdo de retorno
if(strstr(buft,argv[6]) != NULL){
(void) printf("OK\n");
}
else
(void) printf("ERR\n");


if(strstr("debug",argv[7]) != NULL) {
char separador[] = "--------------------------------------------------------------------------------\n";
(void) printf("%s[TEXTO ENVIADO PARA O SERVIDOR]\n%s\n%s[TEXTO RECEBIDO DO SERVIDOR]\n%s\n%s",separador,url,separador,buft,separador);
}

//zera as variáveis para a próxima requisição
close(fd);
buf[0] = '{TEXTO}';

}
    return 0;
}

Copie o fonte da aplicação para um editor de texto, salve em qualquer diretório com o nome http_auth.c, depois em modo texto digite no diretório onde o arquivo fonte se encontra:

$ gcc -o http_auth http_auth.c

Se tudo ocorrer de forma correta, um arquivo binário com nome http_auth será gerado no diretório em questão.

Para testar:

echo "usuário senha" | http_auth "Host do servidor" "Porta do servidor" "Arquivo no servidor" "Nome do parâmetro usuário" "Nome do parâmetro da senha" "Parte do texto do retorno do servidor se o usuário for valido" "nodebug"

Exemplo:

$ echo "eu minhasenha" | http_auth "localhost" "80" "/login.php" "User" "Passwd" "logado123" "nodebug"

No exemplo a resposta do servidor deve conter em alguma parte do texto o termo "logado123", caso o login tenha sido efetuado com sucesso, altere o parâmetro "nodebug" para "debug" para saber o que está sendo enviado e o que está sendo recebido pela aplicação.

Página anterior     Próxima página

Páginas do artigo
   1. A história
   2. A aplicação
   3. Integrar a aplicação com o Squid
Outros artigos deste autor

JSP acessando MySQL usando JSTL e EL

Leitura recomendada

Gerenciando pacotes para C/C++ com Conan

TORCS – Instalação e criação de um bot simples

Comando MAKE

Mais sobre recursividade em C/C++

Dynamic libraries com libtool

  
Comentários
[1] Comentário enviado por fba em 10/08/2006 - 15:28h

Na hora de colocarem o codigo fonte ficou bugado devido a ser caractere especial, então onde esta escrito {TEXTO} no fonte da aplicacao substituam por \ 0 (sem o espaco entre os dois caracteres, tive que colocar o espaco se nao ele não mostra os caracteres no site, algum bug, vou dar uma prosiada com o mantenedor do site pra ele arrumar hehehe)


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts