Worauf bei Backend Sicherheit achten?
Phil, Ph.D.
- mysqli
- php
Hallo,
Ich arbeite an einem Login-System in klassischer Konfiguration, daher Backend PHP mit mySQL Datenbank.
Kurze Frage dazu: worauf muss ich bezüglich Sicherheit achten?
Gibt es außer Prepared Statements und Passwort Hashing & Salting weitere Themen?
(läuft nicht auf eigenem Server sondern bei einem professionellen Hosting Provider, also zumindest das Thema Serverkonfiguration ist schon mal raus)
Danke!
also zumindest das Thema Serverkonfiguration ist schon mal raus
Das kann je nach Hoster böse enden.
Gibt es außer Prepared Statements und Passwort Hashing & Salting weitere Themen?
HTTPS, HTTPS erzwingen, POST erzwingen, Session-ID nicht in der URL übermitteln, User- oder fremdgenerierte Inhalte machen im Zusammenhang mit JS und CSS womöglich weitere Probleme, verschlüsselte Kommunikation zwischen PHP und Datenbankserver, … (endlose Liste)
GOTT SEI DANK bin ich hier offensichtlich nicht der einzige, der enormen Respekt vor der Thematik zu haben scheint (deswegen eben auch dieses Posting) XD
So, wie ich die Diskussion darüber aufgenommen habe, wurde sie depubliziert, weil es uns zu heikel wurde, dafür die Verantwortung zu tragen.
Ich bin prinzipiell kein Mensch, der mit Pauschalverurteilungen um sich schmeißt, sondern der sich mittels konkreter Problemanalyse ein Urteil fällt. Ich erkläre auch gerne ausdrücklich, dass ich hier verbreitete Ratschläge als das interpretiere, was sie eben auch sind - unverbindliche Meinungen unter Auschluss jeglicher Haftungsansprüche - wäre ja noch schöner, wenn hier jemand dafür, dass er anderen unentgeltliche Hilfeleistungen anbietet, vielleicht auch noch angepöbelt wird oder gar Probleme bekommt (zumal für diesbezügliches entsprechendes Know How gut und gerne leicht zehntausende an Euros draufgehen) - ich wage zu behaupten, da nicht naiv zu sein 😉
HTTPS, HTTPS erzwingen, POST erzwingen, Session-ID nicht in der URL übermitteln, User- oder fremdgenerierte Inhalte machen im Zusammenhang mit JS und CSS womöglich weitere Probleme, verschlüsselte Kommunikation zwischen PHP und Datenbankserver, … (endlose Liste)
Danke dafür!
Was meinst du genau mit POST erzwingen?
...Kommunikation zwischen PHP und Datenbankserver denke (hoffe) ich, dass sie von meinem Hosting Provider professionell gemanaget wird, hatte da außer serverseitiger Verbindung (mysqli_connect()
) mit der Datenbank und SQL Anweisungen an selbige nicht viel vor... ...lasse mich GERNE eines Besseren belehren!
P.S.: Das ganze System kommt in keinem allzu sensiblen Bereich zum Einsatz - ich bin mir derzeit noch nicht mal im Klaren darüber, ob ich überhaupt ein Passwort benötige oder Usernamen in Verbindung mit einer einfach zuordenbaren ID nicht komplett ausreichen. Anders ausgedrückt: keine Sorge, mein Projekt wird in nächster Zeit keine Flugzeuge vom Himmel stürzen lassen.
Lieber Phil,,
Was meinst du genau mit POST erzwingen?
bei GET-Requests werden die Daten im URL-String mitgeliefert:
<form action="login.php">
<label for="login">Login: <input id="login" name="login"></label>
<label for="pw">Pass: <input id="pw" name="pw" type="password"></label>
<button>send</button>
</form>
Das Formular abzusenden erzeugt folgenden Request:
/path/to/script/login.php?login=Benutzer&pw=1234
Das steht dann auch so fröhlich im Access-Log des Webservers.
Liebe Grüße
Felix Riesterer
Tach!
Was meinst du genau mit POST erzwingen?
bei GET-Requests werden die Daten im URL-String mitgeliefert:
[...]
Das Formular abzusenden erzeugt folgenden Request:
/path/to/script/login.php?login=Benutzer&pw=1234
Das steht dann auch so fröhlich im Access-Log des Webservers.
Ganz abgesehen davon widerspricht das auch den Richtlinien zu GET/POST. Ein GET soll im Idealfall Daten liefern und keine Aktionen ausführen, die Daten oder einen Status ändern. Einem GET soll man folgen können, ohne dass das Nebenwirkungen hat. Für Änderungen von Daten und Status ist POST vorgesehen (und bei REST-API noch weitere).
dedlfix.
Was meinst du genau mit POST erzwingen?
Naja. Ich hab WIRKLICH schon mal etwas wie:
http://HOSTNAME/login.cgi?user=USERNAME&PASS=GeHeim
als Resultat eines Login-Formulars in der URL-Zeile eines Browsers gesehen. Das wäre GET statt POST (außerdem Klartext). Ob die Passwörter gehasht gespeichert wurden brachte ich nicht mehr wissen wollen - denn in den Logfiles des Webservers und jedes Hotelproxys (und der URL-Zeile) standen die für quasi jeden sichtbar im Klartext…
Hallo Dr. Phil,
wir hatten in unserem Wiki mal eine Musterimplementierung (die entstand vor meiner Self-Zeit, deswegen weiß ich nicht genau, ob es die vom Raketenfuzzi war oder noch eine andere). So, wie ich die Diskussion darüber aufgenommen habe, wurde sie depubliziert, weil es uns zu heikel wurde, dafür die Verantwortung zu tragen.
Wenn da eine Unsicherheit drin ist, es zu einem Hack kommt und sich jemand darauf beruft, dass "Selfhtml sagt, dass man das so macht", sitzen wir in der Tinte. Selbst dann, wenn derjenige die Musterimplementierung fehlerhaft übernommen hat; das müsste man dann erstmal beweisen.
Statt dessen haben wir dort jetzt eine Aufstellung von wichtigen Aspekten und ein paar Links.
https://wiki.selfhtml.org/wiki/PHP/Tutorials/Loginsystem
Rolf
Moin,
bezüglich Sicherheit bei Webanwendungen empfiehlt sich immer ein Blick zum Open Web Application Security Project (OWASP) und dort insbesondere auf die OWASP Top Ten.
Auch der BSI Grundschutzkompendium hat einen Baustein bezüglich der Entwicklung von Webanwendungen, der einen Blick wert sein kann.
Viele Grüße
Jens
Dank euch für die belebte Diskussion!
Nein nein, Daten übermittle ich natürlich mittels POST.
War nur durch die Formulierung POST erzwingen
ein wenig verunsichert.
Moin,
bezüglich Sicherheit bei Webanwendungen empfiehlt sich immer ein Blick zum Open Web Application Security Project (OWASP) und dort insbesondere auf die OWASP Top Ten.
Auch der BSI Grundschutzkompendium hat einen Baustein bezüglich der Entwicklung von Webanwendungen, der einen Blick wert sein kann.
Viele Grüße
Jens
HUI, das ist ja umfangreich...
Werde mir das mal ansehen.
Schönes Wochenende,
Phil, Ph.D.
Hello,
Ich arbeite an einem Login-System in klassischer Konfiguration, daher Backend PHP mit mySQL Datenbank.
Kurze Frage dazu: worauf muss ich bezüglich Sicherheit achten?
Gibt es außer Prepared Statements und Passwort Hashing & Salting weitere Themen?
Mein Lieblingsthema ist dabei immer Dateiupload. Der hat oft Löcher, über die man den Server kapern kann.
Glück Auf
Tom vom Berg