Avatar billede faded Nybegynder
28. oktober 2005 - 15:15 Der er 32 kommentarer og
1 løsning

Sikkerhed i app kørende lokalt

Jeg er ved at lave en app, der checker hos et website, om der er kommet post. Post systemet er lavet i mysql. Er det usikkert at lave database forbindelsen fra programmet, direkte til websitet's database ?
Avatar billede arne_v Ekspert
28. oktober 2005 - 15:21 #1
hvis du skriver database passwordet i koden (d.v.s. at det ikke skal indtastes
af brugen) så kan alle der får applikationen se det med minimal indsats

hvis det er OK eller hvis password skal indtastes af brugeren hver gang
så er det vel ikke mere usikkert end de fleste andre post programmer

mange web hoteller tillader ikke direkte adgang til database udefra

og hvis det er et firma tror jeg godt at du kan regne med at jeres
firewall administrator nedlægger veto
Avatar billede faded Nybegynder
28. oktober 2005 - 15:35 #2
Database password og username kommer til at stå direkte i koden, altså noget i retning af Connection con = driverManager.getConnection(jdbc:mysql,"pass","user");, det mener jeg er et sikkerhedsproblem
Avatar billede arne_v Ekspert
28. oktober 2005 - 15:37 #3
ja - alle som får app kan nemt finde det
Avatar billede faded Nybegynder
28. oktober 2005 - 15:40 #4
Hvad hvis man lavede en exstra tabel, der var identisk med login tabellen, og kun dem der blev autoriserede brugere,  ville få forbindelses strengen, fra databasen, altså at jdbc:mysql,"pass","user" bliver tildelt ved runtime
Avatar billede faded Nybegynder
28. oktober 2005 - 15:42 #5
denne exstra tabel skulle ligger på en helt anden database
Avatar billede arne_v Ekspert
28. oktober 2005 - 15:48 #6
jeg kan ikke umiddelbart se at du det skulle gøre det bedre

kan man ikke bare connecte til den tabel og hente og så connecte igen efter at man har
decompilet applikationen ?
Avatar billede faded Nybegynder
28. oktober 2005 - 15:49 #7
Det forstår jeg ikke helt, gider du at uddybe det ?

kan man ikke bare connecte til den tabel og hente og så connecte igen efter at man har
decompilet applikationen ?
Avatar billede faded Nybegynder
28. oktober 2005 - 15:51 #8
Kunne man ikke ligge database connection stregen i en krypteret fil
Avatar billede arne_v Ekspert
28. oktober 2005 - 15:53 #9
java kan decompiles så baser din sikkerhed på at brugerne af applikationen
kender source koden

en anden tabel eller noget krypteret storage hjælper ikke fordi
folk kan se hvordan de henter det rigtige brugernavn/password
ud af den andel tabel eller krypteret storage
Avatar billede faded Nybegynder
28. oktober 2005 - 16:15 #10
java kan decompiles så baser din sikkerhed på at brugerne af applikationen
kender source koden: hvordan går man det ?
Avatar billede faded Nybegynder
28. oktober 2005 - 16:18 #11
gør
Avatar billede arne_v Ekspert
28. oktober 2005 - 16:18 #12
du skal designe din sikkerhed udfra en forudsætning om at brugerne på 5 sekunder
kan decompile din applikation og læse hvad man gør

løsningerne er f.eks. individuelle password og lade brugerne indtaste password
eller en client server løsning hvor serveren tilgår databasen og brugerne har
ikke adgang til server applikationen
Avatar billede faded Nybegynder
28. oktober 2005 - 17:49 #13
er stadig ikke helt med
Avatar billede faded Nybegynder
28. oktober 2005 - 19:22 #14
Kan du gi et link til noget info
Avatar billede arne_v Ekspert
28. oktober 2005 - 19:29 #15
om hvad ?

decompilering ?

prompt og brug af password ?

