Neuling mit Großem Tatendrang sucht Hilfe :D

xxSunFirexx

Grünschnabel
Wie bereits im Titel verraten arbeite ich derzeit an einem Großprojekt und das als Neuling.

Es geht hierbei um ein Internet-Portal das irgendwann für recht viele User herhalten soll. Genau aus diesem Grund will ich, dass ich dies von Anfang an(wenn auch dann langsam,weil Neuling) auf sicheren Füßen steht. Da ich euch nicht weiter mit überflüssigem nerven will gehts direkt ans eingemachte:
Achso,damit keine Unklarheiten auftreten,es geht hierbei um ein Rollen-online-Spiel(YES, its WoW :D)
1. Wie sollte eine Userdatenbank aussehen? Ich erkläre diese Frage: Sollte in einer tabelle "user" alle Informationen enthalten die selbigen Betreffen? Bisher steht in meiner Datenbank folgendes:
ID(Autoincrement+Primary)
Benutzername(mit dem sich eingeloggt wird)
Anzeigename(der dann für den Rest der Welt angezeigt wird)
Passwort(in md5 natürlich :D)
Email
Avatar(hier soll der grafikpfad rein,also eher ein "Forumavatar")
Charaktername
Charakterklasse
Skillungsrichtung1(spezialisierung innerhalb des spieles)
SKillungsrichtung2(siehe 1)
Permissions(die späteren zugriffsrechte im Forum)
InGilde(es wird ein seperates Menü für gildenmitglieder geben,das nur solche sehn sollen)
Rang(Administrator,Moderator,Community,Gildenmitglieder usw)

Ist diese Art "dienlich"? also die Frage ist eher : Macht es etwas aus(Performance technisch) ob die datenbank selber 5 Informationen enthält oder 20?
Auf der Seite an sich wird diese Datenbank vom Loginscript angesprochen und das wars eigentlich,da ich zb permissions in die session speichere,und die sich für gewöhnlich nicht verändern.

2. Ich erhalte über ein Registrierungsscript mehrere Daten die dann als variable in ein query sollen,ich habe bereits von XSS gehört und weiss nicht ob meine derzeitigen sicherheitsmaßnahmen reichen:

function clean($value)
{
htmlspecialchars($value);
trim($value);
strip_tags($value);
}
mysql_real_escape_string($registername);
clean($registername);
$registersql = "SELECT `username` FROM `user` WHERE `username` LIKE \"$registername\"";

Natürlich wurde im Vorfeld $_POST['username'] in die variable $username gepackt...

3. Soweit ich weiss,erlaubt mein server keinen PHP-Upload.... angeblich soll ich das per phpinfo(); herrausfinden.... welche zeile,bzw wo müsste ich da genau schauen?

4. Bei der Profileditierung stoße ich derzeit auf meine Programmiergrenzen.... Ich würde gerne einen UPDATE befehl konstruieren der nur das updated was auch wirklich verändert worden ist.... Heisst im Klartext: Ein Formular das den Namen und das passwort und sagen wir das Alter des Users angibt. Er(aus welchen gründen auch immer,gehn wir einfach mal von einer Fehleingabe aus) würde sich gerne ein Jahr älter machen. Es soll nun möglich sein dass er sein Alter anpassen kann, und sein Passwort+Username frei bleibt-> also kein (ich schreibs jetzt in kurzform)
Update user SET username,passwort,alter values xxsunfirexx,xxxxxx,17
sondern ein
update user set (wenn username vorhanden,dann username),(wenn passwort vorhanden,dann passwort),(wenn alter vorhanden,dann alter) values ......usw
ich denke es ist verständlich ausgedrückt :D

5. Ist es möglich als Neuling ein...sagen wir primitives Forum zu entwicklen? Also wirklich nur Grundfunktionen..... kein editieren kein gar nichts...einfach nur "Posten" und darauf dann wieder antworten können******
Theoretisch ist es ja nichts anderes als meine bisher(funktionierende) shoutbox auch.... dort wird einfach der username,der inhalt,die uhrzeit,das datum und halt eine id gespeichert und,nach meinen wünschen angezeigt?
Ich habe vor das dann später nach und nach zu erweitern,was aber auch gerne noch einige monate in anspruch nehmen darf,da ich es damit nicht all zu eilig habe :D
5.1 Sollte ich dann für jede "unterkategorie" eine eigene tabelle erstellen? heisst:
tabelle1: offtopic
tabelle2: gildeninternes
tabelle3: was anderes
oder lieber eine tabelle "topics" und dort alle deponieren mit ner eigenen spalte die sich zb "zugehörigkeit" nennt und dort dann per SELECT xy FROM topics where zugehörigkeit = gilde machen? :D

Ich glaub das wars dann vorerst... vielen dank schonmal im vorraus !
 
Zuletzt bearbeitet:
Cheers

Es ist wunderbar, dass du so viel Tatendrang hast aber 2 Dinge vorweg:
a. Bitte wähle einen sinnvollen Thread-Namen, damit jeder sofort weiß, was du brauchst.
b. Benutze die PHP-Tags, damit dein geposteter Code besser zu lesen ist.

Nun zu deinen Fragen:

1. Datenbankstruktur:
Als erstes würde ich eine Tabelle anlegen, in der nur die Userdaten stehen, wie z.b. Account Id, Account Name, Email, Reg.Datum. Vielleicht noch ein paar Flags ob der Account bereits aktiviert wurde oder ob er gesperrt ist. Dann könntest du aus sicherheits gründen die letzten 3 IP's des User speichern.
Nun würde ich mich an die Tabellen machen, die wichtig sind für einen Charakter. Als ersten eine Tabelle in der die Basisdaten des Charakter drin stehen und in der auch die Account Id steht, damit du Charaktere einem Account zuordnen kannst oder damit ein user auch mehrere Accounts haben kann.
Für so kniffelinge Dinge wie ein Inventar könntest du z.b. einen Items-Table machen, in dem steht dann die Item Id, die Anzahl des Items und die Charakter Id. Dann haste du zwar eine ewig lange Tabelle mit allen items von allen Usern, aber du brauchst ja nur ein kurzes Skript was die alle Selected bei denen die Charakter ID = der ID des Spieler ist ;)

2. Sicherheit
Es gibt dieverse PHP-Methoden, mit denen du Strings scannen kannst. Damit kannst du leicht herausfinden ob die angaben des User korrekt sind. Z.B. ob die E-Mail adresse ein @ Zeichen enthält und so weiter. Dann würde ich immer eine Aktivierungs-E-Mail und ein automtisch generiertes Passwort verschicken. Ich benutze zum generieren von Passwörtern immer folgende Variante:
PHP:
$password = md5( time() * mt_rand( 1, 99999 ) );
Das ist sicherlich keine perfekte Methode, erzeugt aber zufällige Passwörter, die sich eigentlich nie doppeln sollten. Dann könntest du auch, wenn ein User seinen Account aktiviert ihn Zwingen ein mindestens 12 stelliges Passwort zu erstellen. Wichtig ist, dass du die Passwörter nicht im klartext speicherst sondern md5-kodiert (oder anders). Denn sonst kannst du Probleme mit den deutschen Datenschutz-Recht bekommen ;)

3. PHP-Upload
(dauert 4sec bei Google ;) )

Die wichtigen PHP.ini Befehle:
file_uploads
upload_max_filesize
max_input_time
memory_limit
max_execution_time
post_max_size

Weiterführende Informationen:
http://www.radinks.com/upload/config.php

4. Profil-Update
Erstelle doch einfacah eine Funktion, die alle Formularfelder durchgeht und auf der Basis dann einen Query generiert:
PHP:
// Pseudo-Code

// Erstelle Query
$query = "UPDATE `$table` SET ";
// Gehe alle Formular-Felder durch
foreach($form as $field)
{
    // Wenn ein Feld NICHT leer war dann mach was
    if(!empty($field)
    {
        // Erweiter den Query
        $query .= "field=$field";
        // wenn es nicht das letze field war
        $query .= ","; // Damit die auch mit Komma getrennt sind ;)
    }
}
// Füge die Bedingung zum Query hinzu
$query .= "WHERE username='blub'");
Das ist auch wieder keine 100%ige-Variante, die du übernehmen solltest, lediglich ein Anstatz, wie du da rangehen könntest.

5. Forum
Benutze doch einfach ein bereits fertiges Forum, wie was Woltlab Burning Board oder phpBB. Denn wenn du wirklich ein Neuling bist, solltest du dir nicht zu viel zu muten. Stemme erstmal dein Browsergame-Projekt, daran wirst du schon noch genug zu tun haben ;)

Ich hoffe ich konnte die etwas weiter helfen ;)

philishake
 
Zurück