Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Estää vastaamasta kahta kertaa?

Sivun loppuun

neebo [12.10.2005 00:54:23]

#

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!

Blaze [12.10.2005 07:11:33]

#

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

Heikki [12.10.2005 08:44:53]

#

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.

ajv [12.10.2005 09:29:28]

#

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.php?tunnus=phpj7

Sami [12.10.2005 10:24:17]

#

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.

Lebe80 [12.10.2005 11:21:40]

#

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...

neebo [12.10.2005 14:29:20]

#

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! &Auml;&auml;nesi on lis&auml;tty .';
}else{
		echo 'Virhe! Yrit&auml; 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?

tsuriga [12.10.2005 19:36:59]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta