Nogle kreative brugere har på mit site fundet ud af, at hvis du klikker ustyrligt på et bestemt link, så kan de snyde sig til "point".
Kan man på nogen måde i PHP eller Apache definere, at alle kald der kræver sessions, skal vente på hinanden? Sådan at en bruger kun kan kalde en php-fil af gangen.
(Billeder og andre "ikke-php-filer" skal naturligvis kunne hentes sideløbende)
Problemet ligger i din kode er fuld af fejlen, så er det sagt. Det kan nemt undgåes ved at sætte nogle tids låse ind, igen bygget med sessions, eller måske endda cookies.
På mit site er det kun brugere der har til hensigt at snyde, der på nogen mulig måde har interesse i at requeste flere sider på samme tid. Det kan du så vælge at tro på eller lade være :oP
Jeg kunne vælge at kode tjekket selv (hvilket jeg har gjort pt) - men hvis man kan lade et højere abstraktionslag styre dette er det i mit tilfælde at foretrække.
hvis dit system ikke kan håntere at brugeren tilgår siden 100 gange inden for samme session, og derfor for flere points, er det jo dit system som er noget galt i.
Det er et spørgsmål om system-design, ikke om at bede et højere abstractions-layer håntere det "hack"
Det var dog utroligt... Jeg har tre gange i løbet af denne diskussion sagt det, og jeg kan da godt sige det igen så alle er med: jeg har lavet en vel-fungerende lås. Den virker og spiller som den skal. Men hvis jeg kan undgå den i min kode, vil dette være at foretrække.
Så jo - men spørgsmål ER om at bede et højere abstraktionlag om at håndtere det. Kan dette lade sig gøre?
udover at PHP sessions ikke har noget med Apache at gøre, ville det jo bare være at skrive sin egen session handler, dvs. bare flytte låsen i noget mere kompliceret og dårligt kode.
Det er etik blandt ordenlig programmører at anbefale den rigtige løsning, ikke bare give et direkte svar. At give dumme svar, som tillader et elendigt systemdesign er ikke noget jeg vil give mig i krig med. Så beder man jo bare om ikke at blive hjulpet.
Det er muligt, at flytte "tjekket" ikke er den rigtige vej. Er det sådan du kan give nogle argumenter hvorfor det "en dårlig løsning", at flytte tjekket ud til fx apache (hvis det altså var muligt). For mit vedkommende er det kun en halv løsning, at gøre noget fordi andre siger det er rigtigt - løsningen er først komplet når jeg selv forstår hvorfor :-)
I øvrigt: jeg værdsætter din filosofi om at anbefale en bedre løsning fremfor at give et direkte svar, som kunne lede til en dårlig løsning. Så tak for det ;o)
Kunne du ikke paste den "lås" du anvender for nuværende, måske kunne denne optimeres mere hensigtsmæssigt. Nu ved jeg naturligvis ikke lige hvilket site du gemmer din kode på og hvad det er for nogle brugere du har!
Jeg mindes at eksperten.dk, som gør brug af point, har et velfungerende system til at håndterer point til de enkelte brugere. Set i mit optik må det være relativ simpelt at kode en sådan lås, som hindre brugeren i at opnå point mere end een gang eller hvad der nu måtte være det givne krav.
Jeg er af den overbevisning at turen over åen efter vand er ALT for lang, nogengange skal man naturligvis afprøve den, for netop at kunne konstaterer at den var for lang.
Der er naturligvis ingen tvang for hvordan du skulle lave denne lås.
Den lås jeg har skrevet går ind og md5-krypterer en nøgle der er specifik for den handling du nu vil udføre (dvs. den handling der kun må ske EN gang).
Herefter udfører jeg noget ala $result = mysql_query("INSERT INTO hashes (hash) VALUES('".$md5."')"); if(mysql_affected_rows() != 0) { // udfør handlingen }
Da jeg har sat en UNIQUE key på hash-kolonnen vil mysql_affected_rows kun returnere 1 én gang. Jeg har naturligvis en natlig "garbage-collector" til at gøre rent.
Personligt bryder jeg mig ikke meget om løsningen. Måske du kan se en smartere? :-)
.. det skal siges at grunden til at jeg benytter en særlig tabel til at holde styr på de hashes er, at det ikke "bare" er så simpelt som at en given handling må udføres én gang om dagen. Handlingen må gerne udføres flere gange, men ikke overfor den samme brugere samme dag mere end en gang. Lidt bøvlet at forklare :-)
Det korte af det lange er, at det ikke er muligt at oprette en kolonne i bruger-tabellen hvor der indikerer "daglig-funktion udført eller ikke". Da det afhænger af flere parametre hvorvidt den handling er udført.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.