Forum

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
powered_by_coffee
User
Beiträge: 22
Registriert: Freitag 13. August 2010, 14:25

Ich bin noch nicht all zu lange in der Pythonszene tätig und habe mal als Einstieg (ganz unkreativ :) ) ein kleines Forum programmiert.
Hab es bisher nur lokal getestet. (Versuche gerade die SQL-Queries für GQL umzuschreiben, damit ich es auf der Google-App-Engine hosten kann)

Würde mich freuen, wenn es sich der ein oder andere mal anguckt :)
(Wenn es noch jemand aufm Webspace testen würde, wäre es natürlich um so besser *g*)

Hier geht es zur Projektseite.

Freu mich übers Feedback.

Lg, p_b_c
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Hast du mal Screenshots?
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

the more they change the more they stay the same
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mein erster Tipp wäre: Füge ein bisschen CSS hinzu, sodass der Screenshot nicht ganz so wie aus den 90ern aussieht. Und einen "dies ist valides XHTML"-Button halte ich ja für total entbehrlich.

Was hast du für ein komisches ZIP-Programm benutzt? Mein Unzip meckert über die \ im Pfad, die eigentlich jedes Zip als / darstellen sollte - habe ich bislang noch niemals so gesehen.

Gleich in der ersten Funktion von mypy_board.py hast du meinen Aufreger Nummer 1 benutzt. Ein "if ... return True else return False" ist eigentlich so gut wie immer total und absolut unnötig und kann bei dir durch folgendes ersetzt werden:

Code: Alles auswählen

def login_check():
    return request.get_cookie('login_flag') == '54742010'
Man muss übrigens keine Funktionen mit nicht mehr Informationen als ihrem Funktionnamen schon steht dokumentieren :) Und was ist da da für eine komische Konstante? Kann ich mich im Forum anmelden, wenn ich nur manuell so ein Cookie setze? Nicht gerade sicher... ;)

Bitte benutze nicht ein und die selbe Variable für Objekte völlig unterschiedlichen Typs. So wäre es besser:

Code: Alles auswählen

pw = request.GET.get('admin_password', '').strip()
digest = hashlib.md5(pw).hexdigest()
Immer wenn mit Ressourcen wie Dateien oder Datenbank-Cursorn hantiert wird, würde ich try/finally benutzen, um sicherzustellen, dass die Ressource in jedem Fall wieder freigegeben wird, auch wenn das Programm unerwartet mit einer Exception abgebrochen wird.

Du hast verschiedene Datenbanken für Logins, Topics, usw.? Das ist eher ungewöhnlich. Ich würde übrigens empfehlen, klar zwischen Domain-Modell (also den Objekten, die das Forum ausmachen) und der Darstellung (also den route-annotierten View-Funktionen) trennen. Jetzt vermischt du das sehr stark. Das lässt sich so schwerer testen. Baue lieber erst mal ein Domain-Modell für das Forum, dass du komplett ohne Web-Oberfläche benutzen kannst. Dann rufe aus dieser die passenden Methoden des Domain-Modells auf.

Ich glaube übrigens, das Projekt wäre viel einfacher mit Django zu realisieren gewesen, denn das nimmt dir 95% der DB-Operationen ab, bietet dir einen einfachen Weg zu einem Domain-Modell und ist was Routing und Views angeht, auch nicht viel komplizierter. Oder schaue dir mal SQAlchemy an, auch wenn das ein bisschen komplexer ist.

Stefan
Benutzeravatar
powered_by_coffee
User
Beiträge: 22
Registriert: Freitag 13. August 2010, 14:25

Mein erster Tipp wäre: Füge ein bisschen CSS hinzu, sodass der Screenshot nicht ganz so wie aus den 90ern aussieht.
Das habe ich eigentlich absichtlich gemacht. Damit man das Forum leichter anpassen bzw. sich leicht ein eigenes Template basteln kann.
Ich würde aber noch ein "schickes" Template basteln und dieses mit zur Verfügung stellen, wenn alles soweit fertig ist.
Gleich in der ersten Funktion von mypy_board.py hast du meinen Aufreger Nummer 1 benutzt. Ein "if ... return True else return False" ist eigentlich so gut wie immer total und absolut unnötig und kann bei dir durch folgendes ersetzt werden:
Stimmt, danke.
Kann ich mich im Forum anmelden, wenn ich nur manuell so ein Cookie setze? Nicht gerade sicher...
Naja a) muss man wissen wie dieser Cookie heißt und b) was für ein Wert da drinne steht. Und das weiß man ja eigentlich nicht, wenn man nicht gerade den Code vor Augen hat. :P
Deshalb sollte ich evtl. noch in der Doku schreiben, dass man diesen beliebig ändern sollte.

Du hast verschiedene Datenbanken für Logins, Topics, usw.? Das ist eher ungewöhnlich.
Wie würdest du das sonst machen?

Danke fürs Feedback!

Ps.
Hast du dir nur den Code angeguckt oder auch mal zum Laufen gebracht?
Wenn ja, lief es auf Anhieb?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

powered_by_coffee hat geschrieben:
Kann ich mich im Forum anmelden, wenn ich nur manuell so ein Cookie setze? Nicht gerade sicher...
Naja a) muss man wissen wie dieser Cookie heißt und b) was für ein Wert da drinne steht. Und das weiß man ja eigentlich nicht, wenn man nicht gerade den Code vor Augen hat. :P
Deshalb sollte ich evtl. noch in der Doku schreiben, dass man diesen beliebig ändern sollte.
Immer noch extrem unsicher, vorallem weil es wahrscheinlich sowieso keiner ändert.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

powered_by_coffee hat geschrieben:
Du hast verschiedene Datenbanken für Logins, Topics, usw.? Das ist eher ungewöhnlich.
Wie würdest du das sonst machen?
Verschiedene Tabellen innerhalb einer DB.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
powered_by_coffee
User
Beiträge: 22
Registriert: Freitag 13. August 2010, 14:25

So habs nun mal auf einer DB mit drei Tabellen geändert.
Und auch die anderen Kritikpunkte berücksichtigt.
Immer noch extrem unsicher, vorallem weil es wahrscheinlich sowieso keiner ändert.
Warum genau?

Benutzerdaten stehen in einer Datenbank.
Beim Einloggen werden diese verglichen.
Wenn diese stimmen, wird ein Cookie mit dem Namen + Wert gesetzt, der eine Gültigkeit von 500 sek. hat.
Wenn sich nun jemand diesen Cookie nachbasteln möchte, muss er den Namen + Wert wissen, was man nicht weiß.

Findet ihr nicht, dass man ruhig voraussetzen darf, dass jemand eigenständig den Cookiewert ändert? (Wenn es in der Installationsanleitung drinne steht)
Ansonsten überleg ich mir ein Algorithmus der selbstständig den Wert ändert.
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

powered_by_coffee hat geschrieben: Findet ihr nicht, dass man ruhig voraussetzen darf, dass jemand eigenständig den Cookiewert ändert? (Wenn es in der Installationsanleitung drinne steht)
Ansonsten überleg ich mir ein Algorithmus der selbstständig den Wert ändert.
Sowas nennt man "Salt" und man kann z.B. einen md5 Hash aus Datum und Uhrzeit erzeugen.
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Cookies kommen vom User und sind erstmal unsicher, deswegen signiert man diese am besten um sicherzustellen dass das was der User dir da schickt auch tatsächlich von dir kommt. Werkzeug hat eine brauchbare Implementation dafür die SecureCookie heisst.
Benutzeravatar
powered_by_coffee
User
Beiträge: 22
Registriert: Freitag 13. August 2010, 14:25

Danke für die Kritik.
Werde das Forum erstmal wieder rausnehmen, überarbeiten und anschließend neu begutachten lassen.
Schönes We. euch allen.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

powered_by_coffee hat geschrieben:
Hast du dir nur den Code angeguckt oder auch mal zum Laufen gebracht?
Wenn ja, lief es auf Anhieb?
Nur angeguckt. Daher kann ich die zweite Frage nicht beantworten.

Die anderen Punkte wurden ja schon von anderen Leuten beantwortet. Zur Cookie-Problematik will ich noch anmerken, dass es besser wäre, wenn jeder Benutzer eine eigene einzigartige Session-ID hätte. Jetzt wäre es relativ einfach, einem angemeldeten Benutzer das Cookie zu stehlen. Gute Session-IDs wäre message digests wie z.B. von MD5 oder SHA1 von zufälligen Werten (oder einer Uhrzeit) erzeugt. Um sicherzustellen, dass ein Anwender nicht an den Cookies fummelt, bietet sich an, diese über einen HMAC abzusichern. Der Default bei Python benutzt allerdings MD5, hier bietet sich an, besser SHA1 oder SHA2 zu nutzen. Die Session-Daten selbst zu verschlüsseln ist leider nicht so einfach, da Python hier ohne weitere Bibliotheken, kaum etwas bietet. Wenigstens AES hätte man ja in den letzten Jahren mal hinzufügen können...

Stefan
Antworten