Problema: "Segurança no JAVA..."

Prezados Senhores da Lista, Bom Dia!!!

Pessoal estou com um prblema de Segurança no JAVA que desde então está me tirando o sono…

Tentei de várias maneiras para resolver meu problema,
antes mesmo de recorrer a ajuda deste FORUM.

Para mim está sendo muito complicado e já tentei de
tudo:

Tenho uma aplicação que está rodando em uma Máquina
Linux X Apache que deve conectar à uma máquina Windows
Rodando o SyBase (Banco de Dados).

Projeto:

O Browser chama um arquivo HTML que por sua vez aponta
para um Applet que está dentro de um “arquivo.jar”, a
partir do Applet “Menu” eu abro outras janelas/JFrame
como: Login, Cadastro, Pesquisa, Relatórios etc…

Até ai tudo bem, ou seja, o Applet é startado
perfeitamente na página HTML os JFrames estão sendo
executados perfeitamente, sem erros e sem problemas.

Existe nesse applet um menu que em uma de suas opções
existe um Ítem “Conectar”, à partir desse momento um
driver “jdbc:sybase” é iniciado apontando para a outra
Máquina onde se encontra o SyBase (Banco de Dados).

Se eu executar a Aplicação de dentro do JBuilder (Por
Exemplo) ela funciona perfeitamente, entretanto no
Browser não Executa, ocorrendo o seguinte erro:

java.security.AcessControlException: access denied
(java.net.SocketPermission 192.168.1.94:2638 accept,
resolve)

Esse problema só é resolvido caso eu altere o arquivo
“java.policy” em todas as máquinas que irão Executar a
Aplicação via HTML/Intranet, conforme abaixo:

Comentei a Linha ====> //permission
java.net.SocketPermission “localhost:1024-”, “listen”;

Adicionei a Linha ===> permission
java.net.SocketPermission “*”,
“listen,accept,connect”;

O grande problema: Conseguir executar a
Aplicação/Applet/JFrame sem precisar alterar o arquivo
“java.policy” nas Máquinas/Clientes que irão acessar o
mesmo.

Fico desde já muito agradecido pela ajuda de todos, gostaria
por gentileza, se possível um pequeno passo-a-passo de
como posso resolver este problema que o acredito, alguém já deve ter passado por isso. Já lí vários tutoriais, inclusive o da SUN,
em Português, em Inglês… Etc… Etc… Etc…

Somente dor de cabeça, a única solução foi alterar o
arquivo “java.policy” nas maleditas máquinas.

Sei que não é a solução, pois não faz sentido essa
alteração em todas as Máquinas Clientes.

Mais uma vez, muito obrigado desde já por sua ajuda.

Um grande abraço.

Olá blz? :grin:

cara em tudo isso q tu escreveu aki
tem um porem, vc disse Applet…

tenhu uma sugestão, ultilizar paginas em JSP
ondi a sun jah tratou de vários problemas relacionados
a segurança que os Applets apresentam

creio q com isso vc naum tera a necessidade de alterar
permissar de maquina alguma, pois os serviços são todos
executados pelo servidor de paginas, tornando mais seguro
todo o processo, ondi vc poderá acessar um banco de dados
que fica em outro servidor sem muita dor de cabeça :wink:

oq tu acha?

[]'s
Erko Bridee

Olá amigo Erko Bridee.

Muito obrigado por sua ajuda, entretanto, aqui nesta empresa, o uso de jsp, java-script, php… não é permitido, eles querem usar um aplet para que de dentro do mesmo, seja iniciada uma aplicação JFrame e a partir de então, acessar uma DataBase em uma outra máquina…

Sei é que no mínimo estupidez, uma vez que a solução seria o uso, claro, da codigicação JSP. Com base nessa necessidade e imposição por parte da empresa, é que estou muito preocupado em relação a solução usando as condições atuais em questão, ou seja: “tô ferrado”…

Andei estudando um pouco sobre RMI, entretanto, não consegui entender como acessar/compartilhar uma conexão JDBC “Banco de Dados” com a tecnologia RMI; E como montar um script para que o “Registry” e a classe “Server” seja automaticamente executada sempre pela máquina Servidor, para que em qualquer máquina “Client” a conexão “JDBC (Banco de Dados)” seja disponibilizada e assim, acessada por todos…

Fico muito agradecido por sua ajuda.

Um grande abraço.

Júnior

RMI, interessante
eu naum sei muito bem implementar comunicação entre
programas em java, mas teria a solução de
vc implementar um software de serviços de banco de dados
que ficaria na maquina Win que está rodando o banco de dados

e este programa ficasse esperando instruções do seu applet
e retornasse os resultados, por esse meio vc poderia tratar
a questão de segurança pois o seu applet naum estará acessando
o banco de dados ele mesmo
mas estará fazendo as requizições para um outro programa
pelo qual vc poderá tratar as questões devidas de segunça

com isso creio que o problema de vc liberar o acesso maquina a maquina naum será necessario( tenhu um pouco de duvida nisso, pq ainda num implementei isso em java com… )

mas seria algo assim, desenvolvimento em camadas de sw

cara se eu souber como implementar isso ou tiver um exemplo te
passo um link ou material,

mas as soluções que eu falei aqui com o povo
seria vc usar:
RMI, sockets ou Web Services :wink:

qq coisa me manda um mail, pra trocar mais ideias

erko@itaipu.com.br

[]'s
Erko Bridee

Obrigado mais uma vez…

Prezado amigo, é exatamente isso que eu estou precisando, ou seja: "Criar esse objeto para que ele possa fazer a troca de “solicitações X resultados” entre o “Banco de Dados X Aplicação (Applet e/ou JFrame)”.

Acredito que se conseguir fazer essa implementação e juntar tudo, o problema será resolvido. Eu consegui fazewr apenas um pequeno projeto usando RMI, que de uma lado: “Server” foi iniciado o serviço “registry” e em uma outra seção a classe “Server” e de uma outra máquina “Client” consegui obter os resultados, ou seja: “Conectei coma classe (Server)” que me retornou conforme a codificação: “Olá mundo”. Isso é perfeito, contudo, não consigo imaginar uma implementação voltada para a necessidade de retornar um Ponteiro/Objeto “ResultSet” como “Referência” e não como “Valor” com a ação executada no Banco de Dados (Select/Insert/Delete/Update…).

Não sei se isso é possível: “Retornar um objeto do tipo ResultSet”…

Se tiveres algum material que trate especificamente desse assunto, fico desde já muito abradecido por sua valiosa ajuda…

Um grande abraço.

Júnior

Junior,

Segundo teoria, sim, à partir do RMI, vc pode retornar um Objeto qualquer (seja ele uma simples String ou um ResultSet).

Me parece um tanto simples. Na página http://java.sun.com/j2se/1.5.0/docs/guide/rmi/hello/hello-world.html, tem um exemplo bem simples de implementação de HelloWorld “Cliente-Servidor”.

No seu caso, eu criaria uma classe com métodos de Consulta, Update, etc., conforme necessidades, recebendo uma String, que representaria sua consulta ou seu Update. No caso da Consulta, ele retornaria o ResultSet, que seria tratado no cliente. Seria basicamente uma classe para acesso ao banco.

Além de resolver o seu problema, isso fracamente acoplaria a base de dados ao seu programa, fazendo com que vc possa mudar de base de dados apenas mudando o driver JDBC no “Servidor” (Claro, utilizando SQL ANSI, para não ter que mudar as consultas no “Cliente” Applet). Essa é uma das vantagens do desenvolvimento em camadas, como mencionado anteriormente.

Bem, boa sorte ai. Espero que vc consiga.

Abraços

Ok, muito obrigado.

Farei exatamente conforme sua idéia e assim que tiver algum resultado “Positivo” te comunico imediatamente.

Abraços.

do site da sun em ingles
da uma olhadinha:

http://java.sun.com/developer/technicalArticles/RMI/rmi/

tem a ideia que estamos discutindo nesse tópico

[]'s
Erko Bridee

Junior,

Como Erko mesmo mencionou, outra idéia legal é utilizar WebServices. No caso, desenvolver um Webservice que retorna um Objeto (Ex: do tipo resultSet), necessitaria de algumas especificações no WSDL (Descritor do WS) de uso de retornos do tipo “Complexo” (ComplexType).

No JDeveloper, a criação de um WebService assim é um tanto simples, já, programando na mão, fica um pouco complexo! :grin:

Dá uma olhada neste link: http://otn.oracle.com/products/jdev/htdocs/handson/WebServices/HOS903WS.html

Nele está explicando como fazer para desenvolver um WebService que retora um um Complex Type no JDeveloper. Ele está usando um JDeveloper antigo, mas funciona também no novo. Os métodos do WebService que vão retornar o objeto vão ter que estar disponibilizado da mesma forma de um JavaBean (get<variável>).

Espero que ajude.

Abraços

oi !

Nao conheço a empresa que trabalha mas trabalho numa empresa que tem sempre que seguir as politicas de segurança / desenvolvimento corporativas…isso realmente é normal.

Mas quando caimos numa situação dessa geralmente deixamos claro e apresentamos a nossa solução e que se for de um outro conceito / caminho poderá surgir problemas, como este de segurança que vc esta dizendo.

Em todo caso a solução com WebServices tb é uma boa, outra alternativa é vc ver que tipo de tecnologia compete para o desenvolvimento Web(se for o caso) e se for outra tecnologia não sendo java, talvez seja mais viavel partir para ela…

Para a situação que vc detalhou acho pouco confortável a utilização de applets para isso, acessar base de dados via applets dá…mas tem várias coisas a considerar, desde a parte de segurança, viabilidade e flexibilidade.

Acho tb, que dependendo da quantidade de usuários, vc poderia desenvolver em Swing mesmo, nesse ponto acho que vc tem maior segurança do que via applet.

Espero ter ajudado !