Olisiko kellään hanskassa miten saisin tähän koodiin sellaisen toiminnon että se estäisin käyttäjää vastaamasta kahta kertaa?
Tässä koodi tähän mennessä:
<? include("dbconnect.php"); $sqllink = mysql_connect($host, $username, $password); if ($_POST["$submit"]){ //if pressed submit $rateitem = $_POST['rateitem']; $ratesum = $_REQUEST['ratesum']; $ratekpl = $_REQUEST['ratekpl']; $rateavg = $_REQUEST['rateavg']; $sql = "UPDATE portfolio SET rateavg = ratesum / ratekpl, ratekpl = ratekpl + 1, ratesum = ratesum + '$rateitem' WHERE id"; $result = mysql_query($sql); if(mysql_affected_rows($sqllink) > 0){ echo 'Thanks!'; } else{ echo 'Error!'; } } ?>
Yritin haeskella koodivinkeistä, mutta ei tärpännyt. Eli miten sais sillai jotenkin et se estäis käyttäjää vastaamasta uudelleen? Kait se jotenkin ip:n kautta pitäis tehdä mut hajuakaan miten. Olisko kellään ideoita minkä lainen koodi sais aikaan tämmäsen?
Auttakkee!
Pseudona:
Verrataan käyttäjän IP:tä kaikkiin kannassa oleviin Jos IP ei ole kannassa Annetaan äänestää ja lisätään IP kantaan Jos IP on kannassa Ei tehdä mitään
IP:n lisäksi toinen vaihtoehto on tallentaa käyttäjälle eväste, joka tarkistetaan ennen vastauksen tallentamista. Molemmissa tavoissa on hyvät ja huonot puolet, itse tekisin varmaan jonkinlaisen yhdistelmän noista. Mikään murtovarmahan tuollainen tarkistus ei ole, mutta vaatii sen verran vaivaa ettei moni välttämättä jaksa alkaa sitä kiertämään.
IP-tarkistuksessa on se huono puoli, että jos ja kun lisäät jonkun proxyn ip-osoitteen sinne listaan, niin sen jälkeen kukaan samaa proxya käyttävä ei voi enää äänestää.
Eväste-tunnistus on siltä kantilta parempi, että nykypäivänä lähes kaikilla normikäyttäjillä nuo evästeet on päällä. Jos joku kuitenkin haluaa spämmätä polliasi, keksien poiskytkeminen selaimen asetuksista on lastenleikkiä. Myös hakukoneet ym botit saattavat sekoittaa polliasi.
Kun kerta alottelija olet, niin suosittelisin opettelemaan noiden evästeiden käytön. Putkan opas auttaa.
https://www.ohjelmointiputka.net/oppaat/opas.
Vähän sitä spämmäämistä voi myös hankaloittaa sillä, että vaadit keksien olevan käytössä, eli tarkastat keksin varmasti menneen perille. Tämäkin on tietysti mahdollista kiertää esimerkiksi poistamalla eväste äänestämisen jälkeen, mutta ainakaan vahingossa silloin ei pääsisi äänestämään useasti.
Jos äänestys on oikeasti tärkeä, niin ei ole muuta mahdollisuutta kuin luoda jokaiselle käyttäjälle henkilökohtainen tunnus (rekisteröinti), jolloin pystyt suoraan tarkkailemaan milloin kukin on äänestänyt.
Mutta jos äänestys on tyylin jokaisella kotisivulla näkyvä pakollinen äänestys, en näe mitään syytä yrittää estää ylimääräisiä ääniä. Syy: jos joku jaksaa nähdä vaivaa poistamalla evästeensä koko ajan, on sen pakko olla mennä tarpeeseen, ja ainahan joku voi "masinoida" äänestämään äm-Irkissä.
it's not such a big deal...
Nonni koitin väsäillä tämmästä, mut se toimii vaan siten että jos kerran äänestää yhtä kohtaa niin kaikki kohdat katsovat että käyttäjä on muka äänestänyt.
<? include("dbconnect.php"); $sqllink = mysql_connect($host, $username, $password); $ip = "$REMOTE_ADDR"; $getip = mysql_query("SELECT * FROM portfolio_ip WHERE rateid"); $getipresult = mysql_fetch_array($getip); if ($ip != $getipresult[ip]){ if ($_POST["$submit"]){ //jos lomakkeesta on painettu lähetä $rateitem = $_POST['rateitem']; $ratesum = $_REQUEST['ratesum']; $ratekpl = $_REQUEST['ratekpl']; $rateavg = $_REQUEST['rateavg']; $getrateid = mysql_query("SELECT * from portfolio order by 'id' desc limit 1"); $rateidresult = mysql_fetch_array($getrateid); $rateid = $rateidresult[id]; $sqlip = "INSERT INTO portfolio_ip (id, rateid, ip) VALUES ('NULL','$rateid','$ip')"; $sqlipquery = mysql_query($sqlip) or die("Cannot query the database.<br>" . mysql_error()); $sql = "UPDATE portfolio SET rateavg = ratesum / ratekpl, ratekpl = ratekpl + 1, ratesum = ratesum + '$rateitem' WHERE id"; $result = mysql_query($sql); if(mysql_affected_rows($sqllink) > 0){ //$sqllink, eli sieltä dbconnect.php:stä se linkki tietokantaan echo 'Kiitos! Äänesi on lisätty .'; }else{ echo 'Virhe! Yritä uudelleen.'; } } }else{ echo 'Olet jo äänestänyt!'; } ?>
Lisäsin mysql taluun kentät: id, ip, rateid. Rateid luodaan jo siinä vaiheessa kun luodaan aihe ja sille annetaan sama id kun portfolio taulu käyttää. Missä vika, miten saan tämän äänten toimimaan jokainen omassa topicissaan?
Ei mikään tietoturvallisin hökötys päällä maan. Tarkista käyttäjien syötteet ennenkuin laitat niitä kantaan, php:n manuskasta mysql:n kohdalta löytynee enemmän infoa. Ja laita dbconnect.php htaccess-suojattuun kansioon tai pois webrootin alta.
Sitten:
-$_REQUESTit korvaa $_POST ja ei "$REMOTE_ADDR" vaan $ip = $_SERVER['REMOTE_ADDR'];.
-<?php ettei sekoteta muihin kieliin vahingossakaan
-select * from is evil.
Aihe on jo aika vanha, joten et voi enää vastata siihen.