{"id":55000975,"date":"2015-04-01T00:00:00","date_gmt":"2020-05-22T21:07:31","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=975"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Sicherer_RDBMSZugriff","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Sicherer_RDBMSZugriff\/","title":{"rendered":"Sicherer RDBMS-Zugriff"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/8ee328770e6449708687f9bbdfe4a5b5\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wenn Sie Verkn&uuml;pfungen auf die Tabellen oder Daten etwa einer SQL Server- oder MySQL-Datenbank anlegen, haben Sie zwei M&ouml;glichkeiten: Entweder Sie speichern die Verkn&uuml;pfung ohne Kennwort und geben Sie diese beim ersten Zugriff einer Sitzung jeweils erneut ein. Oder Sie speichern die Benutzerdaten im Klartext in der Datenbank. Das eine ist aufwendig, das andere unsicher. Dieser Beitrag zeigt einen Weg auf, wie Sie komfortabel und sicher auf die Daten Ihrer Backend-Datenbank zugreifen. Voraussetzung ist, dass Sie das Frontend in eine <b>.mde<\/b>&#8211; beziehungsweise <b>.accde<\/b>-Anwendung umwandeln.<\/b><\/p>\n<p>In den beiden Beitr&auml;gen <b>RDBMS-Tabellen manuell verkn&uuml;pfen <\/b>(<b>www.access-im-unternehmen.de\/973<\/b>) und <b>RDBMS-Tabellen per VBA verkn&uuml;pfen <\/b>(<b>www.access-im-unternehmen.de\/974<\/b>) haben wir uns verschiedene Methoden angesehen, wie Sie die Tabellen einer Datenbank, die von einem relationalen Datenbankmanagementsystem verwaltet wird, in eine Access-Datenbank einbinden und so auf die enthaltenen Daten zugreifen k&ouml;nnen.<\/p>\n<p>Die dort vorgestellten Techniken haben allerdings den Nachteil, dass der Benutzer entweder f&uuml;r jede neue Sitzung die Benutzerdaten neu eingeben oder aber diese unverschl&uuml;sselt in der Systemtabelle <b>MSys-Objects <\/b>speichern muss (dies gilt nat&uuml;rlich nicht f&uuml;r die Windows-Authentifizierung, die Sie allerdings nur mit dem Microsoft SQL Server nutzen k&ouml;nnen &#8211; f&uuml;r diesen Fall ben&ouml;tigen Sie die hier vorgestellten Techniken nicht).<\/p>\n<p>Grunds&auml;tzlich ist anzumerken, dass ein Frontend, das die Benutzerdaten f&uuml;r das RDBMS-Backend speichert, nur dann sicher ist, wenn sich der Benutzer immer vom Rechner, auf dem sich das Frontend befindet, abmeldet und diesen nicht unbeaufsichtigt l&auml;sst, wenn er eingeloggt ist.<\/p>\n<p>Au&szlig;erdem muss nat&uuml;rlich sichergestellt sein, dass der Zugriff auf die entsprechende Access-Datei nur dann m&ouml;glich ist, wenn der Benutzer sich an dem Rechner angemeldet hat.<\/p>\n<p><b>Konzept f&uuml;r ein sicheres Speichern der Benutzerdaten<\/b><\/p>\n<p>Wie aber wollen wir die Benutzerdaten &uuml;berhaupt sicher in der Frontend-Datenbank speichern Dazu nutzen wir eine zweistufige Sicherung. Die erste besagt, dass die Datenbank als <b>.mde<\/b>&#8211; oder <b>.accde<\/b>-Datenbank gesichert sein muss.<\/p>\n<p>Die zweite legt fest, dass die zu sichernden Daten, in diesem Fall der Benutzername und insbesondere das Kennwort, in verschl&uuml;sselter Form gespeichert werden sollen.<\/p>\n<p>Das w&auml;re grunds&auml;tzlich der Fall, wenn Benutzername und Kennwort im Quellcode fest codiert werden und die Datenbank als <b>.mde <\/b>oder <b>.accde <\/b>gesichert wird. Allerdings ist es wenig sinnvoll, Daten wie diese fest im Code zu verdrahten, da sich diese von Zeit zu Zeit &auml;ndern k&ouml;nnten.<\/p>\n<p>Wie also k&ouml;nnen wir solche Daten sicher in der Datenbank speichern und dem Benutzer dennoch die M&ouml;glichkeit geben, diese nach Wunsch zu &auml;ndern<\/p>\n<p>Das ist kein Problem: Wozu gibt es schlie&szlig;lich die Algorithmen zum Ver- und Entschl&uuml;sseln von Daten Also bauen wir einfach entsprechende Routinen in die Datenbank ein, die Benutzername und Kennwort nach der erstmaligen Eingabe beziehungsweise &auml;nderung verschl&uuml;sseln und so in einer Tabelle der Datenbank speichern. Bei der Anmeldung an das RDBMS soll die Anwendung die Daten dann wieder entschl&uuml;sseln und f&uuml;r die Anmeldung nutzen.<\/p>\n<p>Dabei darf man nat&uuml;rlich nicht au&szlig;er Acht lassen, dass es durchaus Dienstleister im Internet gibt, die das Entschl&uuml;sseln von <b>.mde<\/b>-Datenbanken anbieten.<\/p>\n<p><b>Alle Tabellen neu verkn&uuml;pfen<\/b><\/p>\n<p>Die sichere Speicherung der Benutzerdaten erfordert, dass die Verkn&uuml;pfung der Tabellen mit jeder neuen Sitzung neu erstellt werden muss. Sonst w&uuml;rden diese doch nicht unter Angabe der aktuellen Benutzerdaten ge&ouml;ffnet werden, oder<\/p>\n<p>Dies k&ouml;nnte man annehmen, aber es ist anders: Wenn Sie eine einzige Tabelle dieser Datenbank neu verkn&uuml;pfen, dann sind auch alle anderen Tabellen, f&uuml;r welche die gleichen Verbindungsdaten (also Server, Datenbank und Port) angegeben sind und f&uuml;r die die gleichen Benutzerdaten gelten, verf&uuml;gbar.<\/p>\n<p>Genau genommen brauchen Sie noch nicht einmal eine Tabelle der RDBMS-Datenbank zu &ouml;ffnen. Es reicht aus, wenn Sie innerhalb der aktuellen Sitzung eine DAO-Verbindung zu dieser Datenbank aufbauen. Sie brauchen diese auch nicht in einer entsprechenden Variablen aufzubewahren!<\/p>\n<p>Also werden wir mit den nachfolgend beschriebenen Techniken schlicht und einfach einmalig eine Verbindung zur Quelldatenbank herstellen.<\/p>\n<p>Ein denkbarer Fall, bei dem dies nicht ausreichen k&ouml;nnte, liegt vor, wenn das Frontend mit Tabellen aus verschiedenen RDBMS verkn&uuml;pft ist. Merkt sich Access dann tats&auml;chlich die Verbindungen zu verschiedenen RDBMS oder nur die zuletzt hergestellte Verbindung<\/p>\n<p>Wie ein Text mit verkn&uuml;pften Tabellen von verschiedenen Servern zeigt, ist Access hier durchaus flexibel: Wir haben die Verbindung zu beiden RDBMS aufgebaut und konnten die Tabellen, f&uuml;r die wir in einer vorherigen Sitzung entsprechende Verkn&uuml;pfungen erstellt haben, ohne erneute Anforderung der Benutzerdaten &ouml;ffnen.<\/p>\n<p>Im Rahmen des vorliegenden Beitrags wollen wir die L&ouml;sung jedoch nicht unn&ouml;tig kompliziert machen, da die meisten Frontends ihre Daten wohl nur aus einem einzigen RDBMS beziehen d&uuml;rften.<\/p>\n<p><b>Ablauf<\/b><\/p>\n<p>Sobald die Benutzerdaten einmal in der daf&uuml;r vorgesehenen Tabelle gespeichert sind, soll die Datenbankanwendung beim &ouml;ffnen einmalig die Verbindung zur angegebenen Tabelle herstellen.<\/p>\n<p>Gelingt diese Verbindung nicht, soll ein Formular zur Eingabe der Benutzerdaten ge&ouml;ffnet werden. Mit diesem kann der Benutzer dann Benutzername und Kennwort eingeben. Nach der Eingabe entscheidet er dann, ob die Daten nur in der daf&uuml;r vorgesehenen Tabelle gespeichert werden sollen oder ob die Verbindung auch neu hergestellt werden soll.<\/p>\n<p><b>Formular zur Eingabe der Benutzerdaten<\/b><\/p>\n<p>Das Formular zur Eingabe der Benutzerdaten soll <b>frmBenutzerdaten <\/b>hei&szlig;en. Es enth&auml;lt zwei Textfelder und drei Schaltfl&auml;chen.<\/p>\n<p>Die beiden Textfelder statten Sie mit den Namen <b>txtBenutzername <\/b>und <b>txtKennwort <\/b>aus. Die drei Schaltfl&auml;chen sollen <b>cmdSpeichern<\/b>, <b>cmdSpeichernUndVerknuepfen <\/b>und <b>cmdSchliessen <\/b>hei&szlig;en. Die Steuerelemente ordnen Sie etwa wie in Bild 1 an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_975_001.png\" alt=\"Formular zur Eingabe der Benutzerdaten\" width=\"420\" height=\"212,2678\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Formular zur Eingabe der Benutzerdaten<\/span><\/b><\/p>\n<p>Damit das Formular wie ein reiner Dialog aussieht, stellen Sie die Eigenschaften <b>Navigationsschaltfl&auml;chen<\/b>, <b>Datensatzmarkierer<\/b>, <b>Trennlinien <\/b>und <b>Bildlaufleisten <\/b>auf den Wert <b>Nein <\/b>ein. Au&szlig;erdem soll das Formular in der Mitte des Access-Fensters erscheinen, daher stellen Sie die Eigenschaft <b>Automatisch zentrieren <\/b>auf den Wert <b>Ja <\/b>ein.<\/p>\n<p>Damit andere Personen das Kennwort bei der Eingabe nicht ablesen k&ouml;nnen, passen wir das Textfeld <b>txtKennwort <\/b>noch so an, dass es statt des eingegebenen Textes ausschlie&szlig;lich das Sternchen-Zeichen anzeigt (<b>*<\/b>).<\/p>\n<p>Dazu klicken Sie einmalig in die Eigenschaft <b>Daten|Eingabeformat <\/b>des Eigenschaftsfensters und dann auf die nun erscheinende Schaltfl&auml;che mit den drei Punkten rechts neben der Eigenschaft.<\/p>\n<p>Dies &ouml;ffnet den Dialog aus Bild 2.<\/p>\n<p class=\"image\"><img loading=\"lazy\" decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_975_002.png\" alt=\"Aktivieren der sicheren Kennwort-Eingabe\" width=\"420\" height=\"280\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Aktivieren der sicheren Kennwort-Eingabe<\/span><\/b><\/p>\n<p>Nachdem Sie hier den Eintrag <b>Kennwort <\/b>ausgew&auml;hlt haben, k&ouml;nnen Sie direkt auf die Schaltfl&auml;che <b>Fertigstellen <\/b>klicken. Beim &ouml;ffnen des Formulars <b>frmBenutzerdaten <\/b>ersetzt dieses eingegebene Zeichen f&uuml;r das Kennwort durch das Sternchen (s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_975_003.png\" alt=\"Verdeckte Eingabe des Kennworts\" width=\"420\" height=\"132,0297\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Verdeckte Eingabe des Kennworts<\/span><\/b><\/p>\n<p>Nun schauen wir uns die Prozeduren an, die durch die verschiedenen Schaltfl&auml;chen ausgel&ouml;st werden.<\/p>\n<p>Die einfachste schlie&szlig;t einfach das Formular:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdSchliessen_Click()\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Interessanter ist schon die Schaltfl&auml;che, mit der wir die Benutzerdaten in der Tabelle <b>tblBenutzerdaten <\/b>speichern wollen.<\/p>\n<p>Diese enth&auml;lt nur eine einzige Anweisung, die aber eine weitere Routine namens <b>BenutzerdatenSpeichern <\/b>aufruft und dabei den Benutzernamen und das Kennwort aus den beiden Textfeldern &uuml;bergibt:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdSpeichern_Click()\r\n     BenutzerdatenSpeichern Nz(Me!txtBenutzername), _\r\n         Nz(Me!txtKennwort)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p>Die letzte Prozedur des Formulars speichert zuerst die Benutzerdaten und aktualisiert dann mit einem Aufruf der Routine <b>VerknuepfungenAktualisierenVerschluesselt <\/b>die Verbindung:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdVerknuepfen_Click()\r\n     BenutzerdatenSpeichern Nz(Me!txtBenutzername), _\r\n         Nz(Me!txtKennwort)\r\n     <span style=\"color:blue;\">If <\/span>VerknuepfungenAktualisierenVerschluesselt<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Verkn&uuml;pfung erfolgreich.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Tabelle zum Speichern der Benutzerdaten<\/b><\/p>\n<p>Die Tabelle zum Speichern der Benutzerdaten hei&szlig;t <b>tblBenutzerdaten <\/b>und enth&auml;lt nur zwei Felder &#8211; ein Prim&auml;rschl&uuml;sselfeld namens <b>BenutzerdatenID<\/b> sowie das Feld Benutzerdaten zum Speichern des verschl&uuml;sselten Textes mit dem Benutzernamen und dem Kennwort (s. Bild 4).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_975_004.png\" alt=\"Tabelle zum Speichern der Benutzerdaten in der Entwurfsansicht\" width=\"500\" height=\"322,1476\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Tabelle zum Speichern der Benutzerdaten in der Entwurfsansicht<\/span><\/b><\/p>\n<p><b>Benutzerdaten speichern<\/b><\/p>\n<p>Klickt der Benutzer auf eine der beiden Schaltfl&auml;chen <b>cmdSpeichern <\/b>oder <b>cmdVerknuepfen<\/b>, l&ouml;st dies die Prozedur <b>BenutzerdatenSpeichern<\/b> aus Listing 1 aus.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>BenutzerdatenSpeichern(strBenutzername<span style=\"color:blue;\"> As String<\/span>, strKennwort<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strVerschluesselt<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, strBenutzername & strKennwort, \"|\") = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strVerschluesselt = DecryptString(strBenutzername & \"|\" & strKennwort, \"aiu2015\")\r\n         <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n         db.Execute \"DELETE FROM tblBenutzerdaten\", dbFailOnError\r\n         db.Execute \"INSERT INTO tblBenutzerdaten(Benutzerdaten) VALUES(''\" & <span style=\"color:blue;\">Replace<\/span>(strVerschluesselt, \"''\", \"''''\") _\r\n             & \"'')\", dbFailOnError\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Benutzername und Kennwort d&uuml;rfen nicht das Zeichen ''|'' enthalten.\"\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Prozedur zum Speichern der Benutzerdaten<\/span><\/b><\/p>\n<p>Die Prozedur erwartet den zu kodierenden Benutzernamen und das Kennwort als Parameter. Da das Pipe-Zeichen (<b>|<\/b>) als Trennzeichen zwischen den beiden Ausdr&uuml;cken eingesetzt werden soll, d&uuml;rfen diese nat&uuml;rlich kein Pipe-Zeichen enthalten. Dies pr&uuml;ft die Prozedur gleich mit der <b>If&#8230;Then<\/b>-Bedingung zu Beginn.<\/p>\n<p>Dann stellt sie den zu verschl&uuml;sselnden Ausdruck zusammen, indem Sie den Wert aus <b>strBenutzername<\/b>, das Pipe-Zeichen und den Wert aus <b>strKennwort <\/b>mit <b>&#038; <\/b>verkn&uuml;pft. Der Ausdruck lautet dann beispielsweise <b>MeinBenutzername|MeinKennwort<\/b>.<\/p>\n<p>Diesen Ausdruck &uuml;bergibt sie dann zusammen mit einer weiteren Zeichenkette als Schl&uuml;ssel f&uuml;r die Kodierung an die Funktion <b>DecryptString<\/b>.<\/p>\n<p>Das Ergebnis dieser Funktion landet dann in der Variablen <b>strVerschluesselt<\/b>. Anschlie&szlig;end l&ouml;scht die Prozedur alle Datens&auml;tze der Tabelle <b>tblBenutzerdaten <\/b>und f&uuml;gt einen neuen Datensatz hinzu, dessen Feld <b>Benutzerdaten <\/b>den verschl&uuml;sselten Ausdruck als Wert erh&auml;lt.<\/p>\n<p>Sollte einer der beiden Parameter <b>strBenutzername<\/b> oder <b>strKennwort <\/b>das Pipe-Zeichen enthalten, weist die Prozedur den Benutzer mit einer entsprechenden Meldung darauf hin. Wenn die Benutzerdaten erfolgreich gespeichert wurden, zeigt die Tabelle diese wie in Bild 5 an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_975_005.png\" alt=\"Die verschl&uuml;sselten Benutzerdaten in der Tabelle tblBenutzerdaten\" width=\"420\" height=\"243,7578\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Die verschl&uuml;sselten Benutzerdaten in der Tabelle tblBenutzerdaten<\/span><\/b><\/p>\n<p><b>Ver- und entschl&uuml;sseln<\/b><\/p>\n<p>Die Funktion <b>DecryptString<\/b>, die wir in der obigen Prozedur zum Verschl&uuml;sseln der Zeichenkette verwenden, steckt im Modul <b>mdlEncrypt <\/b>und erwartet zwei Parameter: die zu verschl&uuml;sselnde Zeichenkette sowie einen Schl&uuml;sselausdruck, der daf&uuml;r sorgt, dass die gleiche zu verschl&uuml;sselnde Zeichenkette auf verschiedene Arten verschl&uuml;sselt werden kann.<\/p>\n<p>Diese Funktion nutzt die Funktion <b>Decrypt <\/b>der Klasse <b>CCrypt<\/b>, die wir im Beitrag <b>Datenverschl&uuml;sselung <\/b>(<b>www.access-im-unternehmen.de\/438<\/b>) vorgestellt haben.<\/p>\n<p>Zum Entschl&uuml;sseln des verschl&uuml;sselten Ausdrucks verwenden Sie die Funktion <b>EncryptString<\/b>, welche den verschl&uuml;sselten Ausdruck sowie den Schl&uuml;ssel als Parameter erwartet und den entschl&uuml;sselten Ausdruck zur&uuml;ckliefert.<\/p>\n<p><b>Verkn&uuml;pfung aktualisieren<\/b><\/p>\n<p>Nun folgt die Funktion <b>VerknuepfungenAktualisierenVerschluesselt<\/b>. Diese liefert einen <b>Boolean<\/b>-Wert zur&uuml;ck, der angibt, ob die Verbindung erfolgreich aktualisiert werden konnte (s. Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>VerknuepfungenAktualisierenVerschluesselt()<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strConnection<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBenutzername<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strKennwort<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strVerschluesselt<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strEntschluesselt<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngError<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strError<span style=\"color:blue;\"> As String<\/span>\r\n     strVerschluesselt = Nz(DLookup(\"Benutzerdaten\", \"tblBenutzerdaten\"))\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strVerschluesselt) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Es liegen keine Benutzerdaten vor. Bitte geben Sie diese im folgenden Formular ein.\"\r\n         DoCmd.OpenForm \"frmBenutzerdaten\", windowMode:=acDialog\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         strEntschluesselt = DecryptString(strVerschluesselt, \"aiu2015\")\r\n         strBenutzername = <span style=\"color:blue;\">Split<\/span>(strEntschluesselt, \"|\")(0)\r\n         strKennwort = <span style=\"color:blue;\">Split<\/span>(strEntschluesselt, \"|\")(1)\r\n         strConnection = strConnection & \"ODBC;\"\r\n         strConnection = strConnection & \"DRIVER={MySQL ODBC 5.2 ANSI Driver};\"\r\n         strConnection = strConnection & \"SERVER=85.214.142.26;\"\r\n         strConnection = strConnection & \"DATABASE=amvshop_sw;\"\r\n         strConnection = strConnection & \"NO_PROMPT=1;\"\r\n         strConnection = strConnection & \"UID=\" & strBenutzername & \";\"\r\n         strConnection = strConnection & \"PWD=\" & strKennwort & \";\"\r\n         <span style=\"color:blue;\">If <\/span>VerbindungTesten(strConnection, lngError, strError)<span style=\"color:blue;\"> Then<\/span>\r\n             VerknuepfungenAktualisierenVerschluesselt = <span style=\"color:blue;\">True<\/span>\r\n             Application.RefreshDatabaseWindow\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             If <span style=\"color:blue;\">MsgBox<\/span>(\"Verbindung fehlgeschlagen:\" & <span style=\"color:blue;\">vbCrLf<\/span> & \"Fehler: \" & Err.Number & <span style=\"color:blue;\">vbCrLf<\/span> & \"Beschreibung: \" _\r\n                     & <span style=\"color:blue;\">vbCrLf<\/span> & strError & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> & \"Benutzerdaten neu eingeben\", vbYesNo) = vbYes Then\r\n                 DoCmd.OpenForm \"frmBenutzerdaten\", windowMode:=acDialog\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Funktion zum Aktualisieren der Verkn&uuml;pfungen<\/span><\/b><\/p>\n<p>Die Prozedur ermittelt zun&auml;chst per <b>DLookup <\/b>den Wert des Feldes <b>Benutzerdaten <\/b>aus der Tabelle <b>tblBenutzerdaten<\/b> und speichert diesen in der Variablen <b>strVerschluesselt<\/b>.<\/p>\n<p>Sollte <b>strVerschluesselt <\/b>leer sein, hat der Benutzer offensichtlich keine Benutzerdaten gespeichert. Die Prozedur &ouml;ffnet dann das Formular <b>frmBenutzerdaten<\/b>. Dieses enth&auml;lt ja selbst wieder die M&ouml;glichkeit, die Funktion <b>VerknuepfungenAktualisierenVerschluesselt <\/b>aufzurufen.<\/p>\n<p>Ist <b>strVerschluesselt <\/b>nicht leer, verwendet die Funktion die Routine <b>DecryptString<\/b>, um den Inhalt zu entschl&uuml;sseln. Dabei &uuml;bergibt sie logischerweise den gleichen Schl&uuml;ssel-Ausdruck, der bereits bei Verschl&uuml;sseln verwendet wurde.<\/p>\n<p>Das Ergebnis ist ein Ausdruck, der den Benutzernamen und das Kennwort getrennt durch das Pipe-Zeichen enth&auml;lt.<\/p>\n<p>Die beiden Elemente ermitteln wir mithilfe der <b>Split<\/b>-Funktion, welche den Ausdruck an der Stelle des Pipe-Zeichens aufteilt, in ein Array schreibt und aus diesem das nullte und erste Element in die Variablen <b>strBenutzername <\/b>und <b>strKennwort <\/b>schreibt.<\/p>\n<p>Nun f&uuml;gt die Prozedur die Verbindungszeichenfolge zusammen, wobei einige Elemente fest im Code verankert sind &#8211; zum Beispiel der Treiber, der Server und der Name der Datenbank.<\/p>\n<p>F&uuml;r eine flexiblere Anwendung w&uuml;rden wir diese Werte nat&uuml;rlich auch noch in einer Tabelle verwalten, damit diese bei Bedarf ge&auml;ndert werden k&ouml;nnen, ohne direkt eine neue Version der Datenbank herausgeben zu m&uuml;ssen. Aus Gr&uuml;nden der &uuml;bersichtlichkeit haben wir jedoch im Beispiel zu diesem Beitrag darauf verzichtet.<\/p>\n<p>Au&szlig;erdem f&uuml;gen wir der Verbindungszeichenfolge in <b>strConnection <\/b>noch folgenden Ausdruck hinzu:<\/p>\n<pre>NO_PROMPT=1;<\/pre>\n<p>Was es damit auf sich hat, kl&auml;ren wir sp&auml;ter auf.<\/p>\n<p>Der Benutzername und das Kennwort f&uuml;gen wir ebenfalls in die Verbindungszeichenfolge ein.<\/p>\n<p>Damit rufen wir nun die Funktion <b>VerbindungTesten<\/b> auf, welche die folgenden drei Parameter erwartet:<\/p>\n<ul>\n<li>die Verbindungzeichenfolge,<\/li>\n<li>eine leere Variable zum Zur&uuml;ckliefern der Nummer eines eventuell auftretenden Fehlers und<\/li>\n<li>die Beschreibung des Fehlers.<\/li>\n<\/ul>\n<p>Sollte die Funktion den Wert <b>True <\/b>zur&uuml;ckliefern, stellen wir auch den R&uuml;ckgabewert der Funktion <b>VerknuepfungenAktualisierenVerschluesselt <\/b>auf den Wert <b>True <\/b>ein.<\/p>\n<p>Falls nicht, liefert die Funktion eine Meldung mit dem Hinweis, dass die Verbindung fehlgeschlagen, ist und f&uuml;gt die Fehlernummer und die Fehlermeldung hinzu.<\/p>\n<p>Au&szlig;erdem fragt sie, ob der Benutzer die Benutzerdaten neu eingeben m&ouml;chte. Klickt der Benutzer hier auf die Schaltfl&auml;che <b>Ja<\/b>, soll wiederum das Formular zur Eingabe der Benutzerdaten erscheinen.<\/p>\n<p><b>Testen der Verbindung<\/b><\/p>\n<p>Die Funktion <b>VerbindungTesten <\/b>testet genau genommen nicht nur die Verbindung, sondern durch die Herstellung einer solchen zum Zwecke der Pr&uuml;fung kann diese auch f&uuml;r den Zugriff auf die bestehenden verkn&uuml;pften Tabellen auf Basis dieser Verbindung genutzt werden (s. Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>VerbindungTesten(strConnection<span style=\"color:blue;\"> As String<\/span>, <span style=\"color:blue;\">Optional<\/span> lngError<span style=\"color:blue;\"> As Long<\/span>, _\r\n         <span style=\"color:blue;\">Optional<\/span> strError<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = DBEngine.OpenDatabase(\"Test\", dbDriverNoPrompt, False, strConnection)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> Err.Number = 0<span style=\"color:blue;\"> Then<\/span>\r\n         lngError = Err.Number\r\n         strError = Err.Description\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     VerbindungTesten = <span style=\"color:blue;\">True<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Funktion zum Testen der Verbindung<\/span><\/b><\/p>\n<p>Sie erledigt nichts anderes, als ein <b>Database<\/b>-Objekt namens <b>db <\/b>mit der <b>OpenDatabase<\/b>-Methode zu f&uuml;llen. Dabei verwendet sie unter anderem den Wert <b>Test <\/b>als Name und die in <b>strConnection <\/b>gespeicherte Verbindungszeichenfolge als Parameter.<\/p>\n<p>Da hier ein Fehler auftritt, wenn der Verbindungsaufbau misslingt, deaktiviert die Prozedur die Fehlerbehandlung zuvor mit <b>On Error Resume Next<\/b>. Ob ein Fehler aufgetreten ist, pr&uuml;ft die Prozedur dann in einer <b>If&#8230;Then<\/b>-Bedingung, die den Wert von <b>Err.Number <\/b>mit dem Wert <b>0 <\/b>abgleicht.<\/p>\n<p>Ist dieser ungleich <b>0<\/b>, speichert die Funktion <b>Err.Number <\/b>im Parameter <b>lngError <\/b>und die Beschreibung aus <b>Err.Description <\/b>in <b>strError<\/b>. Danach wird die Funktion mit <b>Exit Function <\/b>verlassen, ohne zuvor den Funktionswert auf den Wert <b>True <\/b>einzustellen &#8211; was anderenfalls nat&uuml;rlich geschieht.<\/p>\n<p>Sollte der Verbindungstest fehlschlagen, erscheint &uuml;blicherweise ein Dialog des jeweiligen ODBC-Treibers, der zur Eingabe der korrekten Verbindungsinformationen auffordert. Unter MySQL sieht dieser beispielsweise wie in Bild 6 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_975_006.png\" alt=\"Beim Fehlschlagen einer Verbindung zeigt der ODBC-Treiber eine Meldung wie diese an.\" width=\"420\" height=\"401,6552\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Beim Fehlschlagen einer Verbindung zeigt der ODBC-Treiber eine Meldung wie diese an.<\/span><\/b><\/p>\n<p>Einen solchen Dialog wollen wir dem Benutzer unserer Datenbankanwendung nat&uuml;rlich nicht zumuten. Deshalb haben wir weiter oben den Parameter <b>NO_PROMPT=1; <\/b>zur Verbindungszeichenfolge hinzugef&uuml;gt.<\/p>\n<p>Auf diese Weise verhindern wir die Anzeige dieses Dialogs und k&ouml;nnen beim Scheitern des Verbindungsaufbaus eine eigene Fehlermeldung anbieten &#8211; und in der Folge das Formular <b>frmBenutzerdaten<\/b>, damit der Benutzer die Zugangsdaten korrigieren kann.<\/p>\n<p><b>Verbindung beim Start der Anwendung aufbauen<\/b><\/p>\n<p>Nun fehlt noch ein kleiner Schritt: Wir m&uuml;ssen die Verbindung direkt beim Starten der Datenbank aufbauen, damit der Benutzer gleich auf die Daten des RDBMS zugreifen kann.<\/p>\n<p>Das ist eine leichte Aufgabe: Dazu legen wir einfach ein Makro namens <b>AutoExec <\/b>an, das ja automatisch beim Start der Anwendung ausgef&uuml;hrt wird.<\/p>\n<p>Die einzige Makroaktion dieses Makros hei&szlig;t <b>Ausf&uuml;hrenCode<\/b> und l&ouml;st die Funktion <b>VerknuepfungenAktualisierenVerschluesselt <\/b>aus (s. Bild 7).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2015_02\/pic_975_007.png\" alt=\"Makro f&uuml;r den Verbindungsaufbau beim Start der Anwendung\" width=\"420\" height=\"217,377\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Makro f&uuml;r den Verbindungsaufbau beim Start der Anwendung<\/span><\/b><\/p>\n<p><b>Letzter Schritt: Umwandlung in eine .mde-\/.accde-Datei<\/b><\/p>\n<p>Die hier vorgestellten Techniken helfen nat&uuml;rlich nicht weiter, wenn Sie die Anwendung nicht in eine <b>.mde<\/b>&#8211; oder <b>.accde<\/b>-Datenbank umwandeln, die ja keinen Zugriff auf den Quellcode mehr zulassen.<\/p>\n<p>Im Anschluss an diesen Schritt besteht aber tats&auml;chlich keine M&ouml;glichkeit mehr, an die Zugangsdaten heranzukommen &#8211; au&szlig;er vielleicht, man findet jemanden, der einem die <b>.mde<\/b>-\/<b>.accde<\/b>-Datenbank wieder dekompiliert.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Die Techniken aus dem Beitrag <b>RDBMS-Tabellen per VBA verkn&uuml;pfen <\/b>(<b>www.access-im-unternehmen.de\/974<\/b>) haben wir um die M&ouml;glichkeit erweitert, eine Verbindung unter Verwendung der in einer Tabelle in verschl&uuml;sselter Form gespeicherter Benutzerdaten herzustellen.<\/p>\n<p>Dadurch muss der Benutzer die Zugangsdaten nun nicht mehr bei Beginn einer jeden Sitzung erneut eingeben. Auch f&uuml;r die unsichere M&ouml;glichkeit, die Benutzerdaten unverschl&uuml;sselt in der Tabelle <b>MSys-Ob-jects <\/b>mit den &uuml;brigen Verbindungsdaten zu speichern, bleibt uns hiermit erspart.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>SichererSQLServerZugriff.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{810F73D6-A3EB-442A-8ECF-6DB9693FF79C}\/aiu_975.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenn Sie Verkn&uuml;pfungen auf die Tabellen oder Daten etwa einer SQL Server- oder MySQL-Datenbank anlegen, haben Sie zwei M&ouml;glichkeiten: Entweder Sie speichern die Verkn&uuml;pfung ohne Kennwort und geben Sie diese beim ersten Zugriff einer Sitzung jeweils erneut ein. Oder Sie speichern die Benutzerdaten im Klartext in der Datenbank. Das eine ist aufwendig, das andere unsicher. Dieser Beitrag zeigt einen Weg auf, wie Sie komfortabel und sicher auf die Daten Ihrer Backend-Datenbank zugreifen. Voraussetzung ist, dass Sie das Frontend in eine .mde- beziehungsweise .accde-Anwendung umwandeln.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[66022015,662015,44000022],"tags":[],"class_list":["post-55000975","post","type-post","status-publish","format-standard","hentry","category-66022015","category-662015","category-SQL_Server_und_Co"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Sicherer RDBMS-Zugriff - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Sicherer_RDBMSZugriff\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Sicherer RDBMS-Zugriff\" \/>\n<meta property=\"og:description\" content=\"Wenn Sie Verkn&uuml;pfungen auf die Tabellen oder Daten etwa einer SQL Server- oder MySQL-Datenbank anlegen, haben Sie zwei M&ouml;glichkeiten: Entweder Sie speichern die Verkn&uuml;pfung ohne Kennwort und geben Sie diese beim ersten Zugriff einer Sitzung jeweils erneut ein. Oder Sie speichern die Benutzerdaten im Klartext in der Datenbank. Das eine ist aufwendig, das andere unsicher. Dieser Beitrag zeigt einen Weg auf, wie Sie komfortabel und sicher auf die Daten Ihrer Backend-Datenbank zugreifen. Voraussetzung ist, dass Sie das Frontend in eine .mde- beziehungsweise .accde-Anwendung umwandeln.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Sicherer_RDBMSZugriff\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:07:31+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/8ee328770e6449708687f9bbdfe4a5b5\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"15\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Sicherer_RDBMSZugriff\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Sicherer_RDBMSZugriff\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Sicherer RDBMS-Zugriff\",\"datePublished\":\"2020-05-22T21:07:31+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Sicherer_RDBMSZugriff\\\/\"},\"wordCount\":2617,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Sicherer_RDBMSZugriff\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/8ee328770e6449708687f9bbdfe4a5b5\",\"articleSection\":[\"2\\\/2015\",\"2015\",\"SQL Server und Co.\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Sicherer_RDBMSZugriff\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Sicherer_RDBMSZugriff\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Sicherer_RDBMSZugriff\\\/\",\"name\":\"Sicherer RDBMS-Zugriff - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Sicherer_RDBMSZugriff\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Sicherer_RDBMSZugriff\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/8ee328770e6449708687f9bbdfe4a5b5\",\"datePublished\":\"2020-05-22T21:07:31+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Sicherer_RDBMSZugriff\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Sicherer_RDBMSZugriff\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Sicherer_RDBMSZugriff\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/8ee328770e6449708687f9bbdfe4a5b5\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/8ee328770e6449708687f9bbdfe4a5b5\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Sicherer_RDBMSZugriff\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Sicherer RDBMS-Zugriff\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Sicherer RDBMS-Zugriff - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Sicherer_RDBMSZugriff\/","og_locale":"de_DE","og_type":"article","og_title":"Sicherer RDBMS-Zugriff","og_description":"Wenn Sie Verkn&uuml;pfungen auf die Tabellen oder Daten etwa einer SQL Server- oder MySQL-Datenbank anlegen, haben Sie zwei M&ouml;glichkeiten: Entweder Sie speichern die Verkn&uuml;pfung ohne Kennwort und geben Sie diese beim ersten Zugriff einer Sitzung jeweils erneut ein. Oder Sie speichern die Benutzerdaten im Klartext in der Datenbank. Das eine ist aufwendig, das andere unsicher. Dieser Beitrag zeigt einen Weg auf, wie Sie komfortabel und sicher auf die Daten Ihrer Backend-Datenbank zugreifen. Voraussetzung ist, dass Sie das Frontend in eine .mde- beziehungsweise .accde-Anwendung umwandeln.","og_url":"https:\/\/access-im-unternehmen.de\/Sicherer_RDBMSZugriff\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:07:31+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/8ee328770e6449708687f9bbdfe4a5b5","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"15\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Sicherer_RDBMSZugriff\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Sicherer_RDBMSZugriff\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Sicherer RDBMS-Zugriff","datePublished":"2020-05-22T21:07:31+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Sicherer_RDBMSZugriff\/"},"wordCount":2617,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Sicherer_RDBMSZugriff\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/8ee328770e6449708687f9bbdfe4a5b5","articleSection":["2\/2015","2015","SQL Server und Co."],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Sicherer_RDBMSZugriff\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Sicherer_RDBMSZugriff\/","url":"https:\/\/access-im-unternehmen.de\/Sicherer_RDBMSZugriff\/","name":"Sicherer RDBMS-Zugriff - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Sicherer_RDBMSZugriff\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Sicherer_RDBMSZugriff\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/8ee328770e6449708687f9bbdfe4a5b5","datePublished":"2020-05-22T21:07:31+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Sicherer_RDBMSZugriff\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Sicherer_RDBMSZugriff\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Sicherer_RDBMSZugriff\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/8ee328770e6449708687f9bbdfe4a5b5","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/8ee328770e6449708687f9bbdfe4a5b5"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Sicherer_RDBMSZugriff\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Sicherer RDBMS-Zugriff"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000975","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000975"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000975\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000975"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000975"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000975"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}