Dúvida Cruel: Usar Jsp ou Servelt para

…Autenticar um usuario???
Tenho um sistema onde fiz a validação usando jsp, mas notei problemas de segurança no momento do redirecionamento para outras páginas. (problemas tais como o usuario conseguir acessar (caso ele soubesse os nomes e locais) páginas que não deva).
Gostaria de saber de vocês se usam jsp ou um servlet para validar usuario e senha (autenticação).

Muito obrigado…
Caio

opa!

acho q é melhor por servlets
no jsp vc tem o form q manda as informações pro servelt…
o servlet autentica ou nao… dependendo do resultado ele redireciona para a devida página…

agora, eu vo deixar uma duvida q me veio agora…
ao dar um submit num form para um servlet, os valores dos campos são enviados aos servlets…
poderia (ou há) uma falha de segurança do usuráio acessar o servlet direto na URL do browser passando como parametros o username e password…

como resolver tal problema?
tipo, um jeito do servlet aceitar valores só vindo de outra página, e nao por parametros de URL?

abraços!

Bom, não entendi bem como o seu sitema foi feito, mas se ele consegue acessar outras páginas apenas mudando a URL você tem problemas. Primeiro é preciso saber se o sistema bloqueia páginas dependendo do perfil do usuário. Se sim, a coisa é mais complicada. Mas a principio eu te digo o seguinte.

  • Se não vai usar EJB, use as páginas JSP apenas para fazer a camada visual (HTML), os dados que serão mostrados nesse JSP devem ser guardados em um javabean que deverá ser jogado na sessão por um Servlet.
  • Qualquer chamada ou envio de dados que esse JSP for fazer para o servidor encaminhe para um servlet.
  • Só mostre os JSPs por meio de Despacher através do servlet, assim não tem como o cara chamar o JSP direto. Basta verificar no JSP e no servlet se o bean está na sessão e se ela é valida.
    Se o cara digitar a URL do JSP direto não vai conseguir abrir. E se usar a url do servlet sem se logar o bean não estando na sessão fica facil de dizer ao usuário pra ele ir se catar.

Se não entendeu nada me avisa que explico com detalhes.

[quote=“DanielBadawi”]
como resolver tal problema?
tipo, um jeito do servlet aceitar valores só vindo de outra página, e nao por parametros de URL?
abraços![/quote]

Daniel eu estava escrevendo enquanto vc postava. Bom uma solução para isso seria mapear uma url para um servlet no web.xml da aplicação. Isso bastaria. Mas tambem tem outra maneira. Sendo a primeira página um JSP vc poderia instanciar um bean dentro do JSP ( mas ainda acho o mapeamento de url mais elegante) e seta-lo na sessão assim que o JSP for chamado. No servlet bastaria ver se esse mesmo bean está na sessão. Se não estiver você mostra a famosa mensagem: [color=“red”]“Sessão expirada”[/color]

quanto a acessar o servlet digitando os valores dos parametros na url

para evitar isso basta colocar no formulario html o atributo : method=“POST”

e no servlet q recebe o submit deixe o metodo doGet em branco

e coloque o codigo da autenticação somente no metodo doPost


quanto a acessar as paginas diretamente sem estar autenticado

sugiro que voce aprenda a trabalhar com filters (filtros)

valeu pela resposta cara!
ma nao entendi mto bem… vc poderia por favor explicar com mais detalhes?

valeu por responder tb Denis! :grin:

mas ja usei essa solução uma vez… mas achei q isso é meio gambiarra… ou nao??

abraços a todos

Bom dia,
Pelo que eu entendi, vc acha interessante usar jsp apenas visual e servlet para a maior parte da lógica neh? mas seguinte, tenho duas perguntinhas básicas pra lhe fazer:
1a - Vamos voltar ao ex. da autenticação, na hora que o usr submete seu login e senha para um servlet, este deverá construir a página seguinte (caso validação ok) ou retornar um erro, certo? Mas a construção de algumas páginas pode ser bastante dispendiosa, e vc passar muito tempo copiando e colando codigo html para dentro de servlets… Não existe uma forma de eu encaminhar o usuario para uma página (principal.jsp por ex.) mas sem que se consiga acessar esta página pela url???
2a - Eu usei javaBens meio q por obrigação pra lhe falar bem a verdade… onde javaBens poderia me ajudar nesta situação?

Valeu kra…

[quote=“caitiff-jVampire”]Bom, não entendi bem como o seu sitema foi feito, mas se ele consegue acessar outras páginas apenas mudando a URL você tem problemas. Primeiro é preciso saber se o sistema bloqueia páginas dependendo do perfil do usuário. Se sim, a coisa é mais complicada. Mas a principio eu te digo o seguinte.

  • Se não vai usar EJB, use as páginas JSP apenas para fazer a camada visual (HTML), os dados que serão mostrados nesse JSP devem ser guardados em um javabean que deverá ser jogado na sessão por um Servlet.
  • Qualquer chamada ou envio de dados que esse JSP for fazer para o servidor encaminhe para um servlet.
  • Só mostre os JSPs por meio de Despacher através do servlet, assim não tem como o cara chamar o JSP direto. Basta verificar no JSP e no servlet se o bean está na sessão e se ela é valida.
    Se o cara digitar a URL do JSP direto não vai conseguir abrir. E se usar a url do servlet sem se logar o bean não estando na sessão fica facil de dizer ao usuário pra ele ir se catar.

Se não entendeu nada me avisa que explico com detalhes.[/quote]

caiozanchetti

Pelo jeito você não conhece o método “getRequestDispatcher(String)” do ServletContext.
Respondendo a sua primeira pergunta é o seguinte. Você não tem que copiar html algum pra dentro do servlet. Isso éra feito a muitos anos atras antes de inventarem o JSP. Seria até burrice fazer isso. O que esse método que citei acima faz é incluir todo o código html do seu JSP dentro do seu servlet. Na verdade ele não inclui no servlet mas de qualquer forma quando você usa o despatcher ele joga o JSP na tela do usuário pelo servlet. A sessão criada no servlet e todos os objetos incluidos na mesma podem ser acessados no JSP. Isso resolve seu problema de esconder a URL. O código abaixo faz isso pra vc, se não entender pergunta:

//No método doPost você chama esse método como o código abaixo.
//Você pode passar o caminho fisico do JSP ou a URL dele, eu recomendo o caminho da URL

includeJSP( request, response, "/JSP/Login.jsp");

//Esse é o método que deve ser incluido no seu servlet ou até mesmo em um bean por exemplo para não reescrevelo em todos os seus servlets.

public void includeJSP(HttpServletRequest request, HttpServletResponse response, String jspName){
	RequestDispatcher dispatcher =  getServletContext().getRequestDispatcher(jspName);
	if (dispatcher != null)
	  dispatcher.include(request, response);
//Depois do include não pode haver envio de dados para o cliente. out.println() depois desse ponto nem pensar. Aqui ele envia o código HTML do jsp para o cliente e finish.
}  

Quanto a segunda pergunta, o javabean vai guardar os dados da página. No caso dessa página de login seria desperdicio pois um bean para guardar somente login e senha não compensa certo? Errado. Esse mesmo bean pode guardar todas as informações que você precisar. Porque não guardar o login do usuário tambem? Imagine que você precise desse login para verificar as permissões que ele tem acesso em um menu por exemplo. Vai precisar de um bean para guardar todas essas informação, e não precisa criar um bean só para isso. Use o mesmo bean das outras páginas ou crie um apenas para guardar informações de configuração do sistema. É um exemplo mas “…existem milhões de maneiras…”. Mas eu sou meio contra ao resto da frase que diz “invente a sua”. A maioria faz assim e eu acho que não precisar inventar outro jeito não. Sistema que não é EJB deve ser usado JSP Servlet e Javabeans. É o suficiênte. Mas nada se comparar a usar struts para resolver todo esse problema. Isso sem duvida é a melhor solução na minha opnião. Se precisar de ajuda avisa ae.

:idea:

voce pode colocar os JSPs dentro da pasta WEB-INF

eles estando dentro da pasta o usuario nao vai poder acessar digitando a url

e ai dentro do servlet voce pode fazer o requestDispatcher para umj jsp dentro dessa pasta

valeu pela resposta cara!
ma nao entendi mto bem… vc poderia por favor explicar com mais detalhes?
[/quote]

Daniel é meio extenso a explicação para mapear url. Mas se você procurar em qualquer tutorial de Servlet com tomcat você encontra isso que estou te dizendo. La tem como você configurar uma determinada url que se digitada é encaminhada para um servlet. Isso se chama filtro de url se não me engane. Agora não lembro de cabeça, mas naquelas tags XML que vai no arquivo web.xml você define um nome simples para um servlet sem ter que digitar todo o pacote por exemplo. Ali naquele mesmo lugar você faz esse mapeamento de URL. Alias se você olhar la ja tem alguns prontos quando se cria projetos Web por alguma IDE. Da uma procurada na net. Se eu achar mais tempo te passo um torial que explica isso. Agora to meio na correria vo fica devendo.

ahhhhhh ta… ja sei q q isso…
ja usei, mapeei umas 500 url na vida no web.xml…
devo ter me confundidocom o termo “mapear url pranao deixar acessar determinada area do site diretamente pela url”

mas mesmo assim, valeu por ajudar!
abraços!

Kra seguinte,
já usei este método porem com o objeto retornado usei o metodo forward(solic, resp) que encaminha pra uma determinada pagina…
o include não conhecia…
Mas mesmo assim lhe faço uma pergunta: como fica se o kra digitar na url /jsp/Login.jsp como vc citou? Ele não vai conseguir acessar esta pagina?

[quote=“caitiff-jVampire”]caiozanchetti

Pelo jeito você não conhece o método “getRequestDispatcher(String)” do ServletContext.
Respondendo a sua primeira pergunta é o seguinte. Você não tem que copiar html algum pra dentro do servlet. Isso éra feito a muitos anos atras antes de inventarem o JSP. Seria até burrice fazer isso. O que esse método que citei acima faz é incluir todo o código html do seu JSP dentro do seu servlet. Na verdade ele não inclui no servlet mas de qualquer forma quando você usa o despatcher ele joga o JSP na tela do usuário pelo servlet. A sessão criada no servlet e todos os objetos incluidos na mesma podem ser acessados no JSP. Isso resolve seu problema de esconder a URL. O código abaixo faz isso pra vc, se não entender pergunta:

//No método doPost você chama esse método como o código abaixo.
//Você pode passar o caminho fisico do JSP ou a URL dele, eu recomendo o caminho da URL

includeJSP( request, response, "/JSP/Login.jsp");

//Esse é o método que deve ser incluido no seu servlet ou até mesmo em um bean por exemplo para não reescrevelo em todos os seus servlets.

public void includeJSP(HttpServletRequest request, HttpServletResponse response, String jspName){
	RequestDispatcher dispatcher =  getServletContext().getRequestDispatcher(jspName);
	if (dispatcher != null)
	  dispatcher.include(request, response);
//Depois do include não pode haver envio de dados para o cliente. out.println() depois desse ponto nem pensar. Aqui ele envia o código HTML do jsp para o cliente e finish.
}  

Quanto a segunda pergunta, o javabean vai guardar os dados da página. No caso dessa página de login seria desperdicio pois um bean para guardar somente login e senha não compensa certo? Errado. Esse mesmo bean pode guardar todas as informações que você precisar. Porque não guardar o login do usuário tambem? Imagine que você precise desse login para verificar as permissões que ele tem acesso em um menu por exemplo. Vai precisar de um bean para guardar todas essas informação, e não precisa criar um bean só para isso. Use o mesmo bean das outras páginas ou crie um apenas para guardar informações de configuração do sistema. É um exemplo mas “…existem milhões de maneiras…”. Mas eu sou meio contra ao resto da frase que diz “invente a sua”. A maioria faz assim e eu acho que não precisar inventar outro jeito não. Sistema que não é EJB deve ser usado JSP Servlet e Javabeans. É o suficiênte. Mas nada se comparar a usar struts para resolver todo esse problema. Isso sem duvida é a melhor solução na minha opnião. Se precisar de ajuda avisa ae.[/quote]

Vai poder acessar sim, mas você pode verificar se o bean está na sessão. Você pode usar scriplet ou fazer de outra forma, usando taglib por exemplo, ou criando um JSP só com um scriplet que faz isso e vai dando include desse JSP nos outros. Se o bean for nullo com certeza o cara não se logou ou a sessao expirou então manda a mensagem pra ele. Nesse esquema você tem que fazer esse tipo de verificação em todos os JSPs. Uma maneira mais simples de resolver isso seria por exemplo, mapear a url da pasta de JSP para ser encaminhada para outro endereço. Assim toda vez que o cara digitar o caminho da pasta onde estão os jsps você manda ele para outro lugar. Mas dai você não vai poder usar JSP sem usar o servlet e o dispatcher.