SQL Verbindung Sicherheit 2016

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von Die_Sabine.

    SQL Verbindung Sicherheit 2016

    Guten Tag,

    Mein wissen ist schon ziemlich veraltet und im Internet findet man auch nur Beiträge die schon 5 Jahre oder älter sind, mittlerweile hat sich sicherlich schon viel geändert.
    Meine Frage:

    1. Zuerst wie die Verbindungsdaten für die SQL Datenbank sicher in den Code ablegen? Verschlüsseln?

    2. Und wie baut man mit der aktuellsten Sicherheit eine Verbindung zu einer Datenbank auf? Folgendes Szenario:

    2.1 User klickt auf Login oder Registrieren und gibt seine Daten ein, diese müssen dann zu meinen Server gelangen ohne das einer Mitlesen kann und ohne das jemand fremdes die Befehle die im Code sind sieht.

    3. Und wie macht man dann am besten abfragen nachdem der user sich erfolgreich angemeldet hat z.B. der user Mustermann hat diese UserID und war zuletzt online am. Diese freunde vom Mustermann sind aktuell online, Mustermann hat den Premiumstatus und kann deshalb alles nutzen im Programm.

    Ich weiß das alles schon mal gefragt wurde, nur will ich ein aktuelles Update, gerade im Jahre 2016 bald 17 ist Sicherheit sehr wichtig geworden. Via PHP wäre ja eine Lösung aber man kann ja dann dieses script im Browser anzeigen lassen und dann sind dort die ganzen Daten drin.

    Mit freundlichen Grüßen
    Die Sabine :)
    Willkommen im Forum! In denn letzten paar Jahren hat es sich sicher wenig geändert.

    Ich geh mal davon aus das du eine Windows Applikation erstellen willst. Bei Frage zwei kann ich dir nur raten mit PHP und einem Webserver eine Schnittstelle zu basteln bzw. das die Abfrage über PHP durchgeführt wird(Auf w3schools ist alles ganz einfach dokumentiert: w3schools.com/php/php_mysql_intro.asp ). Wenn du die Anmelde Daten für die Datenbank im Programm speicherst, kann man die ohne grossen Aufwand herausfinden. Und nein PHP kann man nicht im Browser anschauen. Wenn du mit PHP arbeitest, wird dies beim Server verarbeitet. Um zu prüfen wer zu letzt online war, kannst du einfach die letzte Zeit in der Datenbank speichern und abgleichen. Das gleiche gilt für dieses Premium Zeugs.
    Wenn du nicht all zu viel Ahnung von PHP und SQL hast, lies dir bitte auch noch diese Artikel durch: w3schools.com/sql/sql_injection.asp php-einfach.de/experte/php-sicherheit/code-injection/

    MfG Gabriel B.

    Die_Sabine schrieb:

    Zuerst wie die Verbindungsdaten für die SQL Datenbank sicher in den Code ablegen?
    Gar nicht.
    Passwörter haben im Code nichts verloren.
    Weder verschlüsselt noch unverschlüsselt.

    Die_Sabine schrieb:

    Und wie baut man mit der aktuellsten Sicherheit eine Verbindung zu einer Datenbank auf?
    Sprechen wir von Microsoft SQL Server?
    In der lokalen Domain?
    Authentifizierung über den Windows-User.

    Übers Internet?
    Application-Server dazwischenschalten (PHP, ASP.Net, ...).

    Von einem Webserver?
    Nur Webserver hat direkten Zugriff auf die DB.
    Datenberechtigung wird vom Webservice gesteuert.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @gabriel-b vielen dank :) ich werde es mir anschauen :)

    @petaod Wie macht man das sonst wenn man schon keine Verbindungsdaten ablegen darf?

    wir sprechen von einem Windows Server 2012R2 auf dem läuft der SQL Server 2014 dieser Windows Server steht in einem Rechenzentrum.

    Applikationsserver?

    Aber Webserver klingt auch Interessant, dies kam nie infrage, weil ich mich mit Windows Server und SQL mich recht gut auskenne.

    EDIT:

    nochmal an @gabriel-b die Premium Geschichte lässt diese sich dann nicht manipulieren? z.b.

    VB.NET-Quellcode

    1. If wert aus der Datenbank = 1 then
    2. alles freigeschalten
    3. ElseIf wert aus der Datenbank = 0
    4. Sie haben ein normales Konto
    5. End If

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

    Manipulationen können nur dort stattfinden wo eine von User definiert Variable verwendet wird. Dieser Tipp ist vor allem bei PHP und SQL ernst zu nehmen ;)

    Dein Code wie er oben steht ist sicher.

    Edit: Aber was willst du genau schreiben? Eine Desktop Anwendung? Eine Website?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „gabriel-b“ ()

    gabriel-b schrieb:

    Manipulationen können nur dort stattfinden wo eine von User definiert Variable verwendet wird. Dieser Tipp ist vor allem bei PHP und SQL ernst zu nehmen ;)

    Dein Code wie er oben steht ist sicher.

    Edit: Aber was willst du genau schreiben? Eine Desktop Anwendung? Eine Website?


    @gabriel-b Echt der ist sicher? Weil ich schon viele Videos auf YouTube gesehen hab auch von dem Herrn Semper Video wo gezeigt wurde das im Programm-Prozesse manipuliert werden können --> also was ich meine: YouTube-Video

    Ich will eine Desktopanwendung Entwickeln.

    Die_Sabine schrieb:

    Wie macht man das sonst wenn man schon keine Verbindungsdaten ablegen darf?
    Indem du dich davon verabschiedest, dass deine Desktopanwendung irgendwelche SQL-Befehle direkt an eine Datenbank absetzt. Was deine Desktopanwendung macht, ist per Webrequest Daten von einem Server abzufragen. Die Abfragen sind hierbei per SSL/TLS gesichert, sofern der Server ein gültiges SSL-Zertifikat hat. Der Server wiederum verarbeitet die Anfrage, und holt bei bedarf die Daten aus der Datenbank und schickt sie weiter an den Client. Wie du siehst, brauchst du keine Passwörter oder ähnliches in die Desktopanwendung schreiben.

    Wenn du Serverseitig nicht mit PHP arbeiten möchtest, aber dennoch garantieren möchtest, dass man per HTTP Daten von deinem Server abfragen kann, so baue dir einen RESTful WCF Service
    Dadurch kann alles was HTTP kann, auch mit deinem Server kommunizieren.

    gabriel-b schrieb:

    Aha. Ja das ist wiederum möglich. Deswegen würde ich dies mit dem Premium usw. auf dem Server Speichern. Was willst du genau für ein Programm programmieren?


    Ganz genau darf ich es nicht beschreiben wegen einer Vereinbarung mit meinem Arbeitgeber, aber drumherum darf ich reden.
    Mit einem Premiumaccount ist es möglich im Programm weitere Sachen zu machen eine ist z.B. mehr Text speichern zu können oder das Programm hat dann weitere Funktionen freigeschalten die ein Free user nicht hat die der Freeuser dennoch im Programmcode hat aber nicht nutzen darf, weil ja die Datenbank sagt das dieser nicht bezahlt hat für diese Funktionen und deshalb diese Funktionen nicht freigeschalten sind.

    Bestes Deutsch merk ich gerade von mir.

    gabriel-b schrieb:

    Hmmm... Die Möglichkeit das jemand das Programm manipuliert ist also da. Dagegen kann man auch nichts machen. Ist bei jeden Programm möglich.

    Edit: Aber wer crackt sich schon ein Programm? Fast niemand.


    Das stimmt gerade wenn die Premium Version nur monatlich zwischen 1 und 5 € kostet. Naja ich werde da schon was hinbekommen, aber das wichtigste ist glaube erstmal eine sichere Kommunikation zwischen Anwendung und SQL Server, denke ich mal das ich die PHP Variante nehmen werde. Werde mich bezüglich "Application-Server" Informieren aber denke ich wie es oben beschrieben wurde es sich darum um einen FTP Server handelt oder liege ich da gerade falsch @petaod

    EDIT:
    ​ Indem du dich davon verabschiedest, dass deine Desktopanwendung irgendwelche SQL-Befehle direkt an eine Datenbank absetzt. Was deine Desktopanwendung macht, ist per Webrequest Daten von einem Server abzufragen. Die Abfragen sind hierbei per SSL/TLS gesichert, sofern der Server ein gültiges SSL-Zertifikat hat. Der Server wiederum verarbeitet die Anfrage, und holt bei bedarf die Daten aus der Datenbank und schickt sie weiter an den Client. Wie du siehst, brauchst du keine Passwörter oder ähnliches in die Desktopanwendung schreiben.


    Dies ist mit php zu realisieren oder? @EaranMaleasi

    Die_Sabine schrieb:

    Werde mich bezüglich "Application-Server" Informieren aber denke ich wie es oben beschrieben wurde es sich darum um einen FTP Server handelt oder liege ich da gerade falsch
    Hat mit FTP nichts zu tun.

    Es ist ganz allgemein gehalten ein Stück Programm, das auf einem (Internet-)Server läuft und die Middleware zwischen der Anwendung und der Datenbank bildet.
    Evtl. sogar Teile der Anwendung mit übernimmt.

    Das kann eine der oben beschriebene PHP-Lösungen sein. Oder irgendwas mit ASP.net.
    Oder ein Webservice (SOAP oder REST).
    Es gibt sehr viele brauchbare Ansätze, aber FTP zählt sicher nicht dazu.

    Die_Sabine schrieb:

    wir sprechen von einem Windows Server 2012R2 auf dem läuft der SQL Server 2014 dieser Windows Server steht in einem Rechenzentrum.
    Dann ist doch der Weg ein ganz einfacher.
    Du gehst den Weg über "Integrated Security", indem du im SQL-Server Domain-User oder -Gruppen berechtigst.
    Damit wird automatisch über Windows-Login authentifiziert.

    Da kannst du sogar noch bestimmten Windows-Benutzern dedizierte Rollen zukommen lassen.

    msdn.microsoft.com/en-us/library/bsz5788z.aspx

    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    EaranMaleasi schrieb:

    Demnach bist du meinem Link nichtmal gefolgt, oder empfindest es als zu kompliziert. ||
    Aber natürlich steht PHP nichts im Wege ^^


    doch bin ich, aber hab mich schon mit php abgefunden jetzt :)

    petaod schrieb:

    Die_Sabine schrieb:

    Werde mich bezüglich "Application-Server" Informieren aber denke ich wie es oben beschrieben wurde es sich darum um einen FTP Server handelt oder liege ich da gerade falsch
    Hat mit FTP nichts zu tun.

    Es ist ganz allgemein gehalten ein Stück Programm, das auf einem (Internet-)Server läuft und die Middleware zwischen der Anwendung und der Datenbank bildet.
    Evtl. sogar Teile der Anwendung mit übernimmt.

    Das kann eine der oben beschriebene PHP-Lösungen sein. Oder irgendwas mit ASP.net.
    Oder ein Webservice (SOAP oder REST).
    Es gibt sehr viele brauchbare Ansätze, aber FTP zählt sicher nicht dazu.

    Die_Sabine schrieb:

    wir sprechen von einem Windows Server 2012R2 auf dem läuft der SQL Server 2014 dieser Windows Server steht in einem Rechenzentrum.
    Dann ist doch der Weg ein ganz einfacher.
    Du gehst den Weg über "Integrated Security", indem du im SQL-Server Domain-User oder -Gruppen berechtigst.
    Damit wird automatisch über Windows-Login authentifiziert.

    Da kannst du sogar noch bestimmten Windows-Benutzern dedizierte Rollen zukommen lassen.

    msdn.microsoft.com/en-us/library/bsz5788z.aspx



    Sehr gut, ich besitze einen Webserver aber bei dem komme ich doch nur über FTP drauf ^^

    EDIT: hab mich schon gewundert wo das mit dem Windows Server auf einmal her kam ^^
    Auch wenn du dich jetzt schon mit PHP abgefunden hast empfehle ich dir den Websiervice doch noch einmal genauer anzusehen.

    Den kannst du nämlich auch direkt in VS programmieren und schon beim Testen deiner Anwendung übers VS laufen lassen ohne einen Server zum testen zu benötigen. Die Antwort vom Server kommt dann über xml direkt in dein Entity Framework oder typisiertes Dataset deiner Anwendung. Und das ohne den viel komplizierteren Weg mittels PHP und der gleichen Sicherheit

    Die_Sabine schrieb:

    wir sprechen von einem Windows Server 2012R2 auf dem läuft der SQL Server 2014 dieser Windows Server steht in einem Rechenzentrum.
    Sollte die Anwendung wirklich nur auf Windows-Rechnern lokal im Firmennetzwerk laufen, macht noch nicht mal ein Webservice Sinn.
    Und eine zwischengeschaltete PHP-Anwendung schon gar nicht.
    Da ist dann eine direkte Datenbankverbindung wirklich das einfachste.
    Und mit Integrated Security auch sicher.
    In diesem Fall, sprich mit eurem DB-Administrator. Der kann dich in der Umsetzung sicher unterstützen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Aus dem Hinweis, dass die "Premium-Version" zwischen 1 und 5€ monatlich kosten soll, schließe ich aber, dass es sich doch um eine Clientanwendung handelt.

    Und dann muss das grundlegende Konzept so aussehen:
    Client (das zu lizenzierende Programm) fragt beim Server unter Verwendung der Anmeldedaten des Users oder einer einmaligen ID ab, ob die Version noch freigeschaltet ist. Dies sollte sinnvollerweise verschlüsselt (via SSL) erfolgen.
    Der Server verbindet sich unter Verwendung von Internen Anmeldedaten mit der Datenbank. Diese Anmeldedaten dürfen dem Client nicht bekannt gegeben werden, da dieser sonst kompletten Zugriff auf die Datenbank hätte.

    Anders formuliert:
    Ein Türsteher hat eine Liste, auf der steht, wer reindarf und wer nicht. Diese liegt in einem Tresor.
    Jetzt kommt ein Kunde. Der Türsteher wird jetzt wohl kaum dem Kunden den Code für den Tresor geben, dass dieser auf der Liste nachschauen kann, ob er reindarf oder nicht (und bei der Gelegenheit vl. gleich noch ein paar Namen mehr auf die Liste schreibt oder die ganze Liste klauen -> Datenschutz!).
    Nein, der Türsteher wird selbst zum Tresor gehen und nach Prüfung des Namens den Kunden entweder reinlassen oder nicht. Der Kunde kriegt die Daten für den Tresor natürlich nie, dann könnte man die Liste auch gleich weglassen.

    Insgesamt ist es dabei aber völlig egal, unter Verwendung welcher Programmiersprachen/Protokolle/whatever das abläuft. Am weitesten Verbreitet ist eben die o.g. Variante: Client via HTTP(S) > PHP-Script > mySQL-Datenbank. Und ja, das PHP-Script kriegst zu dann per FTP(S) auf euren Server. Das wars aber auch, für was anderes brauchst du das auf keinen Fall.
    Hauptsache ist: Der Kunde/Client kennt nicht die Liste selbst, sondern erhält nur die Info, ob er reindarf oder nicht.