Anfang? Sicherheit? - Fragen eines Anfängers

xkevin96x

Grünschnabel
Erstmal schönen guten Abend,
mein Name ist Kevin K., ich bin 18 Jahre jung und begeistert von PHP und co.
Ich habe vor einigen Monaten mit PHP, HTML und MySQL angefangen und gehe
seitdem stockend an das Thema heran.
Um mir das ganze selbst beizubringen habe ich mir ein eigenes Projekt
erstellt bzw. arbeite daran.

Das Projekt geht um eine Art "Börse" für einen Minecraft (Spiel) Server.
Dabei können sich Nutzer registrieren und jobähnliche Angebote erstellen.

Weiter will ich auch nicht darauf eingehen, eher habe ich andere Fragen.
Zum einen muss ich erstmal fast von neu beginnen.
Ich habe nämlich vor einigen Monaten als ich begonnen habe,
den Code scheußlich erstellt. Nun wollte ich wieder weitermachen, dann das:
Alles durcheinander, Variablen mehrmals gleichnamig an vielen Stellen.... Katastrophe...
Ich habe gestern einen erfahreneren Programmierer an die Seite gelassen,
der mir sagte, ich solle sie lieber rausnehmen als weiterzumachen.
Natürlich würde dieses Projekt meinerseits gerne offiziell sein,
doch er fand die einfachsten Lücken darin.

Einige SQL-Injections konnte ich bereits beheben.
Zudem habe ich GET sowie POST so gemacht, dass auch darüber kein Code in
die Seite transportiert werden kann.
Hierzu habe ich mir dieses Dokument zur Hilfe genommen
(Die 5 häufigsten Sicherheitslücken - PDF).

Gibt es außer den 5 noch weitere schwerwiegende Lücken?
Sollte ich mit meinem aktuell noch nicht allzu hohem Wissen mich schon
an ein solches doch großes Projekt wagen?
Sollte ich den Code komplett neuschreiben, oder doch nur umgestalten?´
Dann habe ich noch eine letzte Frage:
Darf bzw sollte man sich Kommentare/Notizen an Stellen machen, die man selber nur
im PHP-Code sehen kann (zB bei Datenbankabfragen, bei Logins, ...)?

Ich danke für jegliche Antworten, konstruktiver Kritik und Vorschlägen!

mit freundlichem Gruß,
Kevin
 

Parantatatam

mag Cookies & Kekse
Persönlich kann ich Dir nicht viele Hinweise geben, zumindest nicht ohne Dein Skript zu kennen und mal darüber zu schauen. Aber grundsätzlich ist es schon einmal ein guter Ansatz den Du bisher gegangen bist. Du solltest auch bedenken, dass man besonders über Cookies auch Sitzungen von anderen Nutzern stehlen kann und somit an deren Daten kommt. Auch solltest Du die Kennwörter Deiner Nutzer hashen mit Algorithmen wie SHA512 oder höher. Bitte verwende kein MD5 mehr, da dies schon seit Jahren veraltet ist. Zusätzlich solltest Du die Hashs auch noch salzen. Erklärungen dazu findest Du im Netz zuhauf.

Was das kommentieren betrifft, kann ich Dir nur den Hinweis geben, dass Du es definitiv machen solltest – am besten zeitnah. Persönlich bin ich da auch etwas nachlässig, aber hin und wieder nehme ich mir Zeit dafür, beispielsweise, wenn ich gerade mal eine Denkpause brauche. Es ist schon gut, wenn man auch noch nach Jahren weiß, was man damals gedacht hat :)
 

CookieBuster

Erfahrenes Mitglied
Aus eigener Erfahrung:

- Nimm das Kommentieren ernst
- Nur weil man gesehen hat, wo man Schadcode platzieren kann, heißt das nicht, dass man alle diese Stellen gefunden/behoben hat
- Kommentiere sinnvoll, immer.
- Ein zu großes Projekt gibt es nicht, höchstens zu viel Arbeit. Beim lernen ist es - meiner Meinung nach - sinnvoll ein großes Projekt anzugehen, welches in sich nicht schwierig ist sondern einfach nur viel Arbeit und Code enthält. Man hat dann einfach sehr viele Möglichkeiten seine Fähigkeiten an vielen Stellen auszuprobieren. Außerdem braucht man dann nicht mehrere Ideen was man machen könnte, ich hatte immer große Probleme neue Ideen zu bekommen um neues zu lernen ;)
- Kommentare sollten auch bei "offensichtlichen" Variablen oder Funktionen IMMER geschrieben werden. Kommentiere alles.
- Sicherheit von PHP-Code ist ein wirklich schwieriges Unterfangen, sehr SEHR viele Quellen im Internet sind unglaublich schlecht. Vorallem die bekannten - bzw durch Google leicht auffindbaren - haben meistens Artikel welche nur so mit Sicherheitsproblemen um sich werfen
- Kommentare werden einmal dein Leben retten, fast buchstäblich
- Zur Frage, ob es noch mehr Sicherheitsprobleme gibt => Ja. Es wird immer mehr geben. Ich bin aktuell in einem Informatik-Studium und höre etwa alle 2-3 Woche von einer neuen Möglichkeit einen Angriff gegen einen Code durchzuführen. Solche Fragen lassen sich leider nur anhand des Codes beantworten, wie <einfach nur Crack> bereits gesagt hat
- Mach sinnvolle Kommentare, empfehlenswert ist es, einer Syntax zu folgen, welche sich bewährt hat. Z.B. der JavaDoc ähnliche Dereviat für PHP, welche noch ein paar Keywords hinzufügt (nicht typisierte Sprache und so)


Eine kleine Anmerkung noch, vorallem Minecraft thematisierte Websites werden sehr häufig von "Script Kiddies" - wie sie so gern genannt werden - als Ziel herausgesucht. Es ist also wirklich empfehlenswert einen gewissen Standard in Sachen Sicherheit zu erreichen.
 

Clund

(aka Cpp-Freak)
Moin,

was ich als Server Admin noch hinzufügen kann ist, regelmäßig Error Logs und (wenn du nen root Server hast) den /var/log/auth.log anzusehen und die möglichen Angreifer direkt blocken. Außerdem sieht man da sofort, was die Angreifer versuchen:
z.B.:
Code:
File does not exist: /var/www/phpMyAdmin-2
File does not exist: /var/www/php-my-admin
File does not exist: /var/www/phpMyAdmin-2.5.5
File does not exist: /var/www/phpMyAdmin-2.5.5-pl1
File does not exist: /var/www/phpMyAdmin

Clund
 

xkevin96x

Grünschnabel
Dankeschön für eure Antworten.
Tatsächlich - und unglaublicherweise - hat sich mein Wissen seit gestern schon verbessert.
So konnte ich heute endlich die miesen weiteren SQL-Injection-Bugs beheben,
habe alle Variablen gesichert.
Danke!
 

ComFreek

Mod | @comfreek
Moderator
Hallo Kevin,

das verlinkte PDF-Dokument ist veraltet! Es nutzt die alte MySQL-Erweiterung und verschachtelt auch grundlos strip_tags() und htmlentities(). Wobei Letzteres sowieso normalerweise durch htmlspecialchars() empfehlenswerterweise ersetzbar ist.

SHA-512 für Passwörter würde ich direkt nicht empfehlen. Lieber bcrypt.

Es gibt tausende Angriffsvektoren - in jeder Programmiersprache, auf jedem PC. Wenn du magst, kannst du mal auf der OWASP-Seite rumstöbern. Da sind viele Sicherheitslöcher aufgezählt.

xkevin96x hat gesagt.:
Variablen mehrmals gleichnamig an vielen Stellen.... Katastrophe...
Das sollte kein Problem sein. In jedem Programm gibt es die Variable 'i' für Schleifen sehr sehr oft! Es scheint mir, dass du deinen Code nicht wirklich in Klassen, Methoden und Blöcke separiert hast. Eine gute, sauber getrennte Programm-Architektur ist das A und O. Zum Thema Klassendesign gibt es auch zuhauf "Prinzipien", z. B. das Liskov substitution principle.

Ansonsten: Bitte nicht alles kommentieren! Kommentiere, was der Code macht, nicht was jede Programmzeile an sich ausführt. Siehe heir: http://blog.codinghorror.com/code-tells-you-how-comments-tell-you-why/

Auf jeden Fall sollte jemand am Ende (am besten auch parallel während der Arbeit) deinen Code überprüfen und dich auf Fehler hinweisen.
 

xkevin96x

Grünschnabel
Ich habe bereits gesehen, dass die vielen Variablen kein Problem sind.
Ich musste mich nur wieder kurz in die Materie einarbeiten und alles war wieder gut.
Im Übrigen reichte scheinbar das escapen bei der Nutzereingabe.
Ich habe sämtliche Eingabefelder auf XSS-Lücken geprüft und keines hat geklappt,
somit denke - und hoffe - ich, dass das soweit für mein Niveau lückenfrei ist.
Ich danke denoch für alle Antworten!