Nfol · 2012. május 14.

C-C-Combo breaker

Mivel JonC csütörtökön ismét eltörte a blogmotort, nem maradt más választásom, mint hogy előálljak a megoldással a véletlen hozzászólás-duplikátumok keletkezésének problémájára.

A probléma ugyebár annyi, hogy ha írsz egy hozzászólást a blogra és utána újratöltöd az oldalt, akkor a böngésződ az űrlap tartalmát megleli a cache-ben, a ténylegesen beírt dolgok mellett azt is, hogy meg lett nyomva a küldés gomb, és ennek megfelelően ismét odaadja az adatokat a blogmotornak, az meg a szokásos módon végrehajtja a komment rögzítését, mert neki ez a dolga, és máris ott figyel a bejegyzés alatt ugyanaz a hozzászólás kétszer, ötször, tízszer.

Ez több szempontból sem nevezhető jónak. Egyrészt ezeket nekem kell törölgetnem, másrészt néha felborul miattuk a kommentek sorrendje (amit perpillanat nagyon nem értek; egyazon rendezett lekérdezésre az adatbáziskezelőből jó eredmény jön ki, de PHP-val történő kilistázáskor felcserélődnek a rekordok), harmadrészt pedig ennek egyszerűen nem így kellene működnie.

A megoldást abban láttam, hogy az űrlapot és az őt megjelenítő oldalt valahogyan összekössem, pontosabban elérjem azt, hogy a konkrét oldal el tudja dönteni, hogy hozzá tartoznak-e a cache-ben lévő űrlapadatok. Ehhez szükség van egy session változóra és az űrlapot ki kellett egészítenem egy rejtett típusú mezővel. Először generálok egy azonosítót (ami egy MD5-tel kódolt véletlenszám), ezt adom értékül a session változónak és a rejtett mezőnek is minden egyes oldalbetöltés során. Ha megtörténik az űrlap elküldése, a komment rögzítését végző alprogram ellenőrzi, hogy az űrlap rejtett mezőjének értéke és a session változó értéke megyegyezik-e. Ha megyegyeznek, akkor elmenti a hozzászólást és visszatérünk a bejegyzéshez, egyébként viszont zero fucks are given. Ismét megjelenik az oldal, a változónk kap egy új értéket, akárcsak az űrlap rejtett mezője.

Amikor ugyanis a hozzászólás küldése után megnyomod az F5-öt (és leokézod a figyelmeztetést), a szkript újra leellenőrzi a két érték egyezését, csakhogy a session változó értéke azóta megváltozott, a rejtett mező értékét viszont továbbra is a cache-ből szedi a böngésző, amik így nyilván nem fognak egyezni, azaz a komment egy duplikátum, tehát eldobható.

Az egésznek tehát az a lényege, hogy ezentúl mindenki pontosan annyi hozzászólást fog beküldeni a blogra, ahányszor megnyomja az űrlap végén a gombot. Tiszta Amerika!

Itt lehet puttyogtatni!