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.
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…
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: ' .mysqli_connect_errno(). ' : ' .mysqli_connect_error(). ''; } // Datenbankverbindung schliessen $db->close(); } ?>
[/PHP]
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.
Du führst ja nur ein Statement aus, nämlich das letzte was vor [php]if ($db->multi_query( $sql ))[/php] 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.