Wie kann ich meine Webeite sicherer machen? PHP
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
achtung
angriff
benutzer
code
datenbank
datum
ftp
http
jemand
laufen
machen
manual
nutzen
problem
software
system
url
verbindung
webseite
zugriff
-
Hey wollte mal kurz was nachfragen.
Und zwar habe ich in einer anderen Website, die ich aus Schulgründen erstellt habe ziemlich viel PHP verwendet und mich würde mal interessieren wie ich das absichern kann, also das sich da keinen so schnell reinhackt.
LG Jonas -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hi Jonas.
Es gibt einige Angriffsszenarien, die du als PHP-Entwickler kennen musst. Wenn du mit Daten vom Benutzer arbeitest (also $_GET, $_POST, $_COOKIE, $_SERVER, Dateiuploads) musst du beispielsweise entsprechende Sorgfalt walten lassen und diese je nach Verwendung passend maskieren.
Eine gute Übersicht über mögliche Angriffe bietet Wikipedia:
https://de.m.wikipedia.org/wiki/Sicherheit_von_Webanwendungen#Angriffsmethoden
Zu jedem dieser Angriffe gibt es dann wiederum einen ganzen Artikel.
Wenn du alle dort aufgeführten Angriffe verstanden und abgewehrt hast, dann hast du schon eine sehr sichere Seite.
Für ein kleineres Projekt kannst du die unteren drei Angriffe durchaus ignorieren. Also Man-in-the-Browser, Denial-of-Service und Phishing. Diese sind sehr schwer bis unmöglich serverseitig abzuwehren. -
jonas-cramer-pictures schrieb:
...
Und zwar habe ich in einer anderen Website, die ich aus Schulgründen erstellt habe ziemlich viel PHP verwendet und mich würde mal interessieren wie ich das absichern kann, also das sich da keinen so schnell reinhackt.
LG Jonas
Deine kleine Frage ist ein großes Thema.
Weil du leider keine konkreten Angaben darüber machst, was geschützt/abgesichert werden soll, kann ich dir nur allgemeine Antworten geben.
1.) Dateien und Ordner schützt du am besten mit .htaccess;https://www.lima-city.de/hilfe/wie-kann-ich-ein-verzeichnis-mit-einem-passwort-schuetzen
2.) Passwörter verschlüsseln
$passwort = 'MeinGeheimesPasswort';
$hash = password_hash($passwort, PASSWORD_DEFAULT);http://php.net/manual/de/function.password-hash.php
3.) Daten aus Logins und Kontaktformularen genauestens überprüfen.
Einträge in die Datenbank und Abfragen über PDO oder mysqli.
4.) Dateiupload streng kontrollieren und nur eingeschränkt erlauben..
und, und, und...
Ausserdem: teste deine inputs auch die versteckten mit z.B.<script>alert('XSS-Attacke erfolgreich');</script>
Öffnet sich ein popup, dann mußt du handeln. Es sollten keine Fehlermeldungen ausgegeben werden. Für potenzielle Angreifer liefern Errors wichtige Informationen.
Entferne, falls in deinen Scripten vorhanden,ini_set('display_errors', 1); error_reporting(E_ALL);
oder ähnliches. -
timebandit schrieb:
2.) Passwörter verschlüsseln
$passwort = 'MeinGeheimesPasswort';
$hash = password_hash($passwort, PASSWORD_DEFAULT);http://php.net/manual/de/function.password-hash.php
3.) Daten aus Logins und Kontaktformularen genauestens überprüfen.
Einträge in die Datenbank und Abfragen über PDO oder mysqli.
Achtung, Passwörter hashen ist nicht ganz so einfach, wie es klingt. Algorithmen können unsicher sein und man muss wissen, was man mit dem Salt macht etc. Zusätzlich musst du nach den neuen Bestimmungen sogar evtl. die DGSVO beachten...
Das gilt vor allem für Kontaktformulare :)
Und wenn du mysqli nutzt, sind prepared Statements sehr gut -
fs-host schrieb:
timebandit schrieb:
2.) Passwörter verschlüsseln
$passwort = 'MeinGeheimesPasswort';
$hash = password_hash($passwort, PASSWORD_DEFAULT);http://php.net/manual/de/function.password-hash.php
3.) Daten aus Logins und Kontaktformularen genauestens überprüfen.
Einträge in die Datenbank und Abfragen über PDO oder mysqli.
Achtung, Passwörter hashen ist nicht ganz so einfach, wie es klingt. Algorithmen können unsicher sein und man muss wissen, was man mit dem Salt macht etc. Zusätzlich musst du nach den neuen Bestimmungen sogar evtl. die DGSVO beachten...
Das gilt vor allem für Kontaktformulare :)
Und wenn du mysqli nutzt, sind prepared Statements sehr gut
Achtung, Passwörter hashen ist nicht ganz so einfach, wie es klingt. Algorithmen können unsicher sein und man muss wissen, was man mit dem Salt macht etc.
Im PHP-Manual(siehe obigen Link) steht z.B.
Warnung
Die salt Option wurde von PHP 7.0.0 an missbilligt. Es wird nun empfohlen einfach das Salt zu verwenden, dass standardmäßig erzeugt wird.
Achtung
It is strongly recommended that you do not generate your own salt for this function. It will create a secure salt automatically for you if you do not specify one.
Achtung
As noted above, providing the salt option in PHP 7.0 will generate a deprecation warning. Support for providing a salt manually may be removed in a future PHP release.
Wer also mit salt hantieren möchte, der proggt in der Vergangenheit.
Zusätzlich musst du nach den neuen Bestimmungen sogar evtl. die DGSVO beachten...
Das hat mit dem Thread nichts zu tun. Hier geht es um Server- bzw. Datenbanksicherheit und nicht um Verbraucherschutz.
Und wenn du mysqli nutzt, sind prepared Statements sehr gut
Da hast du absolut recht. -
Wird ja aber trotzdem noch ein Salt verwendet, der ist im Hash, der zurückkommt enthalten, um password_verify anschließend richtig anwenden zu können.
Ich wollte auch nur grundsätzlich sagen, dass das Thema ein gewisses Risiko birgt, dass unterschätzt werden kann durch die einfachen Funktionen. :) -
Jedoch macht es kein sinn wenn man ein passwort ohne salt zu einem hash macht denn so können die wenn deine datenbank gehackt wurde einfach mit einer liste verglichen werden und schon hast du das passwort (oder das was den selben hash bringt)
der hash der von PHP erzeugt wird ist mehr als sicher genug
(kann sein das irgendwo ein T fehlt denn meine tastatur hat probleme mit dieser taste) -
oruam19 schrieb:
Wenn du willst, kann ich versuchen, mich reinzuhacken... Vielleicht finde ich ja noch eine Sicherheitslücke
Das muss abgesprochen werden mit dem Hoster und dem Betreiber der website. Auch würde ich das schriftlich bestätigt bekommen. So "einfach mal so wenn du willst" ist höllisch strafbar und bringt im schlimmsten fall mehrere Jahre knast mit sich.
Zurück zum Thema.
Du hast schon den ersten richtigen Schritt gemacht. Du hast dir einen Hoster gesucht und nicht auf einen Eigenden Rechner bzw Root Server. Der hoster regelt die Sicherheit und das Rechenzentrum der 23Media GmbH bzw. Hetzner AG wo Lima City die Server leiht sichert schon mal die Hardware.
Das Zweite:
Verwende für Jede andere Webseite eine eigene Datenbank. Nicht alles auf einer laufen lassen. Klar ist billiger und weniger zeit aufwendig aber wenn sich jemand in deine Webseite gehackt hat dann laufen deine anderen Webseiten noch einwandfrei.
Das Dritte:
verwende eine PHP Software (Die du ja anscheinden benutzt wie ich sehe ;)). Wenn es um punkto sicherheit geht sollte man ein CMS system etc. verwenden. Diese haben einen besseren schutz als würde man diese selbst einbauen. Es sei denn, man kennt sich so gut aus.
ABER: Es gibt eigentlich kaum etwas was sich auf deiner Webseite lohnen würde zu hacken. Dafür ist die zeit eines Hackers zu kostbar deine Bilder zu klauen oder zu löschen. Ich hab bis jetzt kaum über solche Hacking angriffe gehört wo webseiten lahmgelegt worden sind oder irgendwie abgeändert. Bis auf das von Anonymous mit den IS Webseiten wo werbung für Viagra gemacht wurde. Phishing oder so ist eher wahrscheinlicher wenn man eine ähnliche webseite wie deiner erstellen würde, was in deinem Fall sehr unwahrscheinlich ist.
Also um Hacking oder DDOS angriffe brauchst du dir wirklich kaum sorgen machen. Lima City ist DDOS gesichert und Hacking ist auch nicht so einfach möglich als leihe.
Beitrag zuletzt geändert: 4.6.2018 19:03:44 von bruchpilotnr1 -
bruchpilotnr1 schrieb:
Verwende für Jede andere Webseite eine eigene Datenbank. Nicht alles auf einer laufen lassen. Klar ist billiger und weniger zeit aufwendig aber wenn sich jemand in deine Webseite gehackt hat dann laufen deine anderen Webseiten noch einwandfrei.
Das ist - zumindest hier - absoluter Blödsinn und erzeugt nur ein Gefühl von Sicherheit. Hier gibt es nur 1 Benutzer und der hat Zugriff auf alle Datenbanken.
Bei einem Angriff ist es kein Problem alle Datenbanken auszulesen auf die der genutzte User Zugriff hat. Mit den Infos kann der Angreifer auch andere Datenbanken verändern, löschen.
Edit: Davon abgesehen ist es aber natürlich trotzdem aus Backup- und Übersichtsgründen zu empfehlen nicht alles in eine DB zu packen.
ABER: Es gibt eigentlich kaum etwas was sich auf deiner Webseite lohnen würde zu hacken. Dafür ist die zeit eines Hackers zu kostbar deine Bilder zu klauen oder zu löschen. Ich hab bis jetzt kaum über solche Hacking angriffe gehört wo webseiten lahmgelegt worden sind oder irgendwie abgeändert.
Da wirst du auch nicht viel hören. Angriffe auf kleine Webseiten schaffen es nur in die Medien wenn das große, automatisierte Wellen sind.
Zum Großteil geht es ja auch nicht darum dem Webseiteninhaber zu schaden sondern darum eigene Inhalte für z.B. E-Mail-Spam oder Phising von z.B. Paypal-Konten zu platzieren.
Also um Hacking oder DDOS angriffe brauchst du dir wirklich kaum sorgen machen. Lima City ist DDOS gesichert und Hacking ist auch nicht so einfach möglich als leihe.
Ein DDoS-Schutz bedeutet noch lange keinen Schutz vor z.B. SQL-Injections. Dafür gibt's extra Web Application Firewalls.
Wichtig auf jeden Fall: CMS und Addons immer aktuell halten.
Das alles bringt allerdings auch nix, wenn man Zugangsdaten im Klartext überträgt. Also schaue mal, ob du auch FTPS und nicht nur FTP nutzt.
MySQL über externe Clients wie HeidiSQL kann auch zum Problem werden, da auch hier unverschlüsselte Übertragung. Also wenn möglich nur das bereits installierte phpmyadmin via https nutzen oder über SSH tunneln.
Analog dazu natürlich auch EMails von Accounts - an die man sich Zugangsdaten schicken kann - nur über verschlüsselte Verbindungen abrufen und versenden.
Beitrag zuletzt geändert: 4.6.2018 14:22:21 von muellerlukas -
muellerlukas schrieb:
Hier gibt es nur 1 Benutzer und der hat Zugriff auf alle Datenbanken.
Bei einem Angriff ist es kein Problem alle Datenbanken auszulesen auf die der genutzte User Zugriff hat. Mit den Infos kann der Angreifer auch andere Datenbanken verändern, löschen.
Also dann hat Jonas ja keine schuld, sollte die Datenbank tatsächlich irgendwie gehackt werden. Wenn man nur auch als Free kunde mehrere FTP Und MySQL Benutzer anlegen könnte und diese eine datenbank jeweils zuweisen könnte, dann wäre wohl meine Theorie wohl richtig gewesen.
Aber immerhin gibt es die möglichkeit wenn man Premiumkunde ist.
-
Ich gehe mal davon aus, dass klar ist das sich "1 Benutzer mit Zugriff auf alle Datenbanken" auf den Webhostingaccount nicht nicht auf ganz Lima bezieht. ;)
bruchpilotnr1 schrieb:
Also dann hat Jonas ja keine schuld, sollte die Datenbank tatsächlich irgendwie gehackt werden.
Natürlich trägt er eine Mitschuld. Irgendwie muss der Angreifer ja erst mal an Jonas' Zugangsdaten gekommen sein. Und zu 99% ist das nicht auf einen Fehler vom Hoster sondern auf einen vom Kunden zurück zu führen.
Das durch so ein Design Angreifer andere Projekte auf dem gleichen Account übernehmen können steht auf einem anderen Blatt.
Man könnte natürlich für jedes Projekt einen eigenen Lima-Account anlegen. Gerade wenn man aber einen Premium-Account oder eine Domain im anderen Account hat wird das unschön/unpraktisch.
Aber immerhin gibt es die möglichkeit wenn man Premiumkunde ist.
Ich hatte bis Anfang 2017 Premium. Dort gab es mehrere FTP-Accounts und unbegrenzt MySQL-Datenbanken. Aber immer noch nur 1 MySQL-Nutzer. Hat sich das mittlerweile geändert? -
muellerlukas schrieb:
Ich hatte bis Anfang 2017 Premium. Dort gab es mehrere FTP-Accounts und unbegrenzt MySQL-Datenbanken. Aber immer noch nur 1 MySQL-Nutzer. Hat sich das mittlerweile geändert?
Mhh also soweit ich sehe ist nur unbegrenzte Datenbanken aber immer noch einen account vorhanden bei den Paketen.
Das müsste eigentlich möglich sein. Wenn FTP Accounts unbegrenzt sind müssten Datenbank Accounts auch unbegrenzt möglich sein. Dann Kann das zb so aussehen USER1234567_1 usw. Das wäre sehr Praktisch. Getrennte Accounts wären definitiv sicherer.
Ich denke mal das Jonas nicht leichtgläubig sein wird und keine Daten an jemanden anderen weiterzugeben. Das wäre dann seine schuld. Ist ja auch in den AGBs vereinbart, dass man die Daten geheim halten muss und diese nicht weitergeben darf.
Da hast du recht. -
bruchpilotnr1 schrieb:
Das müsste eigentlich möglich sein. [...] Dann Kann das zb so aussehen USER1234567_1 usw. Das wäre sehr Praktisch. Getrennte Accounts wären definitiv sicherer.
Möglich: Natürlich. Müsste man halt wieder einiges am System ändern.
Aktuell läufts ja so:
Die DBs heißen db_{USERID}_##, der User eben USER{USERID}. Den User erzeugt man einmal bei der Registrierung und er hat halt dann Zugriff auf db_{USERID}_% (% ist in dem Falle, wie bei MySQL üblich n Platzhalter).
Für existierende User lässt sich das System halt schlecht ändern. Dann ist das Geschrei wieder groß weil man die Zugangsdaten im Script anpassen muss.
Allerdings: Spätestens wenn PHP 5.6 fliegt müssen wohl viele, viele User mal an ihre Scripte ran. Stichwort: mysql
Da könnte man das gleich mit umsetzen.
Ich denke mal das Jonas nicht leichtgläubig sein wird und keine Daten an jemanden anderen weiterzugeben. Das wäre dann seine schuld. Ist ja auch in den AGBs vereinbart, dass man die Daten geheim halten muss und diese nicht weitergeben darf.
Es geht ja nicht nur um Leichtgläubigkeit. Auch um Leichtsinn: Wie eben z.B. unverschlüsselte Verbindung in einem öffentlichen WLAN zu nutzen. Oder eben auch seine Software nicht aktuell zu halten. Dann kann das durchaus passierer dass durch nen Joomla-Bug jemand einfach die Config ausliest und die Zugangsdaten hat. ;) -
muellerlukas schrieb:
Allerdings: Spätestens wenn PHP 5.6 fliegt müssen wohl viele, viele User mal an ihre Scripte ran. Stichwort: mysql
Da könnte man das gleich mit umsetzen.
Aber wenn 5.6 bald eh rausfliegt warum macht man das nicht jetzt? Einfach an alle Eine Rundmail und einmal benachrichtigen was demnächst zu tun ist. Dann hat man das Problem in ein paar monaten oder Jahren, je nachdem wie lange 5.6 laufen wird, nicht mehr.
Es geht ja nicht nur um Leichtgläubigkeit. Auch um Leichtsinn: Wie eben z.B. unverschlüsselte Verbindung in einem öffentlichen WLAN zu nutzen. Oder eben auch seine Software nicht aktuell zu halten. Dann kann das durchaus passierer dass durch nen Joomla-Bug jemand einfach die Config ausliest und die Zugangsdaten hat. ;)
Sehe ich genauso. Ich kenne HotSpotShield. Das ist ein VPN Client der kostenlos die W-LAN Verbindung absichern soll und zeitgleich alle anfragen über einen USA Proxy weiter leitet. Meinst du soeine art verschlüsselng oder wie hast du dir das gedacht im öffentlichem wlan? Und Software, die die sicherheit verbessern sollen ich denke dass das absolut logisch ist diese Aktuell halten zu müssen. Firewall und Antiviren lasse ich jeden tag Updaten. Avast nutze ich und hab einen stillen modus. Ich muss gar nichts mehr machen das macht die software ganz von selbst. Ich bin sehr Updatefaul deswegen würde ich sowas jedem Raten. -
muellerlukas schrieb:
Für existierende User lässt sich das System halt schlecht ändern. Dann ist das Geschrei wieder groß weil man die Zugangsdaten im Script anpassen muss.
Allerdings: Spätestens wenn PHP 5.6 fliegt müssen wohl viele, viele User mal an ihre Scripte ran. Stichwort: mysql
Da könnte man das gleich mit umsetzen.
Der Termin ist ja klar: 31.12.2018 (siehe http://php.net/supported-versions.php). -
mein-wunschname schrieb:
Der Termin ist ja klar: 31.12.2018 (siehe http://php.net/supported-versions.php).
Heißt nur: Die offizielle Unterstützung endet da.
Es gibt diverse Hoster die (manche wollen sogar einen Aufpreis von bis zu 5 €/Monat) alte Versionen anbieten und Patches eben selbst einpflegen. Das ist der "Vorteil" von Open Source. ;)
Jetzt vom Supportende einen klaren Umstellungstermin abzuleiten finde ich doch etwas gewagt.
Edit:
bruchpilotnr1 schrieb:
Meinst du soeine art verschlüsselng oder wie hast du dir das gedacht im öffentlichem wlan?
Es reicht einfach SSL-Verschlüsselung zu nutzen. Wie gesagt: Es gibt hier FTPS und es gibt hier https-Zugriff auf ein vorinstalliertes phpmyadmin. Auch die Mails lassen sich verschlüsselt abrufen.
Beitrag zuletzt geändert: 5.6.2018 10:56:27 von muellerlukas -
Hallo,
Falls du html Formular verwendest solltest du bei der auswertung auf folgenden Befehl achten:
$email = htmlentities($_POST['email']);
wobei email nur ein Beispiel ist.
Bei einem Loginskript solltest du folgendes verwenden:
<?php header("X-XSS-Protection: 1; mode=block"); ?>
für weitere nützliche Infos schreib mir doch einfach eine Nachricht
gruss elekdstj -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage