Verständnis My.Settings

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Verständnis My.Settings

    Hi,
    ich wollte die Einstellungen in den Projekteigenschaften nutzen um die Datenbank-Daten dort abzulegen.
    Nun wollte ich noch den Fall abfangen, dass in den Settings nicht alle Datenbankverbindungsdaten drin sind, bevor die Verbindung versucht wird aufzubauen, sowie halt noch einige andere Tests.
    Zum Test habe ich einige Infos in den Einstellungen gelöscht und die Eigenschaften in VS gespeichert.



    In der app.config sind diese Werte auch weg.

    XML-Quellcode

    1. <userSettings>
    2. <F_ISMS.My.MySettings>
    3. <setting name="db_server" serializeAs="String">
    4. <value />
    5. </setting>
    6. <setting name="db_user" serializeAs="String">
    7. <value>root</value>
    8. </setting>
    9. <setting name="db_passwort" serializeAs="String">
    10. <value>XXXXXXX</value>
    11. </setting>
    12. <setting name="db_database" serializeAs="String">
    13. <value />
    14. </setting>


    In der Anwendung hole ich die Werte über My.Settings

    VB.NET-Quellcode

    1. Dim server As String = CStr(My.Settings.db_server)
    2. Dim username As String = CStr(My.Settings.db_user)
    3. Dim password As String = CStr(My.Settings.db_passwort)
    4. Dim database As String = CStr(My.Settings.db_database)


    Dabei werden die alten Werte gezogen die vorher drin standen.



    Werden die Settings noch irgendwo gecached? Kann man den Cache irgendwie flushen?

    Verstehe gerade nicht, woher er die alten Werte zieht. Auch ein Schliessen von VS 2019 brachte nichts.
    Danke.

    Bye
    Markus
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me
    Also "My.Settings" sind beim ausliefern der App das was du default eingetragen hast(das ist einkompiliert). Ändert der User was, wird das in
    C:\Users\Username\AppData\Local\applikationsname\applikationsname.exe_<zufällige zeichenkette>/Versionsnummer/user.config

    gespeichert, verschiebst du die Applikation, ist alles wieder default, ändert der User dann wieder was in den Settings, wird wie oben ein weiterer Ordner angelegt wieder mit zufälliger Zeichenkette, dort ist dann auch wieder eine user.config.

    Die My.Settings sind also Pfadgebunden, sollte auch Versions gebunden sein, kann also sein sein, das nach einem Update(wenn die versionnummer geändert wurde) wieder alles default ist, obwohl der Pfad(der exe) gleich ist. Ich empfehle eine Datei neben der exe zu nutzen.(De-/Serialisierung)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Takafusa“ ()

    @Lord Luxor Oder Du schaust hier mal vorbei, da werden die "normalen" Settings da abgelegt, wo Du es vorgibst:
    UserSettingsProvider (Persistieren von UserSettings)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du hast recht. Da ist ein Eintrag Typ "Verbindungszeichenfolge" im Bereich "Anwendung" mit einem ConnectionString. Wird der automatisch erstellt? War mir nicht bewusst, dass ich den erstellt habe. Wie wird der erzeugt?
    Es geht mir primär darum, dass der Anwender die Möglichkeit hat die Datenquelle jederzeit zu ändern. Daher habe ich erstmal das in die Settings geschrieben. Mir ist da nur etwas unwohl wegen dem Passwort.
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me
    Ja das mit den Passwörten ist so eine Sache. Hab ich erst garnet drauf geachtet, also ich täte niemals auf die Idee kommen, andere als root-user auf die DB zugreifen zu lassen. Erstelle weitere User mit weniger rechten. Oder greifen die nicht mit dem Tool auf einer deiner DBs zu?

    Auch ist es immer eine gute Idee, wenn die DB öffentlich erreichbar ist, den User root umzubenennen, den das schützt bei Angriffen, würde ich auf die Idee kommen eine DB zu attackieren, wären root und admin die ersten Usernamen mit den ich probieren täte.(Abgesehen von SQL-Injection)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Takafusa“ ()

    Das ist jetzt auch nur im Entwicklungssystem aus Bequemlichkeit. Im Echtbetrieb wird ein dedizierter DB-Benutzer verwendet, der auch nur auf diese Datenbank Zugriff hat um mögliche Schäden zu minimieren.
    Aber ich habe noch keine funktionierende Lösung gefunden, wie man das Passwort so versteckt, dass die Anwendung damit noch an die DB kommt bzw. das Passwort auch noch änderbar ist, im Fall dass es kompromitiert wurde.
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me
    Sobald es der Computer "lesen" kann, kann es jeder der weiss wie. Daher lasse ich keinen direkten Zugriff auf DBs zu, wenn ich von aussen auf DBs zugreifen muss, mache ich mir eine kleine API mit PHP, so ist es ausgeschlossen, das jemand von aussen ans Passwort kommt, jeder "User" hat sein eigenes Passwort und nur betimmte Rechte, nämlich nur die, die er braucht, auch protokolliere ich jeden schreibenden Zugriff. Der Nachteil der daraus entsteht, den nehm ich gern in kauf(Api mit PHP zu erstellen), DataSet&Co von Hand erstellen etc.

    Ich bin da "Better Safe than sorry" eingestellt.
    Verschlüssel halt die einzelnen Strings bevor du sie den Settings zuweist.

    @Takafusa und wo stehen die Zugangsdaten für die API bzw. wie sind diese gesichert? Wir hatten hier mal genau dieses Thema, leider finde ich den Thread nicht mehr. @VaporiZed findest du diesen Thread noch wo wir über das Thema „Passwörter“ Diskutiert hatten?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Lord Luxor schrieb:

    Es geht mir primär darum, dass der Anwender die Möglichkeit hat die Datenquelle jederzeit zu ändern.
    Das ist bei Setting-ConnectionStrings nicht vorgesehen.
    Beim Verteilen eines Programms wird eine geeignete .config-Datei mitgeliefert, die den ConnectionString bestimmt.
    Dass iwelche User lustig die Datenbank wechseln ist wie gesagt nicht vorgesehen, und ich kann mir weder vorstellen, wozu das gut sein sollte, und wenn doch, dass sowas dann auch gut geht.



    Jp, das Sicherheitsproblem ist problematisch.
    Auf Arbeit haben wir einen Web-Dienst, der die DB komplett verbirgt.
    Per https kann ein User sich anmelden, und eine Session eröffnen. Für die Session erhält er ein "Token" - das ist eine Art temporäres Passwort.
    Das heisst: Nirgendwo sind Credentials "versteckt" gespeichert, sondern die müssen im Kopf des Anwenders sein.
    Und auch im weiteren bleibt die Kommunikation TLS-verschlüsselt.

    Also nix, was ein einzelner HobbyProgrammierer sich so hinbasteln könnte.
    @mrMo Die Passwörter für die API habe ich verschlüsselt neben der Anwendung aber auch noch zufällige Bytes welche auch innerhalb der Bytes der verschlüsselten Credentials sind, wenn der User die denn speichern will, diese bekommt auch das FileAttribute "Hidden", klar ist das auch leicht knackbar. Ich finde das so einfacher zu verwalten, via maßgeschneidertes Webinterface, wer auf welche Datenbank/Tabellen zugreifen kann, wer wo schreiben darf. Zudem ist die API auch nur via HTTPS erreichbar.

    ErfinderDesRades schrieb:

    Also nix, was ein einzelner HobbyProgrammierer sich so hinbasteln könnte.


    Mit meiner Api ist das ähnlich(nur ohne Token, ich hab PHP Sessions), nur kann der User optional die Zugangsdaten speichern, wird das Passwort aber geleakt, muss er "den kopf hinhalten", wird ja alles Protokolliert und Backups werden auch regelmäßig gemacht. Bin aber auch nur ein einzelner HobbyProgrammierer, das ist durchaus machbar, wenn man sich in die Materie einarbeitet und gut drüber nachdenkt, wie auch bereit ist, mehrafuwand in kauf zu nehmen.
    Aber ich finde eine Website wo man ein Token generieren kann, auch nicht schlecht, wie geht das bei euch via Webseite oder in der Applikation selbst? Nur firmenintern erreichbar? Denn bei webseite hat man auch wieder das Problem mit dem speichern von zugangsdaten, das geht ja auch im Webbrowser.

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Takafusa“ ()

    Takafusa schrieb:

    wie geht das bei euch via Webseite oder in der Applikation selbst?
    Weiss ich nicht wirklich.
    vermutlich "Website", weil "Application" kann man unsere Service-Landschaft wohl kaum nennen.
    Und da sind auch Zertifikate dran beteiligt, und ein fettes Nuget-Paket, mit viele Interfaces, Konfiguration, und Krims und Krams - wo ich alles nicht durchblicke, und auch froh bin, dassich es nicht muss.


    Takafusa schrieb:

    HobbyProgrammierer, das ist durchaus machbar
    Tja, da haste mir was vorraus - ich hab privat noch nichtmal eine TLS-Kommunikation hinbekommen, und auch keinen Dienst, als ichs mal versucht hattete.
    Muss man nicht mal selbst implementieren. SSL Zertifikat, selbst erstellen oder lassen, Server konfigurieren, nur HTTPS zulassen. Via Webrequest die Zugriffe machen. Klar gibt es so auch Angriffsmöghlichkeiten, aber ich schätze das Risiko als sehr gering ein. Strip SSL ist da denke ich eine der wenigen Möglichkeiten. Das Risiko eines geleakten Passworts schätze ich als höher ein.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Takafusa“ ()

    Danke an die Denkanstöße. Für das Projekt erstmal wahrscheinlich nicht notwendig. Aber für zukünftige werde ich mir das mit dem PHP-API mal näher anschauen. @Takafusa: Ich nehme an, hast Du den Web-Service dann auch auf dem DB-Server, oder auf einem anderen System?
    8-Bit Nerd - Retro-Computer Junkie - Elektronik-Fuzzi - Lötkolben-Jongleur
    Lord Luxors Retrogalerie llrg.me
    PHP selbst ist keine API, ein Script Interpreter passt eher, hab mir damit eine API gebastelt. Mit PHP hohle ich die Daten aus der DB und spiele sie aus. Bzw. nehme auch Daten an, um sie in die DB einzutragen, aber nur wenn der User angemeldet ist, jedesmal wird geprüft ob für den User eine Session erstellt wurde, das passiert nur wenn er sich anmeldet.

    Also der MySql-Server, wie auch der Web-Server(Apache) laufen auf dem gleichen System. Von aussen ist kein Direkt-Zugriff auf den DB-Server möglich.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Takafusa“ ()

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.