Heim >Backend-Entwicklung >PHP-Tutorial >PHP-Datenbanksicherheit – Design, Verbindung und Verschlüsselung

PHP-Datenbanksicherheit – Design, Verbindung und Verschlüsselung

伊谢尔伦
伊谢尔伦Original
2016-11-22 10:43:521962Durchsuche

Datenbank entwerfen

Der erste Schritt besteht im Allgemeinen darin, eine Datenbank zu erstellen, es sei denn, Sie verwenden einen Datenbankdienst eines Drittanbieters. Beim Erstellen einer Datenbank wird ein Eigentümer zugewiesen, der neue Anweisungen ausführt und erstellt. Normalerweise hat nur der Besitzer (oder Superuser) die Berechtigung, beliebige Vorgänge an Objekten in der Datenbank durchzuführen. Wenn Sie möchten, dass andere Benutzer es verwenden, müssen Sie ihnen die Erlaubnis erteilen.

Anwendungen sollten niemals das Datenbankeigentümer- oder Superuser-Konto verwenden, um eine Verbindung zur Datenbank herzustellen, da diese Konten beliebige Vorgänge ausführen können, z. B. das Ändern der Datenbankstruktur (z. B. das Löschen einer Tabelle) oder das Löschen des gesamten Datenbankinhalts.

Für jeden Aspekt des Programms sollten separate Datenbankkonten erstellt werden und nur sehr begrenzte Berechtigungen für Datenbankobjekte erteilt werden. Weisen Sie nur die Berechtigungen zu, die zum Ausführen ihrer Funktion erforderlich sind, um zu verhindern, dass derselbe Benutzer die Aufgaben eines anderen Benutzers ausführen kann. Selbst wenn ein Angreifer eine Programmschwachstelle ausnutzt, um Zugriff auf die Datenbank zu erhalten, kann er auf diese Weise nur denselben Einfluss haben wie das Programm.

Ermutigen Sie Benutzer, nicht die gesamte Transaktionslogik in Webanwendungen (d. h. Benutzerskripts) zu implementieren. Dies geschieht am besten auf Datenbankebene mithilfe von Ansichten, Triggern oder Regeln. Wenn das System aktualisiert wird, müssen neue Schnittstellen für die Datenbank geöffnet und alle Datenbank-Clients neu erstellt werden. Darüber hinaus können Trigger Felder transparent und automatisch verarbeiten und nützliche Informationen beim Debuggen von Programmen und beim Nachverfolgen von Fakten liefern.

Verbindung zur Datenbank herstellen

Der Verbindungsaufbau auf Basis der SSL-Verschlüsselungstechnologie kann die Sicherheit der Kommunikation zwischen dem Client und dem Server erhöhen, oder SSH kann auch zum Verschlüsseln der Verbindung zwischen dem Client verwendet werden und die Datenbank. Wenn diese Techniken verwendet werden, wird es für einen Angreifer schwierig, die Serverkommunikation zu überwachen oder an Datenbankinformationen zu gelangen.

Verschlüsseltes Speichermodell

SSL/SSH kann die zwischen dem Client und dem Server ausgetauschten Daten schützen, aber SSL/SSH kann die bereits in der Datenbank befindlichen Daten nicht schützen. SSL ist einfach ein Protokoll, das Netzwerkdatenströme verschlüsselt.

Wenn ein Angreifer direkten Zugriff auf die Datenbank erhält (unter Umgehung des Webservers), können sensible Daten offengelegt oder missbraucht werden, es sei denn, die Datenbank selbst schützt diese Informationen. Die Verschlüsselung von Daten innerhalb einer Datenbank ist eine wirksame Möglichkeit, diese Art von Risiko zu verringern, aber nur wenige Datenbanken bieten diese Verschlüsselungsfunktionen.

Für dieses Problem gibt es eine einfache Lösung, die darin besteht, einen eigenen Verschlüsselungsmechanismus zu erstellen und ihn dann im PHP-Programm zu verwenden. PHP verfügt über mehrere Erweiterungsbibliotheken, die dies tun können, wie z. B. Mcrypt und Mhash, die eine Vielzahl von Verschlüsselungsalgorithmen enthalten. Das Skript verschlüsselt die Daten vor dem Einfügen in die Datenbank und entschlüsselt sie beim späteren Extrahieren.

Für einige wirklich verborgene Daten können Sie die Verwendung eines Hash-Algorithmus in Betracht ziehen, wenn diese nicht in Form von Klartext vorliegen müssen (d. h. nicht angezeigt werden müssen). Das häufigste Beispiel für die Verwendung eines Hashing-Algorithmus besteht darin, den MD5-verschlüsselten Hash des Passworts in der Datenbank zu speichern, um das ursprüngliche Klartext-Passwort zu ersetzen.

Beispiel #1 Hash-Verschlüsselung des Passwortfeldes

<?php
    // 存储密码散列
    $query = sprintf("INSERT INTO users(name,pwd) VALUES(&#39;%s&#39;,&#39;%s&#39;);",
    pg_escape_string($username), md5($password));
    $result = pg_query($connection, $query);
    // 发送请求来验证用户密码
    $query = sprintf("SELECT 1 FROM users WHERE name=&#39;%s&#39; AND pwd=&#39;%s&#39;;",
    pg_escape_string($username), md5($password));
    $result = pg_query($connection, $query);
    if (pg_num_rows($result) > 0) {
        echo &#39;Welcome, $username!&#39;;
    } else {
        echo &#39;Authentication failed for $username.&#39;;
    }
?>


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn