Base-Anwendung schützen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

WSO
*****
Beiträge: 233
Registriert: Di, 22.04.2014 13:03

Base-Anwendung schützen

Beitrag von WSO »

Hallo Forum,
ich möchte eine Base-Anwendung vor Manipulationen (Änderung von Formularen, Tabellen, Abfragen, ...) des Anwenders schützen.
Die Benutzerfunktionen werden über ein Formular aufgerufen, welches beim Start der Datenbank automatisch aufgerufen wird.

Schön ware es, wenn
a) Beim schliessen dieses Formulars die Datenbank oder Base ebenfalls beendet wird,
b) der Anwender die Benutzeroberfläche für die Base-Entwicklungsfunktionen nicht mehr über die Taskleiste aufrufen kann

Vielleicht gibt es ja auch eine andere Lösung für die Anforderung.
Hat jemand eine Idee dazu?

Vielen Dank und Gruss,
WSO
Benutzeravatar
Rasakul
**
Beiträge: 32
Registriert: Di, 29.07.2014 15:26
Wohnort: Wien

Re: Base-Anwendung schützen

Beitrag von Rasakul »

Hallo!

Falls dein Problem noch aktuell ist (wenn nicht, hilfts vl jemanden, der ein ähnliches Problem hat):
Ich bin bei weitem kein Basic Profi, aber ich hatte einen ähnlichen Gedanken und hab mir deshalb folgende Makros zusammengebastelt:

ad a)
Makro an "Dokument schließen" gebunden in jedem Formular

Code: Alles auswählen

Sub dbShutdown
    If not(shutdown) then
        'Variable zur Steuerung der Fensterschließung (falls false: Endlosschleife 
        '(shutdown schließt Formular, Formularschließen löst dbShutdown aus etc)
        shutdown = true
        
        'Controler referenzieren
         oController = ThisDatabaseDocument.CurrentController
         oConnection = oController.ActiveConnection
         
         'Verbindung und SubComponenten schließen, Dokument speichern und DB anschließend schließen
        oDoc = ThisDatabaseDocument
        oDoc.store()
        oController.closeSubComponents
         oController.ActiveConnection.close()
        oDoc.close(True)
    endif
End sub
wichtig ist hierbei die Variable

Code: Alles auswählen

shutdown
wenn die nicht in der Sub auf true gesetzt wird, produzierst du eine Endlosschleife (Fensterschließen löst Sub dbShutdown aus, Sub dbShutdown schließt alle Fenster, Fenster löst wieder Sub dbShutdown aus etc)
Fallst du irgendeine Art der Menüführung durch die verschiedenen Formulare hast, musst da das dann auch abfangen, da hier ja auch die Formulare geschlossen werden

ad b)
Makro ist an "Dokument öffnen" gebunden

Code: Alles auswählen

Sub dbStart
'Start der Datenbank: Datenquelle verbinden, IDE unsichtbar machen, Bibliotheken laden
    
    shutdown = false 'wichtige Variable für Fenster schließen (siehe Makro oben)

    'IDE-Fenster referenzieren und verstecken
    oFrame = ThisComponent.CurrentController.Frame
     oMenuWin = oFrame.ContainerWindow()
     oMenuWin.setVisible(false)
         
     'Bibliotheken laden
     GlobalScope.BasicLibraries.LoadLibrary("Tools")
    GlobalScope.BasicLibraries.LoadLibrary("XrayTool")
    BasicLibraries.LoadLibrary("Menue")

    'Controller verbinden
    oController= ThisDatabaseDocument.CurrentController
    If NOT ( oController.isConnected() ) Then oController.connect()
    
    'Willkommensgruß
    MsgBox "Willkommen!", 64
    
    'Hauptmenü öffnen, Layoutmenü verstecken
    oFormDoc = ThisDatabaseDocument.formdocuments.getbyname("Menue_Main").open
    lmgr = oFormDoc.getCurrentController().Frame.LayoutManager
    lmgr.setVisible(false)
         
    'lmgr.hideElement("private:resource/menubar/menubar") 'Menü  
    'lmgr.hideElement("private:resource/statusbar/statusbar") 
    lmgr.hideElement("private:resource/toolbar/formsnavigationbar")
    lmgr.hideElement("private:resource/toolbar/standardbar")
    lmgr.hideElement("private:resource/toolbar/formdesign")
    lmgr.hideElement("private:resource/toolbar/formcontrols")    
End Sub
Durch die Zeile "

Code: Alles auswählen

oMenuWin.setVisible(false)"
wird die IDE unsichtbar und nicht mehr über die Taskleiste aufrufbar
Die Zeilen

Code: Alles auswählen

lmgr.setVisible(false) 
und

Code: Alles auswählen

lmgr.hideElement() 
sorgen dafür, dass der User nicht irgendwas im Base Menü herumpfuschen kann
Einziges Problem bei der ganzen Sache ist, dass die IDE sichtbar wird, wenn das .odb Dokument nochmals geöffnet wird, wenn die Datenbank bereits läuft

Ich hoffe, ich konnte dir helfen

Grüße aus Wien
Rasakul
Zuletzt geändert von Rasakul am Do, 07.08.2014 16:32, insgesamt 1-mal geändert.
Wenn du dir die Anwender deiner Programme als Idioten vorstellst, werden auch nur Idioten deine Programme verwenden - Linus Torvalds
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Base-Anwendung schützen

Beitrag von Stephan »

Einziges Problem bei der ganzen Sache ist, dass [...]
der ganze 'Mechanismus' leicht auszuhebeln ist indem man die Ausführung von Makros blockiert.


Gruß
Stephan
Benutzeravatar
Rasakul
**
Beiträge: 32
Registriert: Di, 29.07.2014 15:26
Wohnort: Wien

Re: Base-Anwendung schützen

Beitrag von Rasakul »

WSO hat geschrieben: Die Benutzerfunktionen werden über ein Formular aufgerufen, welches beim Start der Datenbank automatisch aufgerufen wird.
Makros scheint er sowieso für seine Datenbank zu nutzen, von dem her würde das Blockieren der Makros sowieso das Konzept umwerfen ;-)

Grüße aus Wien
Rasakul
Wenn du dir die Anwender deiner Programme als Idioten vorstellst, werden auch nur Idioten deine Programme verwenden - Linus Torvalds
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Base-Anwendung schützen

Beitrag von Stephan »

Makros scheint er sowieso für seine Datenbank zu nutzen, von dem her würde das Blockieren der Makros sowieso das Konzept umwerfen
das war hier aber garnicht mein Thema, sondern der Hinweis das der Versuch eine Datei per Makros schützen zu wollen einfach nicht funktioniert, weil sie leicht umgangen werden kann.

Bitte auch lesen das der Threadstarter von "vor Manipulationen ... des Anwenders schützen." sprach, es geht also nicht um ungewollte Fehlbedienung sondern darum den Versuch des Anwenders ungewollte Änderungen zu machen zu blockieren, was mittels Makros einfach nicht klappen kann.

Ich ziele mit dieser Aussage auch ein bisschen in die allgemeine Richtung in Zeiten wo wir allseitig bespitzelt werden auch zu unterscheiden zwischen Sicherheit und Snakeoil (http://de.wikipedia.org/wiki/Schlangen%C3%B6l), typisch hierfür z.B. der Versuch von Nutzern Excel-Tabellenblätter per Passwort zu schützen um wichtige Daten geheimzuhalten und die Verwunderung darüber wie leicht das umgangen werden kann.

Warum ich das schreibe ist ganz einfach, weil ich dem Tun solcher Leute im normalen Leben ausgeliefert bin wenn ich ihnen meine Daten überlassen muss.


Gruß
Stephan
Benutzeravatar
Rasakul
**
Beiträge: 32
Registriert: Di, 29.07.2014 15:26
Wohnort: Wien

Re: Base-Anwendung schützen

Beitrag von Rasakul »

Ok, sorry, da habe ich dich missverstanden.
Warum ich das schreibe ist ganz einfach, weil ich dem Tun solcher Leute im normalen Leben ausgeliefert bin wenn ich ihnen meine Daten überlassen muss.
Wie löst du das Problem dann? Gibt es denn überhaupt eine Möglichkeit einen effizienten Schutz vor Manipulation durch den Anwender? einzurichten
Wenn du dir die Anwender deiner Programme als Idioten vorstellst, werden auch nur Idioten deine Programme verwenden - Linus Torvalds
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Base-Anwendung schützen

Beitrag von Stephan »

Wie löst du das Problem dann? Gibt es denn überhaupt eine Möglichkeit einen effizienten Schutz vor Manipulation durch den Anwender? einzurichten
Ich habe zumindest keine Lösung bei der Hand und hätte auch nur die Makrolösung nennen können, was für mich der Grund war auf die ursprüngliche Frage nicht zu antworten weil ich die Makrolösung dafür ungeeignet halte.

Eine mögliche Lösung könnte z.B. sein die Datenbankdatei (*.odb) nur als Container für eine insgesamt verschlüsselte Datenbankdatei zu nutzen, die per Makro zur Laufzeit entschlüsselt würde, so wäre sichergestellt das der Benutzter Makros nutzen MUSS um die Datenbank überhaupt nutzen zu können, wenn er versucht Makros nicht zuzulassen ist in diesem Falle erst garkeine bearbeitbare Datenbank erreichbar.

Zur Illustration wie man überhaupt andere Dateien in eine ODF-Datei einpackt und zur Laufzeit entpackt hänge ich mal ein alte Beispiel eines Vorlageninstallers an, dort ist nichts verschlüsselt es wird aber das grundsätzliche Prinzip verdeutlicht wenn Du Dir überlegst das die dort enthaltenen Vorlagendateien Eine VERSCHLÜSSELTE Datenbankdatei sein könnten.
(die anhängende Datei ist hinsichtlich enthaltener Vorlagen stark gekürzt weil sie sonst zu groß wäre (2,5 MB) um sie hier hochzuladen. Mehr Vorlagen gibt es z.B. bei der PrOOo-Box http://www.prooo-box.org/live/seiten/vorlagen.html)



Gruß
Stephan
Dateianhänge
installer_V3.odt
(63.1 KiB) 114-mal heruntergeladen
WSO
*****
Beiträge: 233
Registriert: Di, 22.04.2014 13:03

Re: Base-Anwendung schützen

Beitrag von WSO »

Hi Stephan,
das klingt sehr gut.
Vielen Dank für sie ausführliche Erklärung.
Werde das ausprobieren.

Die Datenbank soll sowohl unter Win 7 als auch Linux Mint laufen.
Ich vermute die Lösung ist nicht kompatibel, oder?

Gruss,
Wolfram
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Base-Anwendung schützen

Beitrag von Stephan »

Ich vermute die Lösung ist nicht kompatibel, oder?
Doch, die Lösung ist kompatibel, soweit sie die Beispieldatei betrifft bzw. auch generell. Einzig zeigt die Beispieldatei aber nur das Prinzip des 'Einpackens' einer Datei in eine Andere und müsste für Deine Zwecke noch um die Verschlüsselung und das Speichern von Änderungen an der eingepackten Datei ergänzt werden, wofür ich kein fertiges Beispiel habe und was auch zu umfangreich ist um es hier in ein paar Codezeilen abhandeln zu können. Das ist aber alles machbar.

Mir kam es hier nur darauf an auf Probleme hinzuweisen, denen ich bei meiner beruflichen Tätigkeit immer wieder begegne und die in Zeiten faktisch flächendeckender Bespitzelung ein ernsthaftes Problem sind, denn auch ich muss (wie wir alle) meine Daten Anderen anvertrauen und mich gruselt es wenn ich weiß wie sorglos Viele auch reiner Unwissenheit damit umgehen.



Gruß
Stephan
WSO
*****
Beiträge: 233
Registriert: Di, 22.04.2014 13:03

Re: Base-Anwendung schützen

Beitrag von WSO »

Guten Morgen,
ich habe das Beispiel von Rasakul (vielen Dank dank dafür) zum verstecken der IDE eingebaut.
Die routine zum Shutdown ist nicht implementiert.

Code: Alles auswählen

SUB Systemstart_Anwender
        
    	'Start der Datenbank: Datenquelle verbinden, IDE unsichtbar machen, Bibliotheken laden
       
'       shutdown = false 'wichtige Variable für Fenster schließen (siehe Makro oben)
'       nicht implementiert

		Call GlobalsBelegen
		Call Datenbankbackup
		Call TempTabelle 

       	DIM oFrame AS OBJECT
        DIM oMenuWin AS OBJECT
        DIM oFormDoc AS OBJECT           
               
        'Bibliotheken laden
        GlobalScope.BasicLibraries.LoadLibrary("Tools")
       	GlobalScope.BasicLibraries.LoadLibrary("XrayTool")      	
      	
       	'Controller verbinden
       	oController= ThisDatabaseDocument.CurrentController
       	If NOT ( oController.isConnected() ) Then oController.connect()
       	
		oFrame = ThisComponent.CurrentController.Frame
        oMenuWin = oFrame.ContainerWindow()
        oMenuWin.setVisible(false)
        oFormDoc = ThisDatabaseDocument.formdocuments.getbyname("fMenue").open
        
       	'	lmgr = oFormDoc.getCurrentController().Frame.LayoutManager 
       	'	lmgr.setVisible(false)
       	'	lmgr.hideElement("private:resource/menubar/menubar") 'Menü 
       	'	lmgr.hideElement("private:resource/statusbar/statusbar")
       	'	lmgr.hideElement("private:resource/toolbar/formsnavigationbar")
       	'	lmgr.hideElement("private:resource/toolbar/standardbar")
       	'	lmgr.hideElement("private:resource/toolbar/formdesign")
       	'	lmgr.hideElement("private:resource/toolbar/formcontrols")
       
End Sub
Hierbei ist folgendes Problem aufgetrteten:
Von der Anwendung werden weitere LO-Fenster geöffnet:
- Anzeige verlinkter Dokumente (Writer, Draw)
- exportierte Tabellen (Calc)
- etc.

Ist die IDE nicht sichtbar, und ich schliesse eines dieser Fenster wird jetzt auch LO beendet.
Das ist natürlich nicht gewollt.
Es folgt dann die Aufforderung zur Dokumentenwiederherstellung z.B. der Calc-Datei ...

Kann man das verhindern?
Gruss,
WSO
Benutzeravatar
Rasakul
**
Beiträge: 32
Registriert: Di, 29.07.2014 15:26
Wohnort: Wien

Re: Base-Anwendung schützen

Beitrag von Rasakul »

Hi!

Immer gerne! :)

ich versteh noch nicht ganz die Situation: Wenn du die anderen LO-Fenster öffnest, ist gleichzeitig kein Base-Fenster (außer der versteckten IDE) offen? Wie genau öffnest du die Fenster? (Code?) Wie schließt du die Festern wieder (einfach schließen oder mit Makro + Button?) und hängt irgendein Makro am Event "Dokument schließen"? Was hast du vor, was passieren soll, wenn die Fenster geschlossen werden?

Grüße aus Wien
Rasakul
Wenn du dir die Anwender deiner Programme als Idioten vorstellst, werden auch nur Idioten deine Programme verwenden - Linus Torvalds
WSO
*****
Beiträge: 233
Registriert: Di, 22.04.2014 13:03

Re: Base-Anwendung schützen

Beitrag von WSO »

Hallo Rasakul,
hier das ganze etwas ausführlicher.
In den Datenbanktabellen habe ich Links auf Dokumente im Filesystem, z.B. die Angebotspräsentation (Draw) in der Tabelle "Kundenangebot". Die "Links" sind als STRING mit der URL des Dokuments gespeichert.
Über eine Schaltfläche in dem Bases-Formular zur Verwaltung der Angebotsdaten kann das Dokument geöffnet werden:

Code: Alles auswählen

SUB DateianzeigenParameter (oEvent AS OBJECT)
	
	DIM oDoc AS OBJECT
	DIM oDrawpage AS OBJECT
	DIM oForm AS OBJECT
	DIM oFeld AS OBJECT
	DIM oShell AS OBJECT
	DIM stFeld AS STRING
	Dim stFeldname AS String
	DIM stTag AS String
	
	DIM iMessage as boolean
	Dim iReplacement_1 as string
	Dim iReplacement_2 as string
	
	oDoc=thisComponent
	oDrawpage=oDoc.Drawpage
	
	stTag = oEvent.Source.Model.Tag 'Tag wird unter den Zusatzinformationen eingegeben
	aForm() = Split(stTag, ",") 'Formularname, DSN-Feldname_im_Formular
	
	stFormular = Trim(aForm(0))
	stFeldname = Trim(aForm(1))	
	
	REM Lage des Feldes in dem entsprechenden Formular aufsuchen
	oForm=oDrawpage.Forms.getByName(stFormular)
	oFeld=oForm.getByName(stFeldname)
	
	REM Den Text aus der Dateiauswahl auslesen

	stFeld=oFeld.Text
	If stFeld < " " THEN
			iMessage = getMessage(35, iReplacement_1, iReplacement_2)
		EXIT SUB
	END IF	
	
	
	REM Start des Files mit der entsprechenden URL-Verbindung
	oShell = createUnoService("com.sun.star.system.SystemShellExecute")
	stFeld = convertToUrl(stFeld)
	oShell.execute(stFeld,,0)
END SUB
Somit sind jetzt n Base-Formulare (Kunde, Angebot, ...) geöffnet und ein LO-DRAW Window.
Das DRAW-Window schliesse ich über das Window-Control (X).
Das soll aber nichts anderers tun, als das DRAW-Window zu schliessen,
denn mit Base (hier meinem Kundenangebot) will ich ja weiter arbeiten.
So war das Systemverhalten bevor ich die IDE "versteckt" habe.

Jetzt, mit "versteckter IDE" wird durch das Schliessen des DRAW-Windows auch LO beendet.
Ich hoffe das macht die Situation etwas klarer.

Falls du dazu eine Idee hast würde ich mich freuen.
Mit sonnigen Grüssen aus La Gomera,
Wolfram
Benutzeravatar
Rasakul
**
Beiträge: 32
Registriert: Di, 29.07.2014 15:26
Wohnort: Wien

Re: Base-Anwendung schützen

Beitrag von Rasakul »

Guten Morgen!

Sehr seltsam das ganze... Ich habs selber ausprobiert und kanns echt nicht erklären. Selbes passiert übrigens auch mit

Code: Alles auswählen

StarDesktop.loadComponentFromURL
Hoffentlich kennt hier jemand anderes des Problems Lösung, ich leider nicht :(

Sorry
Wenn du dir die Anwender deiner Programme als Idioten vorstellst, werden auch nur Idioten deine Programme verwenden - Linus Torvalds
WSO
*****
Beiträge: 233
Registriert: Di, 22.04.2014 13:03

Re: Base-Anwendung schützen

Beitrag von WSO »

Trotzdem erst mal vielen Dank.
WSO
Antworten