client server løsning ?
Avatar billede faded Nybegynder
28. oktober 2005 - 19:30 #16
prompt og brug af password ? kan vi starte med den, når du mener password er det så i database strengen
Avatar billede faded Nybegynder
28. oktober 2005 - 19:36 #17
decompilering ? er det ikke hvor man oversætte class filen tilbage til en java-fil, isåfald kan jeg ikke se hvordan det skulle være en løsning
Avatar billede arne_v Ekspert
28. oktober 2005 - 19:48 #18
decompilering er ikke en løsning - det er problemet !
Avatar billede faded Nybegynder
28. oktober 2005 - 19:49 #19
oki så er vi enige om det så
Avatar billede arne_v Ekspert
28. oktober 2005 - 19:50 #20
det jeg mener med prompt og brug af password er at du opretter alle brugerne
i databasen med forskellige passwords, og så lader du programmet ved opstart
spørge efter password  (og brugernavn hvis du ikke bare bruger deres login)
og det gemmer du så og bruger til at lave alle database connections med
Avatar billede faded Nybegynder
28. oktober 2005 - 19:52 #21
oki, men den løsning kræver at Mysql serveren skal have alle brugerene med, 1 bruger i databasen per bruger
Avatar billede arne_v Ekspert
28. oktober 2005 - 19:57 #22
ja

med en client server løsning så kan du nøjes med en database bruger som ligger i
server koden som alle brugerne så ikke har adgang til
Avatar billede faded Nybegynder
28. oktober 2005 - 20:01 #23
ok, Arne giv med clien server løsningen, lyder som det smarteste
Avatar billede arne_v Ekspert
28. oktober 2005 - 20:31 #24
så skal du jo vælge:

java client app-----(RMI)-----java server app

java client app-----(socket)-----java server app

java client app-----(SOAP/HTTP)-----java web service hosted i servlet container

java client app-----(HTTP)-----java web app (JSP/servlet) hosted i servlet container
Avatar billede faded Nybegynder
28. oktober 2005 - 20:40 #25
det er en iss server jeg skal komunnikere med
Avatar billede arne_v Ekspert
28. oktober 2005 - 20:42 #26
java client app-----(HTTP)-----ASP måske så
Avatar billede faded Nybegynder
28. oktober 2005 - 20:43 #27
danm kunne godt bruge noget kode eller et link
Avatar billede arne_v Ekspert
28. oktober 2005 - 20:48 #28
jeg tror kun at jeg har applet----ASP men jeg poster lige det
Avatar billede arne_v Ekspert
28. oktober 2005 - 20:48 #29
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.io.*;
import java.net.*;

public class DatabaseApplet extends Applet implements ActionListener {
    TextArea select = new TextArea();
    TextField f1 = new TextField();
    TextField f2 = new TextField();
    Button insert = new Button();
    public void init() {
        select.setColumns(40);
        select.setRows(20);
        select.setText(select());
        f1.setColumns(10);
        f2.setColumns(20);
        insert.setLabel("Add");
        insert.addActionListener(this);
        add(select, null);
        add(f1, null);
        add(f2, null);
        add(insert, null);
        setVisible(true);
    }
    public void actionPerformed(ActionEvent ev) {
        insert(f1.getText(), f2.getText());
        select.setText(select());
        repaint();
    }
    private String select() {
        StringBuffer res = new StringBuffer("");
        try {
            URL url = new URL("http://localhost/select.asp");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("GET");
            con.connect();
            if (con.getResponseCode() == HttpURLConnection.HTTP_OK) {
                BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
                String line;
                while ( (line = br.readLine()) != null) {
                    res.append(line);
                    res.append("\r\n");
                }
                con.disconnect();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return res.toString();
    }
    private void insert(String f1, String f2) {
        try {
            URL url = new URL("http://localhost/insert.asp");
            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("POST");
            String info = "F1=" + f1 + "&F2=" + f2;
            con.setDoOutput(true);
            con.getOutputStream().write(info.getBytes());
            con.connect();
            if (con.getResponseCode() != HttpURLConnection.HTTP_OK) {
                System.err.println("POST failed");
            }
            con.disconnect();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
Avatar billede arne_v Ekspert
28. oktober 2005 - 20:48 #30
<%
Set con = Server.CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb;User Id=admin;Password=;"
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM T1",con
Do While Not rs.EOF
%>
<%=rs("F1")%> <%=rs("F2")%><br>
<%
rs.MoveNext
Loop
Set rs = Nothing
Set con = Nothing
%>
Avatar billede arne_v Ekspert
28. oktober 2005 - 20:48 #31
<%
Set con = Server.CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Database\MSAccess\Test.mdb;User Id=admin;Password=;"
con.Execute "INSERT INTO T1(F1,F2) VALUES(" & Request.Form("F1") & ",'" & Request.Form("F2") & "')"
Set con = Nothing
%>
Avatar billede faded Nybegynder
08. november 2005 - 19:36 #32
smid et svar
Avatar billede arne_v Ekspert
08. november 2005 - 19:43 #33
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester