• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Kundendaten in Datenbank schützen

SpecialFighter

Neues Mitglied
Hallo alle zusammen,

ich habe vor in Zukunft sensible Kundendaten in einer MYSQL Datenbank zu hinterlegen.
Nun meine Frage:

Wie kann ich diese Daten so gut wie nur möglich vor Angriffen schützen (am besten erst Mal nur kostenlose Möglichkeiten)
Ich dachte da schon an HTTPS - ist aber kostenpflichtig und erst Mal eine andere Sache.

Freue mich über eure Hilfe :)
 
Du kannst deinen Teil zum Schutz beitragen, indem du Scripte einsetzt, die auf Sicherheit wert legen und deine Daten vor unberechtigeten Zugriffen schützen. Nicht selber frickeln und dutzende Anfängerfehler einbauen (such hier mal nach Sql injection und Hinweisen, dass die geposteten Scripte unsicher sind).
Dein Hoster kann das Seinige tun, indem er z.B. auf PhPMyadmin verzichtet oder es zumindest abschaltbar macht, ordentliche Passwörter generiert und auf eine saubere Installation und ein gehärtetes System achtet.

Dein Hinweis, dass Https kostenpflichtig ist, lässt mich vermuten, dass dir Sicherheit eigentlich auch nicht so wichtig ist und du einen Freehoster suchst, der alles im Programm hat, alles kann und nichts dafür verlangt.
Vergiss es.....
 
nein nein.
sicherheit ist mir schon wichtig.

ich möchte aber erst mal alle kostenlose Möglichkeiten in Betracht ziehen und umsetzten und anschließend die kostenpflichtigen - step by step.

warum auf phpmyadmin verzichten?
damit arbeite ich nämlich im Moment.

Wie soll ich sonst meine Datenbanken verwalten?

Ich arbeite außerdem mit MYSQLi.
Ist das gut? oder eher mist?
 
Zuletzt bearbeitet:
PhpMyadmin ist immer wieder mal anfällig für Sicherheitslöcher, daher wäre es vorteilhaft, wenn man es abschalten könnte. Freehoster sind halt nicht alle sehr schnell, was Sicherheitsupdates angeht, manche arbeiten noch mit Uraltservern die schon lange nicht mehr mit Updates versorgt werden. Ist PhpMyadmin grotten alt, sind wahrscheinlich Sicherheitsrelevante Mängel vorhanden.

Verwalten, Ich mache das per ssh auf der Konsol oder schalte mir PhpMyadmin ein, warte die Daten und schalte danach wieder ab. PhpMyadmin hört hier nur auf eine bestimmte IP (meine) etc.

PHP ist generell ja kein Problem, nur muss man darauf achten, dass man keinen Code produziert, der Sicherhistlöcher erst aufreisst, also z.B. $_GET und $_POST Variablen ungeprüft übernimmt, kein mysql-real-escape-string() verwendet etc. Sprich Scripte verwenden, die auch auf Sicherheit wert legen.

Das Thema ist eigentlich unerschöpflich und Tips sind relativ schwer "mal eben schnell" zu geben.
 
also ich nutzt nicht das phpmyadmin vom hoster, da es nie aktualisiert wird, wie du schon gesagt hast.
Stattdessen leuft phpmyadmin auf meinem eigenen webspace, ist via htaccess gesichert und immer up to date.

aber schon mal vielen dank für die jetzigen tips.
wie schaut es denn mit mysqli aus.


ich nutzte immer diese variante (beispiel):

PHP:
<?php   if (isset( $_POST['submit'] )) {     // Maskierende Slashes aus POST Array entfernen     if (get_magic_quotes_gpc()) { $_POST = array_map( 'stripslashes', $_POST ); }     $name    = $_POST['name'];     $bereich = $_POST['bereich'];       // Neues Datenbank-Objekt erzeugen     $db = @new mysqli( 'localhost', 'root', '', 'tutorials' );     // Pruefen ob die Datenbankverbindung hergestellt werden konnte     if (mysqli_connect_errno() == 0)     {         $sql = 'INSERT INTO `moderatoren` (`name`, `bereich`) VALUES (?, ?)';         $eintrag = $db->prepare( $sql );         $eintrag->bind_param( 'ss', $name, $bereich );         $eintrag->execute();         // Pruefen ob der Eintrag efolgreich war         if ($eintrag->affected_rows == 1)         {             echo 'Der neue Eintrage wurde hinzugefügt.';         }         else         {             echo 'Der Eintrag konnte nicht hinzugefügt werden.';         }     }     else     {         // Es konnte keine Datenbankverbindung aufgebaut werden         echo 'Die Datenbank konnte nicht erreicht werden. Folgender Fehler trat auf: <span class="hinweis">' .mysqli_connect_errno(). ' : ' .mysqli_connect_error(). '</span>';     }     // Datenbankverbindung schliessen     $db->close(); }   ?>


ist das soweit sicher?
Meine Daten werden auch nur via POST weitergegeben - NIE mit GET.


Wie schaut es mit der Sicherheit von PHP SESSIONS aus.
Diese nutzter ich wenn der Kunde sich im Kundencenter anmeldet.

Ich lasse dann für den Kunden eine SESSION erstellen in der z.B. die Kundennummer so lang festgehalten wird, bis er sich wieder abmeldet.

Sicher? oder gibt es da eine bessere Möglichkeit?
 
$_POST und $_GET können immer bearbeitet werden, ich übergebe alles Sensible nahezu ausnahmslos über SESSIONS.
$name = $_POST['name']
und daraus wird dann ein SQL-Statement gebaut, an das man wunderbar Injections übergeben kann.
Wenn
$eintrag = $db->prepare( $sql )
da nicht alles behebt, was sicherheitsrelevant ist, hast du schon das erste Problem in deinem Code.

edit:
Uups, das kommt ja noch vor dem Setzen der Parameter.
$eintrag->bind_param( 'ss', $name, $bereich );
muss also alle relevanten Sicherheitsmängel beheben.
 
Zuletzt bearbeitet von einem Moderator:
ja genau so mach ichs auch.


ich scheitere im Moment an diesem Beispiel: phpBuddy.eu - Tutorial - MySQLi Erweiterung von PHP 5


Mein Quellcode sieht so aus:

PHP:
if (mysqli_connect_errno() == 0)
{
    // Multi-Query zusammenstellen
    $sql  = 'SELECT COUNT(ID) as `angebote_count` FROM `angebote` WHERE `kundennummer` = "'.$_SESSION['kundennummer'].'";';
    $sql .= 'SELECT COUNT(ID) as `rechnungen_count` FROM `rechnungen` WHERE `kundennummer` = "'.$_SESSION['kundennummer'].'";';
    $sql .= 'SELECT COUNT(ID) as `lizenzen_count` FROM `lizenzen` WHERE `kundennummer` = "'.$_SESSION['kundennummer'].'";';
    if ($db->multi_query( $sql ))
    {
        do
        {
            // Erstes Abfrageergebnis ausgeben
            if ($ergebnis = $db->store_result())
            {
                // Abfrageergebnis ausgeben
                while ($zeile = $ergebnis->fetch_object())
                {
                    $_SESSION['angebote_count'] = $zeile->angebote_count;
                    $_SESSION['rechnungen_count'] = $zeile->rechnungen_count;
                    $_SESSION['lizenzen_count'] = $zeile->lizenzen_count;
                }
                $ergebnis->close();
            }
        } while ($db->next_result());
    }
}
else
{
    // Es konnte keine Datenbankverbindung aufgebaut werden
    echo 'Die Datenbank konnte nicht erreicht werden. Folgender Fehler trat auf: <span class="hinweis">' .mysqli_connect_errno(). ' : ' .mysqli_connect_error(). '</span>';
}
// Datenbankverbindung schliessen
$db->close();


ich erhalte immer nur einen wert, obwohl es drei werte sein müssten. wieso?
 
Zuletzt bearbeitet:
Du führst ja nur ein Statement aus, nämlich das letzte was vor
PHP:
if ($db->multi_query( $sql ))
steht. Wenn Du Ergebnisse aller 3 Statements haben willst, kannst Du sie entweder miteinander verbinden zu einem Statement (ob und wie das geht hängt von deinem Datenbankmodell ab) oder alle einzeln nacheinander ausführen.

Was bisher an Tipps noch nicht genannt wurde: MySQL-Zugangsdaten sollten nur für localhost gelten, d.h. die Datenbank sollte auf dem selben Server laufen wie die Webseite. Bei 1und1 und anderen Hostern findet man leider noch auf externen Datenbankservern laufende Datenbanken die dann nicht über localhost sondern 123.example.com angesprochen werden müssen. Das solltest Du vermeiden, wenn Du auf Sicherheit setzen willst.

Außerdem solltest Du, falls vorhanden, Passwörter in der Datenbank verschlüsseln und salzen. Damit erhöhst Du die Schwierigkeit Passwörter auszulesen, wenn einmal jemand zu der Datenbank Zugriff haben sollte.
 
Zurück
Oben