Visite também: Currículo ·  Efetividade BR-Mac

O que é LinuxDownload LinuxApostila LinuxEnviar notícia


Servidor web em C para estudo

“Publiquei em me blog o código fonte de um servidor WEB que utilizamos para fazer um trabalho acadêmico. Quero compartilhar com todos para que possa auxiliar em seus estudos também.
“Nesse primeiro ano na faculdade tivemos um trabalho em grupo que consistia em criar um servidor WEB utilizando a linguagem C. Este servidor deveria ser capaz de responder a uma requisição GET e mostrar as páginas e arquivos solicitados e também retornar erros de acordo com o que não fosse encontrado.””

Enviado por Jean Carlos O. Guandalini (jeanΘjeanguandalini·com) – referência (jeanguandalini.com).


• Publicado por Augusto Campos em 2008-12-02

Comentários dos leitores

Os comentários são responsabilidade de seus autores, e não são analisados ou aprovados pelo BR-Linux. Leia os Termos de uso do BR-Linux.

    geek (usuário não registrado) em 2/12/2008 às 6:47 pm

    Impressão minha ou esse código ta bugado (stack overflow) ?

    Tem várias funções utilizando sprintf sem checagem de tamanho do buffer origem.

    Algum hacker ae poderia esclarecer?

    Limao (usuário não registrado) em 2/12/2008 às 6:54 pm

    Assim, para um trabalho de primeiro de faculdade ser um servidor WEB escrito em C, e que funcione(não testei), realmente, eu não estou interessado se possui bugs de overflow, pq, MEODEOS, é uma coisa respeitável fazer um trabalho desses.
    E como ele mesmo disse, é um trabalho acadêmico, para estudos. Acho que um “hacker” poderia gastar o seu tempo com coisas mais interessantes que achar bugs assim.
    Só posso lhe parabenizar Jean!

    meujoystick (usuário não registrado) em 2/12/2008 às 7:10 pm

    Parabéns! Vou dar uma olhada no código. Eu já penei para usar sockets para fazer um chat em C, imagino o quanto você deve ter ralado!

    Monge (usuário não registrado) em 2/12/2008 às 7:14 pm

    Impressiona é o tamanho do código: muito pequeno! – nunca imaginei que um servidor web pudesse ter esse tamanho.

    parabéns!

    Adelar da Silva Queiróz (usuário não registrado) em 2/12/2008 às 8:31 pm

    Parabéns pela iniciativa. Também foi bom por colocá-lo em uma página que não possui blog no endereço, pois essas são bloqueadas nas faculdades e universidades públicas (o que acontece, por exemplo, aqui no Paraná).
    []‘s

    zer0c00l (usuário não registrado) em 2/12/2008 às 9:41 pm

    geek seu traseiro está com buffer overrun.

    Pierre (usuário não registrado) em 2/12/2008 às 9:46 pm

    Eu baixei o código. Os guris estão de parabens pelo trabalho e por compartilhar conosco.

    abraços.

    kayo (usuário não registrado) em 2/12/2008 às 11:03 pm

    boa!

    Leandro Hamid (usuário não registrado) em 2/12/2008 às 11:05 pm

    É Geek você tentou desmerecer o trabalho do cara mas não deu não…Parabéns Jean pelo trabalho!!!!

    Jean Carlos (usuário não registrado) em 3/12/2008 às 3:04 am

    Obrigado pelos comentários pessoal, nesse curso que faço, temos somente uma noção básica da programação C, e nesse trabalho tivemos muito o que pesquisar. Uma preocupação que tive foi comentar muito o código para que qualquer pessoa possa entender o que cada linha faz. Mas realmente serve somente para estudos, para uso em produção precisaria de uma revisao do código por alguém mais experiente na área de C.

    douglas(cronnosli) (usuário não registrado) em 3/12/2008 às 9:25 am

    Já pensou em publicar este código sob a GPL, pois assim vc garante que ele será livre para ser estudado, garante a autoria e garante que ninguem ou nenhuma empresa registre esse codigo e te processe!

    Olha lá, quem sabe um dia isso num fica melhor que Apache!

    John Doe (usuário não registrado) em 3/12/2008 às 11:26 am

    @geek: Achou problema no código? Corrige e publica aqui para ajudar o Jean a melhorar o trabalho dele. ;)

    Anthony Collucci (usuário não registrado) em 3/12/2008 às 11:28 am

    @Geek,

    Consegue escrever algo melhor? Publique! Cada uma!!! :s

    Jean Parabens pela iniciativa!

    flw

    geek (usuário não registrado) em 3/12/2008 às 11:54 am

    Pessoal, vocês não entenderam, eu não estava criticando o trabalho do Jean que é louvavel e sim tentando alerta-lo sobre possíveis problemas lógicos na implementação do código.

    Consegui travar o servidor, vejam abaixo:

    Inicializando servidor CesuRedes WebServer v1.0…[OK]
    Falha de segmentação
    root@filipe-laptop:/home/filipe# telnet localhost 85
    Trying 127.0.0.1…
    telnet: Unable to connect to remote host: Connection refused

    Para reproduzir esse resultado, experimentem mandar uma requisição qualquer sem usar GET :D

    Ou seja, consegui realizar o ataque de negação de serviço.
    Muito possivelmente conseguiria-mos um root na máquina que estivesse rodando esse servidor, bastanto codar um exploit que
    realize algo mais interessante que um DOS, como executar o /bin/bash por exemplo ;)

    Não me entendam mal, sou um geek, eu não conseguiria ver um código bugado e não falar nada :)

    Jean (usuário não registrado) em 3/12/2008 às 1:27 pm

    Caro amigo geek, muito obrigado por explicar um dos bugs, por milagre consegui arrumar, pois não sou tão bom assim em programação. No site agora tem a versão com a correção.

    pm (usuário não registrado) em 3/12/2008 às 1:53 pm

    pq brasileiro entende sinceridade ou critica como ataque ? Será a famosa sindrome do vira-lata ?

    pm# (usuário não registrado) em 3/12/2008 às 1:55 pm

    parabens jean e geek…

    Wallacy (usuário não registrado) em 3/12/2008 às 2:33 pm

    Muito legal o projeto…. E novamente mais um post cheio de “faz melhor então” rs…

    Imagina se o pessoal do Ubuntu, SUSE, Mandriva, etc.. Abandonassem suas bugzillas dizendo: Se tem bug vc que arrume rs…

    E não é porque é um projeto acadêmico que ele tem que ser tratado como exceção não é? Pelo menos onde eu estudo simplesmente usar o while para fazer um serviço de um for já é o suficiente para perder 10% da questão rs…

    —–

    To dando uma olhada no projeto, muito bacada porém você está esquecendo tornar algumas coisas dependentes das verificações de erro… Por exemplo:

    if((sWebServer = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    Se retornar erro ainda assim ele executa:

    if(listen(sWebServer, CONPEND) < 0)

    Hora, se ele não conseguiu criar o socket, obviamente vai dar erro no listen… Logo essa verificação deveria ficar condicionada a anterior…

    E por ser tratar de um webserver, quanto menos operações desnecessárias fizer melhor! E no caso, esse tipo de erro pode causar um travamento repentino na server caso o socket retorne erro. Afinal com erro ou não ele ainda entra no loop infinto: while(1).

    Fica ai mais uma dica!

    Noob (usuário não registrado) em 3/12/2008 às 2:48 pm

    Parabéns ao Jean pelo trabalho e ao Geek pelo alerta!

    Jean (usuário não registrado) em 3/12/2008 às 3:43 pm

    Wallacy, obrigado pela dica, nessa verificação do if que você comentou, tem uma função logo abaixo dela assim:

    saidaErro(“Nao foi possivel criar o socket. ”);

    Nessa função ele tem um exit, daí não chega a entrar no outro if do listen.

    Sobre o while, me falaram mesmo que o mais certo seria utilizar o for, nesse caso você poderia me indicar qual a melhor maneira para esse tipo de loop?

    Obrigado

    meujoystick (usuário não registrado) em 3/12/2008 às 4:15 pm

    Como são as coisas… Hoje tive que fazer um trabalho de envio e recebimento de arquivos usando socket. Acabei encontrando um código muito parecido com o seu no livro Sistemas Distribuidos – Desenvolvendo Aplicações de Alta Performance no Linux. pag. 283 para ser mais exato. Mesmo assim, valeu por compartilhar seu codigo.

    kayo (usuário não registrado) em 3/12/2008 às 10:47 pm

    Eu acho que isso poderia ir para um sourceforge e virar um projeto interessante heim :) coloquem! coloquem!

    Wallacy (usuário não registrado) em 4/12/2008 às 2:47 pm

    Jean,

    Nem tinha visto o exit… Foi só uma olhada superficial mesmo.

    Sobre o while… Bem, considerando então a função “saidaErro”, o que você pode fazer por precação é estimar um limite de de “tempo” de espera, caso exista algum problema, mesmo causado por “problemas” externos ao seu programa, você sabe vai ter a segurança de que ele ira se alto finalizar. Estipule um “timeout”… ou algo assim…

Este post é antigo (2008-12-02) e foi arquivado. O envio de novos comentários a este post já expirou.