![]() |
[PHP] Het ontwikkelen van een forum
Hoi. :)
Ik ben bezig met een eigen forum aan het schrijven in PHP. Na 2 nachtjes (jaja het ging lekker) heb ik de basisfunctionaliteit aan de praat: plaatsen van berichten, openen van topics, editen van posts en wat kleine dingetjes zijn allemaal werkend. Alleen nog geen beheerderspaneel en geen moderator-functies zoals topic sluiten / naam veranderen en bannen. Test-forum: http://www.fluffles.net/forum Het mooie aan mijn forum:
Ik voorzie wel enkele problemen, zoals een post parser. Dus het omzetten van allerlei tags naar HTML, maar de rest wel door een htmlentities() filter halen om zo XHTML compliance te garanderen. Dat vind ik wel lastig, voornamelijk omdat ik weinig kennis heb van regular expressions. Veiligheid, functionaliteit en snelheid zijn kernpunten bij zo'n parser. Weet iemand van een Open Source parser? Of misschien kan ik de phpbb parser jatten/aanpassen. Tips, commentaar etc. zijn gewenst. :) En dit is dus geen sitecheck. Het gaat niet om mijn site of mijn forum, maar de forumsoftware in het algemeen. |
Ik mag hopen dat je van tevoren een degelijk ontwerp hebt gemaakt en goed hebt nagedacht over de te wensen functionaleit en gegevens die je wilt bewaren en laten zien.
En uiteraard ben je begonnen met de beveiliging... |
Ja SQL is veel uitgebreider dan nu zichtbaar is. Qua database zit het wel redelijk goed in elkaar denk ik.
Ik doe aan enige redundantie, zoals bij de topiclijst de topicstarter als string opslaan en niet als userid. Dat laatste brengt veel meer load met zich mee, omdat per topic dan de username moet worden gevonden, of je moet een join doen maar ook dat zal sterk vertragen vrees ik. Verder gebruik ik flags om uitbreiding mogelijk te maken. Bijvoorbeeld een C-flag van een topic kan de toestand Closed aanduiden. Of H-flag voor Hidden. Etc. De forums zijn recursief, dus je kunt subsubsubsubsubforums hebben, allemaal genest. Een forum met een C-flag gedraagt zich als een categorie, dus geen posting en geen link. Denk maar aan de forumindex van s.com. Maar dit is mijn eerste probeersel, misschien zie ik dingen over het hoofd, en juist in het begin is het goed om te zorgen voor een goed design; een stevig fundament voor een forum dat ik goed kan uitbouwen. |
Wat betreft zoeken:
Ik kan natuurlijk gewoon een fulltext search doen, maar die zijn erg database-intensief. Ik heb gezien dat phpbb dit oplost door in een aparte tabel elk woord te linken naar topics/posts die dat woord bevatten. Is dat de beste manier? Lijkt mij omslachtig. Moet je ook weer verwijderen als je een topic verwijdert of je post aanpast ofzo. Brrr. |
Citaat:
Als je je verwijzingen goed aanlegt, kun je een cascade delete doen. Maar of het de allerbeste manier is, weet ik eerlijk gezegd ook niet. |
Citaat:
|
Ik heb ook ooit een forum gemaakt, erg leerzaam :)
Denk iig goed na over een template systeem. Dit is erg makkelijke (cq belangrijk) voor bredere inzetbaarheid :) Eventuele extra functies: Avatars Edit -> datum (heb je al) naam en reden. Edit en quick reply etc weghalen al je geen rechten hebt Topic views PM Dit waren dingen die ik erin had gebouwd... |
Citaat:
(zie Foreign Key Constrains in MySQL.. ON DELETE CASCADE) Voor UPDATE kun je misschien met een trigger werken, maar dat werkt pas sinds MySQL 5.x. |
@ ********
Dingen zoals foreign key constraints heb ik me nooit in verdiept. MySQL 5.0 is nog lang niet production/stable, 4.1 is dat net geworden. Dat is toch voor mij de drempel om het te gebruiken. @ ********** Zijn goede punten, alhoewel ik sommigen al bedacht heb. Er zit veel in mn hoofd qua kleine handigheden, dat kan ik nu mooi gaan implementeren. :) PM zal functionaliteit van het CMS zelf worden, doordat accounts niet forum-specifiek zijn. In het profiel van iemand (wat nu nog een saaie lijst is) zullen veel meer mogelijkheden gaan verschijnen waaronder PM. Je Avatar zal voor zowel forum als frontpage gelden. |
De fout die ik toen heb gemaakt is door het forum te integreren met een hoofdaccount.
Ik kon het niet meer loskoppelen waardoor ik een forum had waarop je niet meer kon registeren etc :D:D |
Citaat:
|
Citaat:
|
Citaat:
|
Citaat:
Citaat:
Citaat:
Bit0 = closed Bit1 = Hidden 00 = visible, open 01 = visible, closed 10 = hidden, open 11 = etc. Citaat:
|
Citaat:
|
Citaat:
|
Citaat:
Citaat:
Citaat:
Nee MySQL is the way voor mij. Open Source is sowieso een vereiste. MySQL levert performance en de nieuwe versies ook aardig wat functionaliteit. |
Citaat:
Citaat:
Citaat:
|
Citaat:
@Enlightenment: Ziet er puik uit. Wat voor manier om het secure te houden gebruik je? Trouwens, als je alsnog oracle wilt gebruiken kan je hier een 200MHz servertje voor geinstalleerd me Netware & Oracle komen ophalen :p. Licentievrij. |
Citaat:
|
Citaat:
En uiteraard is alles GPC safe, of magic_quotes_gpc nu aanstaat of uitstaat. Het script maakt verder gebruik van mod_rewrite die alles naar 1 script stuurt, dus rondnneuzen is er niet echt bij. Al met al best veilig denk ik. De accounts zelf zijn sterk beveiligd. IP-locks en sessies met geavanceerde checks, dat zit wel goed. :) Als je het hebt over dingen als flood protection; dat heb ik nog niet ingebouwd. Citaat:
Gelezen wat ze met Peoplesoft hebben gedaan? (n) |
Citaat:
select usr.name from topic join user as usr on usr.id = topic.usr_id_topcistart where topic.id = 8 Voor optimale performance ligt hier een index op user.id, topic.id en topic.usr_id_topicstart. Citaat:
Bit3 = admin only 101 = admin, visible, closed Citaat:
|
een vriend van mij gebruikt één product dat zijn hele omgeving beveiligt.
Hij hoeft zich behalve voor het parsen, nergens zorgen over te maken. Ben alleen de naam vergeten. Edit: rotkat die op het toetsenbord springt en post. en die ga ik hem natuurlijk afhandig maken. moet ergens op sourceforge staan |
Lief zijn voor poesje. :)
Maarja als je alles door een htmlentities() filter gooit, hoef je je ook geen zorgen te maken om parsen. Tenzij er een bug in PHP zou zitten, maar ik gebruik gewoon de laatste versie (PHP 5.0.2). Bovendien heb ik een vulnerability scanner op mn server. |
Citaat:
SELECT * FROM `users`,`groups` WHERE `users`.`goup` = `groups`.`id` AND `users`.`id` = 502; Maar dat van jou is beter? Citaat:
Citaat:
SQL moet je in het begin goed overna denken, maarja de rest kan ik altijd later nog aanpassen denk ik. Wel een aantal keuzes die je maakt, parse ik de berichten per pageview of wanneer de user een post opstuurt. Ik heb voor het eerste gekozen. Stel het staat verkeerd in de db, dan nog is er geen gevaar. Daarnaast kom je dan niet aan de post, als de user die wilt editen zie je daar geen lelijke dingen door de parser gedaan. B.v. op dit forum zie je blabla@bla.com als je blabla@bla.com ingetypt hebt en daarna wilt editen. Lijkt me mooier om dat dus niet te doen. Maarja is wel weer intensiever misschien. Performance is nog een groot punt. |
Citaat:
In jou situatie wordt eerst alle records van de tabellen dmv een cross join bij elkaar gehaald (je krijgt dus een cartetisch (of hoe schrijf je dat) product). Elk record in tabel 1, wordt gelinkt aan alle records van tabel 2. Je tussentijdse resultaat is dus erg groot. Op dit tussentijdse resultaat wordt vervolgens je where toegepast. Op de 'echte' manier, zoals ik liet zien, is je tussentijdse resultaat al een stuk kleiner, omdat je direct filtert op één (of meer) voorwaarde(s). Citaat:
|
Volgens mij maakt die JOIN-syntax niet uit, alleen is de expliciete JOIN waarschijnlijk beter ondersteund in databases anders dan MySQL (en DB independence zou natuurlijk op den duur best een mooie feature zijn).
Over React weet ik toevallig dat ze van een post zowel de ongeparste als de geparste versie van een bericht opslaan. Op die manier heb je het beste van beiden. Dit kost misschien iets meer schijfruimte, maar denk dat performance over het algemeen kostbaarder zal zijn dan schijfruimte. In het algemeen geldt dat je zoveel mogelijk machinaties at post time wil doen, omdat de view actie veel vaker gebeurt dan de post actie. Verder lijkt het extra opslaan van de username bij posts/topics me nog niet zo'n slecht idee. Volgens mij doet React dit ook. Het is niet moeilijk om bij een nickchange even door alle topics/posts heen te lopen en dat bij te werken, en gezien het feit dat nickchanges veel schaarser zouden moeten zijn dan het lezen van het forum is dat wederom een verstandige beslissing. Schone code en een performance beter dan phpBB zijn in dit stadium nog niet zo moeilijk, natuurlijk. Dat wordt pas lastig te enforcen op het moment dat je veel meer features hebt. (To set the record straight: Parse is het bedrijf, React het product, en GoT een implementatie ervan. Als je dus zegt dat het net zoveel features krijgt als GoT Parse praat je enorme onzin.) Heb je al rekening gehouden met templating? |
Citaat:
Citaat:
React dan. Maar net zoveel features denk ik niet, React is enorm uitgebreid. Maar wel het soort handigheidjes dat ik op GoT zie. Citaat:
Jouw manier zal een stuk meer toekomstbestendig zijn, op dit moment gebruik ik functies. Als een functie nog niet gedefinieerd is door config.php, dan gebruikt hij de default functie (die ik nu gebruik, daarom is alles engels). Ik wil ook eerst het functioneel hebben, mocht ik later een mooi deftig templating systeem willen maken kan dat altijd nog. Lijkt me wel veel werk. :/ |
Citaat:
Als jij PHP code moet schrijven en meerdere SQL commando's moet uitvoeren in MySQL om iets te doen wat ik met een trigger in PostgreSQL kan doen, wat zal er dan sneller zijn denk je? Scenario voor je keywords bij het wijzigen van een bericht: PHP -> MySQL (update post) -> PHP -> MySQL (update keywords) PHP -> PostgreSQL (update post, trigger regelt keywords automatisch) Alleen omdat MySQL een redelijk goede SELECT performance heeft, is het niet per definitie een betere oplossing dan PostgreSQL. |
Citaat:
|
Citaat:
|
Citaat:
De benchmarks die ik heb gezien, waaronder vrij ingewikkelde SELECT en INSERT statements, geven een eenduidig beeld weer: MySQL is vele malen sneller. Als MySQL 5.x veel nieuwe functionaliteit toevoegt waar PGSQL het van moet hebben, is voor mij de keus ook vrij eenvoudig gemaakt. |
Citaat:
Maar betekent niet dat ik het niet wil ofzo, maar ik kies liever voor een forum dat binnen een week aardig compleet is, dan dat ik een maand met een niet-functioneel forum zit. :p Even overdreven gezegd. |
Je moet je code binnenkort maar in een Subversion repository gooien, dan kan ik zo templating erin bakken en dan kan je kijken hoe dat werkt. :P
(CVS is so 1995.) |
Citaat:
Wanneer je vanaf het begin al rekening kunt houden met templates en security, is het makkelijker te programeren/onderhouden dan wanneer je alles achteraf moet inbouwen. |
Template systemen zijn eenvoudig te maken, kan op deiverse manieren..
Als je een statisch uiterlijk hebt kun je een php bestand nemen en daar de complete layout inzetten + wat vars.. Als laatste include je deze template.. Een andere manier is gewoon plane text en daar bepaalde dingen zoals <!%variable%!> te replacen. Is wel iets trager. Of je zet ieder onderdeel in een functie.. template_post($username,$etcetc) { } Trouwens ook meerdere talen gebruiken.. Eenvoudig te doen door iedere taal een eigen bestand te laten gebruiken.. dutch.inc.php met: $lan['key'] = "De vertaling"; english.inc.php met: $lan['key'] = "The translation"; |
Citaat:
|
Citaat:
Ik heb al eerder XSLT voorgesteld als templating system aan Enlightenment. :) |
Citaat:
Maar een template systeem is iig heel belangrijk :) |
ikzelf ben ook bezig met een forum te maken, het is m'n eerste grote project in PHP
mijn forum is gekoppeld aan m'n site, accounts zijn daardoor op zowel site als forum te gebruiken. In principe bestaat m'n hele site uit het forum, omdat een aantal sub-fora via de mainpage voor iedereen te bezichtigen zijn (denk aan, news posten in een forum, zichtbaar op de mainpage) het enige waar ik op dit moment zit qua security, is het login gebeuren. Atm word via een form de gebruikersnaam+md5 encrypted password verstuurd (via JS), maar als iemand alleen de MD5 hash heeft, kan die ook gewoon inloggen. mijn oplossing zou zijn koppelen aan een IP, maar dat geeft natuurlijk probs als iemand een proxy gebruikt. Daarna dacht ik aan een systeem, die het wachtwoord+IP via MD5 codeert, dus iemand van een ander IP heeft niks aan de MD5-hash. misschien iemand suggestie's idee-en over hoe en wat? En om het toch ontopic te houden, hoe heb jij dat opgelost, Enlightenment? |
|
Citaat:
Het probleem met fora; Het moet echt iets anders bieden. Er zijn er een paar 100. VBB is heel gaaf maar heel duur. phpBB2 en YaBB zijn wel leuk maar missen vaak security en features. Ze zijn dan wel weer gratis en phpBB2 is niet al te langzaam. |
Citaat:
Ligt natuurlijk maar net waar je het voor gebruikt, maar voor bijvoorbeeld hier is het zeker geen miskoop.. Het is vele malen beter dan phpBB.. Maar een eigen forum maken is leuker... |
Citaat:
Citaat:
Het voordeel van sessies op deze manier, is dat deze niet je wachtwoord verklappen of maskeren. Als je de MD5 hebt van het wachtwoord kun je altijd inloggen gewoon, totdat het wachtwoord wordt veranderd. Bij sessies zal een sessie sowieso verlopen na x aantal dagen (ik heb de sessie ttd (time to die) ingesteld op 30-dagen). Daarnaast kan de gebruiker na het inloggen zien welke sessies er worden gebruikt en deze ook killen. Al met al een van de veiligste server-side accountbeveiligingen denk ik, alleen cookies worden gebruikt verder geen client-side (javascript) shit. Daarnaast ga ik in de toekomst bij het inloggen verschillende opties geven, zoals een optie "Publieke computer". Als je deze optie aanvinkt, zal je cookie met bijbehorende Session ID verwijderd worden zodra je de browser afsluit. Tevens is de timetodie op een dag ingesteld. Al met al vrij veilig denk ik. :) |
Citaat:
|
Citaat:
(Krijg ik dan credits in een ver weggedrukt filetje? :p) |
Citaat:
kga nu quotes enzo werkend maken :) |
|
Citaat:
Als je bij mij inlogt, worden je gebruikersnaam en wachtwoord ongecodeerd naar de server gestuurd. Daar wordt het wachtwoord met md5 gecodeerd en vergeleken met het wachtwoord in de database (dat ook md5 is). Dan kunnen mensen toch niet inloggen als ze alleen de md5-dinges hebben? Want als ze dat dan invoeren, wordt dat ook weer md5 gecodeerd en dan verandert het dus. Toch? Verder snap ik ook niet zo goed waarom je je sessies moet beveiligen. Ik maak gewoon een sessie met de user_id, de username en het emailadres aan en die laatste twee eigenlijk ook alleen maar zodat ik ze niet steeds uit de db hoef te halen, het wachtwoord komt dus niet in een sessie. Alles werkt verder via $_SESSION[ 'user_id'], als die bestaat is iemand ingelogd en anders niet. Is dit echt zo onveilig? (en waarom?) Citaat:
Verder snap ik het probleem met die htmlentities() niet zo. Als je die functie gewoon gebruikt op het bericht dat je in de db gaat zetten en er dan rekening mee houdt in je regular expressions, dan werkt het toch gewoon? Misschien dat je nu gewoon een nieuwe post naar de database stuurt en dan pas htmlentities() gebruikt nadat je [img] hebt vervangen door <img ... >. Dan zal het inderdaad wel niet werken, maar als je zorgt dat die echte html-tags (van <img ... > ) pas worden neergezet nadat je htmlentities hebt gebruikt, dan moet het werken toch? Citaat:
Sorry voor de vele vragen... |
Citaat:
Maar als je forum een hobbyprojectje is en usersecurity geen prioriteit is, hoeft het geeneens zo erg te zijn. Citaat:
Citaat:
Citaat:
Citaat:
Citaat:
Om dat te voorkomen is het belangrijk dat GPC geen " of ' kan bevatten. Een functie zoals mysql_escape_string() plaats / slashes voor elke " of '. MySQL zal daardoor het teken erna als teken behandelen, en niet de string escapen. Hierdoor blijft alles wat van GPC afkomt als string en niet als data/instructies. magic_quotes_gpc is een configuratie optie in php.ini die automatisch alle GPC-variabelen escaped, zodat je ze direct in SQL statements kunt gebruiken zonder mysql_escape_string() functie. Je kunt ze ook uitzetten als je zelf netjes met de code omgaat, zoals ik doe. Dat heeft wat andere voordelen. mod_rewrite gebruik ik om ALLE requests naar 1 php file te sluizen. Mensen kunnen dus niet directories op de server rondneuzen en direct php scripts aanroepen. Dat vermindert de kans op hack-acties ook enigszins. Alles komt binnen op een centraal script die vervolgens de juiste scripts aanroept afhankelijk van de url. Daardoor krijg je ook mooie URLs, geen: http://forum.fluffles.net/viewforum.php?f=7 Maar: www.fluffles.net/forum/devschuur en voor een topic: www.fluffles.net/forum/devschuur/5 Staat een stuk professioneler vind ik. |
Alle tijden zijn GMT +1. Het is nu 01:14. |
Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.