Thomas. Skrevet 26. mai 2009 Del Skrevet 26. mai 2009 if(isset($_GET['u'])) { $id = mysql_real_escape_string($_GET['u']); $sql2 = mysql_query("SELECT * FROM nummerspill WHERE id = $id"); $r_and = rand(10, 99); $r_and2 = rand(0, 1); $rr_and = $r_and2.".".$r_and; sleep($rr_and); if(mysql_num_rows($sql2)) { } } Jeg lurer på om vis f.eks to personer går inn på samme linken likt - da vil dette hjelpe? Slik at koden kun utføres på han ene, og ikke begge. Finnes det andre, sikrere metoder? Lenke til kommentar
Ernie Skrevet 26. mai 2009 Del Skrevet 26. mai 2009 Det vil aldeles ikke hjelpe. Er sjansen stor nok til at to personer behandles samtidig i systemet, er den også det for ethvert annet tidspunkt. Mao. du utsetter bare problemet og ikke minst innfører krasj også. Hva om person A behandles ved tidspunkt 0 må vente 1.99 mens person B behandles ved tidspunkt 1 og må vente 0.99? Det man bør gjøre i en slik situasjon varierer avhengig av hva man skal beskytte mot og hvor. Er man f.eks. avhengig av å kjøre flere SQL-spørringer sammen bruker man gjerne transaksjoner. Ellers kan man jo alltids låse av en fil med flock og sjekke at man faktisk får låst den før man kjører den sensitive koden og etterpå låser opp filen igjen. Lenke til kommentar
Jonas Skrevet 26. mai 2009 Del Skrevet 26. mai 2009 (endret) Å randomisere et delay ved request gjør ingen ting i forhold til problemstillingen din. Sannsynligheten for at koden kjøres samtidig er fortsatt akkurat like stor. Edit: Ernie var først. Edit: Selvom du escaper input, så kan man fortsatt fremprovosere en feil ved SQL-spørringen. Du bør sjekke om variabelen er numerisk eller inneholder andre tegn som må innkapsles i fnutter. Endret 26. mai 2009 av Jonas Lenke til kommentar
Thomas. Skrevet 26. mai 2009 Forfatter Del Skrevet 26. mai 2009 Det vil aldeles ikke hjelpe. Er sjansen stor nok til at to personer behandles samtidig i systemet, er den også det for ethvert annet tidspunkt. Mao. du utsetter bare problemet og ikke minst innfører krasj også. Hva om person A behandles ved tidspunkt 0 må vente 1.99 mens person B behandles ved tidspunkt 1 og må vente 0.99? Det man bør gjøre i en slik situasjon varierer avhengig av hva man skal beskytte mot og hvor. Er man f.eks. avhengig av å kjøre flere SQL-spørringer sammen bruker man gjerne transaksjoner. Ellers kan man jo alltids låse av en fil med flock og sjekke at man faktisk får låst den før man kjører den sensitive koden og etterpå låser opp filen igjen. Så, da vil dette fungere? if(isset($_GET['u'])) { $id = mysql_real_escape_string($_GET['u']); $sql2 = mysql_query("SELECT * FROM nummerspill WHERE id = $id"); if(mysql_num_rows($sql2)) { $fp = fopen("fil.php"); if (flock($fp, LOCK_EX)) { KODE HER } } } Lenke til kommentar
Ernie Skrevet 26. mai 2009 Del Skrevet 26. mai 2009 Hvis du slenger på en flock($fp, LOCK_UN) tilslutt i if-blokken så skal det fungerer. Når det er sagt så skal det litt til før man opplever «concurrency» problemer, og det skjer ikke uten at man har skriving/endring inni bildet. Lenke til kommentar
Thomas. Skrevet 26. mai 2009 Forfatter Del Skrevet 26. mai 2009 Hvis du slenger på en flock($fp, LOCK_UN) tilslutt i if-blokken så skal det fungerer. Når det er sagt så skal det litt til før man opplever «concurrency» problemer, og det skjer ikke uten at man har skriving/endring inni bildet. Vel, det har seg slik at serveren ikke støtter flock. Så finnes det andre muligheter? Lenke til kommentar
Ernie Skrevet 26. mai 2009 Del Skrevet 26. mai 2009 Vel, da tror jeg vi må vite litt mer hva det er som ev. kan krasje i hverandre. Jeg kan iallfall ikke umiddelbart komme på noe generelt som kan fungere. Lenke til kommentar
Thomas. Skrevet 26. mai 2009 Forfatter Del Skrevet 26. mai 2009 (endret) Vel, da tror jeg vi må vite litt mer hva det er som ev. kan krasje i hverandre. Jeg kan iallfall ikke umiddelbart komme på noe generelt som kan fungere. Vel, det er en "bug" på nettsiden min. Når to stykker trykker likt på submit-knappen så kjøres spørringen 2 ganger, men i utgangspunktet har jeg kodet det for å kjøre gjennom koden en gang, for å så slette fra databasen hvor id er $_GET['u'] (når kun 1 person trykker på knappen). Men spørringen skal ikke kjøres mer enn en gang uansett hvor mange som trykker på knappen. hmm, muligens litt dårlig forklart Endret 26. mai 2009 av Thomas. Lenke til kommentar
Ernie Skrevet 26. mai 2009 Del Skrevet 26. mai 2009 Da kan det nok være en fordel å finne ut hvorfor det ikke fungerer når noen forsøker å slette noe som allerede er slettet. SQL-spørringen i seg selv vil nemlig ikke gi noen feilmelding, men bare vise at ingen rader har blitt påvirket. Utover det har man lock/unlock table og transaksjoner, men det spørs forsåvidt for mye det hjelper. Lenke til kommentar
[kami] Skrevet 27. mai 2009 Del Skrevet 27. mai 2009 (endret) du kan løse denne enten via transactions, der du kjører select og delte i en og samme transasction or rollbacker om den ikke klarer å delete, eller å kjøre en update spørring. Om du bruker updatespørringen må du ha et ekstra felt i tabellen din alter table nummerspill add field (used varchar(1) default '0'); mysql_query("UPDATE nummerspill set used=1 where used=0 and nummer=...") if (mysql_affected_rows() > 0) { echo "you win"; // din kode inn her som du pasta i starten.. (select og hele hopprennet) } else { // ignore. } Endret 27. mai 2009 av [kami] Lenke til kommentar
[kami] Skrevet 27. mai 2009 Del Skrevet 27. mai 2009 du vil sikkert skrive spørringen slik (bytte om rekkefølgen slik at nummer sjekkes før used, da du sikkert har indexert eller har pk på nummer. om used ligger først kan det hende mysql tar en full tablescan for å sjekke used som ikke er indexa først) "UPDATE nummerspill set used=1 where nummer=$id and used=0" Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå