Avatar billede sqren Nybegynder
15. februar 2004 - 15:37 Der er 39 kommentarer og
1 løsning

Person ødelægger pointsystem!

Der er desværre en person der ødelægger mit pointsystem. Når man bedømmer en fil kan skal man vælge et antal point på en skala fra 1-10. Personen har dog fundet en måde til at give flere point. Point antallet regnes ud ved at sige point delt med stemmer = et tal under 10 (helst!!!).

Håber i kan hjælpe mig.

Her er lidt kode:

$ip = mysql_query("SELECT * FROM flash_rating WHERE id='$id' AND ip='$REMOTE_ADDR'");
if(mysql_num_rows($ip)>0){
$flash_besked="Du har allerede Stemt";
}elseif($karakter>10){
$flash_besked="Forkert karakter";
}
elseif($Stem){
mysql_query("UPDATE flash SET stemmer=stemmer+1, point=point+$karakter WHERE id='$id'") or die (mysql_error());
mysql_query("INSERT INTO flash_rating (id, ip) VALUES ('$id','$REMOTE_ADDR')") or die (mysql_error());
$flash_besked="Tak for din stemme!";
   
}elseif(mysql_num_rows($ip)==0) {
$flash_besked="
<form method='POST' action='index.php?ske=flash_vis&id=$id'>

  <select size='1' name='karakter'>
<option selected>Vælg point</option>
  <option value=\"1\">1 - Nedern</option>
  <option value=\"2\">2</option>
  <option value=\"3\">3</option>
  <option value=\"4\">4</option>
  <option value=\"5\">5 - Okay...</option>
  <option value=\"6\">6</option>
  <option value=\"7\">7</option>
  <option value=\"8\">8</option>
  <option value=\"9\">9</option>
  <option value=\"10\">10 - Totalt fed!</option>
  </select>
  <input type='submit' value='Stem' name='Stem'></p>
</form></p>";
}
Avatar billede erikjacobsen Ekspert
15. februar 2004 - 15:53 #1
Man skal altid checke sit input. Denne siger OK:

  $karakter="1+100";

  if ($karakter>10) {
    print "For stor\n";
  } else {
    print "OK\n";
  }

men alligevel bliver der lagt 101 til i din sql-sætning. Kan du selv se
så nogenlunde hvad vej du skal gå...?
Avatar billede terrak Nybegynder
15. februar 2004 - 15:59 #2
Jeg kan se at du koder med register_globals til on. Dette kan være en sikkerhedsrisiko, hvilket er grunden til at det >ikke< er standard længere. På langt de fleste servere du lægger dit script ud på, vil det ikke virke.
Men nok om det.

Du skal tænke på at brugeren kan oprette sin egen form som ser sådan her ud:
<form method='POST' action='index.php?ske=flash_vis&id=xx'>
hvor han selv kan sætte id til hvad han vil. Jeg ved ikke om du bruger id til at identificere brugere med, med hvis du gør så kan det altså ændres, så brugeren kan blive ved med at stemme.
Avatar billede sqren Nybegynder
15. februar 2004 - 16:00 #3
Ikke helt... Hvordan checker jeg mit input på en anden måde?
Avatar billede sqren Nybegynder
15. februar 2004 - 16:03 #4
terrak-> Jeg ved godt at brugeren bare kan skrive index.phpindex.php?ske=flash_vis&id=19&Stem=Stem&karakter=5 og dette gør ikke noget da jeg regsitrere ip

Men jeg kan bare ikke forstå hvordan man kan skrive:
index.phpindex.php?ske=flash_vis&id=19&Stem=Stem&karakter=55
da jeg har en kode som siger:
elseif($karakter>10){
$flash_besked="Forkert karakter";
}
Avatar billede terrak Nybegynder
15. februar 2004 - 16:09 #5
I din sql-query skriver du SELECT * FROM flash_rating WHERE id='$id' AND ip='$REMOTE_ADDR'
Det betyder at id OG ip begge skal være noget bestemt. Og da jeg tvivler på at den vil finde en række i din database, hvor id='ghwlkw452tngjs' OG ip er den korrekte ip-adresse, så kan personen jo blive ved med at stemme. Hvordan forhindrer du det?

En anden ting:
Kan du ikke bare sætte $karakter til 0, hvis $karakter er over 10? for så bliver der jo ikke lagt noget til, hvis den udfører din sql-query senere i scriptet;
elseif($karakter>10){
$flash_besked="Forkert karakter";
$karakter=0;
}
Avatar billede sqren Nybegynder
15. februar 2004 - 16:15 #6
det der irritere mig mest er at jeg ikke selv kan finde ud af at "hacke" systemmet. Hvis jeg skriver:
index.php?ske=flash_vis&id=19&Stem=Stem&karakter=55

Står der bare: Forkert karakter
og den lægger ikke en stemme til eller 55 points.
I kan selv prøve her:
http://www.sjovert.dk/index.php?ske=flash_alle&sorter=Bedømmelse

Som i kan se har de øverste 5 en bedømmelse på over 10. De er blevet "hackede".
Jeg ved bare ikke hvordan.
Avatar billede terrak Nybegynder
15. februar 2004 - 16:19 #7
Okay, id er nummeret på vitsen - så er jeg med.
Avatar billede erikjacobsen Ekspert
15. februar 2004 - 16:22 #8
prøv
index.php?ske=flash_vis&id=19&Stem=Stem&karakter=1%2B100
Avatar billede sqren Nybegynder
15. februar 2004 - 16:24 #9
erikjacobsen-> Der kan man bare se. Mange tak!
Vil du også være sød at forklare hvordan jeg undgår dette?
Avatar billede erikjacobsen Ekspert
15. februar 2004 - 16:27 #10
Du skal lære at du *aldrig* skal stole på inddata fra brugeren. Aldrig.

Du kan fx:

  if ($karakter='1' || $karakter='2' || $karakter='3' || $karakter='4'
      || ...du fortsætter selv!...) {
    // ok
  } else {
    // fejl
  }
Avatar billede erikjacobsen Ekspert
15. februar 2004 - 16:28 #11
øhm, jeg mener
if ($karakter=='1' || $karakter=='2' || $karakter=='3' || $karakter=='4'
Avatar billede sqren Nybegynder
15. februar 2004 - 16:28 #12
okay... Det prøver jeg!
Avatar billede terrak Nybegynder
15. februar 2004 - 16:30 #13
At sætte register_globals til off ville gøre ende på problemet(hvis det kan lade sig gøre). Så får $karakter nemlig ikke automatisk tildelt værdien fra adresselinjen. Det betyder dog at du skal til at rette i alle dine koder som er kodet til register_globals = on.
Avatar billede sqren Nybegynder
15. februar 2004 - 16:30 #14
terrak-> Det kan jeg vel ikke når B-one er host...?
Avatar billede squashguy Nybegynder
15. februar 2004 - 16:32 #15
i stedet for at sammenligne hver rigtig mulighed, kan du f.eks. lave den sådan:

if(preg_match("/^[0-9]+$/", $karakter) && $karakter > 0 && $karakter <= 10){
  // karakter OK
}
Avatar billede sqren Nybegynder
15. februar 2004 - 16:32 #16
Ville det være okay at gøre sådan:

}elseif($karakter!='1' || $karakter!='2' || $karakter!='3' || $karakter!='4' || $karakter!='5' || $karakter!='6' || $karakter!='7' || $karakter!='8' || $karakter!='9' || $karakter!='10'){
$flash_besked="Forkert karakter";
}

istedet for sådan:
elseif($karakter>10){
$flash_besked="Forkert karakter";
}
Avatar billede erikjacobsen Ekspert
15. februar 2004 - 16:33 #17
Nej terrak. Registerglobals har *intet* med dette problem at gøre. Der kan hackes alligevel.
Avatar billede erikjacobsen Ekspert
15. februar 2004 - 16:34 #18
Hvis du bruger != skal du også bruge && i stedet for ||

Ja, regulære udtryk er smartere. Jeg var blot igang med at forklare problemer og en simpel løsning ;)
Avatar billede terrak Nybegynder
15. februar 2004 - 16:36 #19
Det vil da forhindre at sætte $karakter via adresselinjen?
Avatar billede erikjacobsen Ekspert
15. februar 2004 - 16:38 #20
Ja, terrak, men det er jo ikke det, der er problemet. Du kan lave din egen hmtl-side
med din egen form, hvor der så står en "ulovlig" talværdi i.
Avatar billede terrak Nybegynder
15. februar 2004 - 16:39 #21
Nå ja :)

Så trækker jeg mig tilbage og undskylder.
Avatar billede sqren Nybegynder
15. februar 2004 - 17:01 #22
Så skulle den gerne være der! Hvis i kan finde flere problemer her:
http://www.sjovert.dk/index.php?ske=flash_alle&sorter=Bedømmelse

så må i meget gerne sige det. Ellers læg et svar!
Avatar billede erikjacobsen Ekspert
15. februar 2004 - 17:32 #23
Umiddelbart ingen problemer. Jeg samler ikke på point.

Generelt: skal man samle stemmer, bør man registrere hver stemme med en
række i databasen, så man nemmere kan konstatere, og rette, fejl og
forsøg på "hacking". Man kan evt både lave en sum og et antal, samt
registrere hver stemme. Ved rettelse skal man så blot genberegne
sum og antal.
Avatar billede alvion Nybegynder
15. februar 2004 - 17:51 #24
En anden måde at kontrollere karakteren på er f.eks.

if (!is_number($karakter))
  // fejl

Den fanger $karakter = '1+100'

Så kan du bagefter teste på om nummeret er mindre end 10
Avatar billede erikjacobsen Ekspert
15. februar 2004 - 18:26 #25
Men det er muligt at give negative point, alvion. Dur ikke ;)
Avatar billede alvion Nybegynder
15. februar 2004 - 18:34 #26
Okay, hvis du SKAL være krakilsk... ;-)

if (!is_number($karakter))
  // fejl

if ($karakter < 1 || $karakter > 10)
  // fejl
Avatar billede erikjacobsen Ekspert
15. februar 2004 - 18:56 #27
*g* men så er et regulært udtryk da bedre. Så véd man hvad man får.
Avatar billede erikjacobsen Ekspert
15. februar 2004 - 18:57 #28
(jeg samler som sagt ikke på point, og er faktisk ligeglad med hvordan
du bruger dine point, men konstaterer blot, at du nu har givet dem til en
person, der på intet tidspukt har skrevet noget korrekt. Det er dit valg *g*)
Avatar billede sqren Nybegynder
15. februar 2004 - 19:04 #29
Tjaa... du har vel ret, men jeg har jo fået nogle brugbare svar så jeg kan ikke tage pointene selv. Så jeg gav pointene til den eneste der havde lagt et svar.
Avatar billede alvion Nybegynder
15. februar 2004 - 19:35 #30
erik -> Jeg er enig i det med reg.exp. Faktisk bruger jeg selv en "form validator" klasse, hvor alle form felter blot defineres med navn + en reg.exp. der beskriver valideringen. Så bliver koden også meget enklere at se på.
Avatar billede terrak Nybegynder
15. februar 2004 - 19:43 #31
Fy!

;)

Du skulle selv have lagt et svar og accepteret, hvis ingen andre ville have point.
Avatar billede sqren Nybegynder
19. februar 2004 - 17:05 #32
Hej... Ved godt dette spørgsmål er lukket.. Jeg forstår bare ikke hvordan det kan gå til at en idiot stadig kan ødelægge pointsystemmet. Vi havde da lukket hullet... Oder Was?
Avatar billede alvion Nybegynder
19. februar 2004 - 19:51 #33
Det ved kun du om "vi" har. For det er kun dig, der kan se kildekoden. :-)
Avatar billede sqren Nybegynder
19. februar 2004 - 19:57 #34
Jeg har posted hele point koden helt øvertst. Det skulle vel være den der er et hul i. Med hensyn til "vi" ville jeg på ingen måde give jer ansvaret for at der stadig er et hul. Det er selvfølgelig mit som webmaster. Mente bare ikke jeg kunne være bekendt at skrive: "Jeg havde da lukket hullet", da jeg har fået en masse hjælp af jer.
Avatar billede alvion Nybegynder
19. februar 2004 - 20:07 #35
No prob. skulle bare lige drille... :-)

Men du har jo rettet i koden ovenover, og hvordan du har lavet ændringerne kan vi ikke se.

Smid den tilrettede kode her - så finder vi nok en løsning
Avatar billede sqren Nybegynder
19. februar 2004 - 20:50 #36
Mange tak!
Du skal nok få point hvis det kommer til at virke! Så opretter jeg bare en nyt spm..
Avatar billede sqren Nybegynder
19. februar 2004 - 20:53 #37
Og så er det en god idé også at poste koden ;)

$ip = mysql_query("SELECT * FROM flash_rating WHERE id='$id' AND ip='$REMOTE_ADDR'");

if(mysql_num_rows($ip)>0){

$flash_besked="Du har allerede Stemt";

}elseif($karakter!='' && $karakter!='1' && $karakter!='2' && $karakter!='3' && $karakter!='4' && $karakter!='5' && $karakter!='6' && $karakter!='7' && $karakter!='8' && $karakter!='9' && $karakter!='10'){

$flash_besked="Forkert karakter";

}

elseif($Stem){

mysql_query("UPDATE flash SET stemmer=stemmer+1, point=point+$karakter WHERE id='$id'") or die (mysql_error());

mysql_query("INSERT INTO flash_rating (id, ip) VALUES ('$id','$REMOTE_ADDR')") or die (mysql_error());

$flash_besked="Tak for din stemme!";

   

}elseif(mysql_num_rows($ip)==0) {

$flash_besked="

<form method='POST' action='index.php?ske=flash_vis&id=$id'>



  <select size='1' name='karakter'>

<option selected>Vælg point</option>

  <option value=\"1\">1 - Nedern</option>

  <option value=\"2\">2</option>

  <option value=\"3\">3</option>

  <option value=\"4\">4</option>

  <option value=\"5\">5 - Okay...</option>

  <option value=\"6\">6</option>

  <option value=\"7\">7</option>

  <option value=\"8\">8</option>

  <option value=\"9\">9</option>

  <option value=\"10\">10 - Totalt fed!</option>

  </select>

  <input type='submit' value='Stem' name='Stem'></p>

</form></p>";

}
Avatar billede sqren Nybegynder
19. februar 2004 - 20:53 #38
Dobbelt linieskift... Mystisk...
Avatar billede erikjacobsen Ekspert
20. februar 2004 - 07:33 #39
Som jeg sagde i allerførste kommentar: Man skal altid checke sit input. Du
har fået een af dine parametre checket, men du har glemt at checke alle de
andre. Og du har også ganske ret: vi har på intet tidspunkt garanteret
at allehuller er lukkede.

Du checker fx ikke på din $id, og derfor kan man stemme så mange gange
man vil på fx film nummer 167. Udskift 167+4 med 167+5, osv

http://www.sjovert.dk/index.php?ske=flash_vis&id=167+4&Stem=stem&karakter=8

Man skal *aldrig* stole på input fra brugeren.
Avatar billede sqren Nybegynder
22. februar 2004 - 02:11 #40
Det har du helt ret i. Men hvordan skal jeg tjekke inputtet fra id? Kan jo ikke sige:


}elseif($id!='1' && $id!='2' && $id!='3' && $id!='4' && $karakter!='5' osv.){
echo"WRONG!!!";
}

prøvede at lave noget ereg med at den kun skulle acceptere tal, men det gik ikke så godt...

elseif (!is_number($id)){
echo"WRONG!!!";
}

Er det korrekt???

Noget jeg ikke forstår er at "hackerne kan give tyve point... Man kan ihvertfald se at nogle filer kun har fået én stemme, men tyve point.... hvordan kan det lade sig gøre??? Har JEG (det var det jeg skulle sige ik') ikke lukket hullet med at give for mange pointd?
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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