Avatar billede razmuz_dk Nybegynder
24. januar 2007 - 13:10 Der er 11 kommentarer

Et request af gangen

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)

På forhånd tak.

-Rasmus
Avatar billede windcape Praktikant
24. januar 2007 - 13:15 #1
ikke rigtigt.

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.
Avatar billede razmuz_dk Nybegynder
24. januar 2007 - 13:16 #2
Jeg har lagt låse ind. Og fejlene er rettet :-)

Men jeg ved det kan lade sig gøre på IIS og med ASP.NET - så må det da også kunne lade sig gøre sig med Apache/PHP?
Avatar billede windcape Praktikant
24. januar 2007 - 13:20 #3
Hvis det du agter at gøre, er hvad jeg tror det er, er det komplet idiotisk. Det skal være op til brugeren hvordan han/hende vil surfe, ikke dig.

Bare kod ordenlig, og sådanne problemer vil ikke opstå :-)
Avatar billede razmuz_dk Nybegynder
24. januar 2007 - 13:26 #4
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.

Anyone?
Avatar billede windcape Praktikant
24. januar 2007 - 13:28 #5
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"
Avatar billede razmuz_dk Nybegynder
24. januar 2007 - 13:30 #6
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?
Avatar billede windcape Praktikant
24. januar 2007 - 13:34 #7
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.
Avatar billede razmuz_dk Nybegynder
24. januar 2007 - 13:42 #8
Tak for det svar.

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)
Avatar billede mccookie Seniormester
24. januar 2007 - 15:54 #9
Hi'

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.

///McCookie
Avatar billede razmuz_dk Nybegynder
29. januar 2007 - 17:55 #10
Hej McCooke, tak for din kommentar.

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? :-)
Avatar billede razmuz_dk Nybegynder
29. januar 2007 - 18:09 #11
.. 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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester