Hei!
Vieraskirjaani tulee kokoajan tämänkaltaista sotkua.
UP1nTJ <a href=\"http://oamdabyfcidj.com/\">oamdabyfcidj</a>, [url=http://mzlszwdaimll.com/]mzlszwdaimll[/url], [link=http://gbydtyinfxaq.com/]gbydtyinfxaq[/link], http://cbluitsgalip.com/
Miten nämä olisi paras estää?
Mod. lisäsi kooditagit
Jos se tulee aina samasta IP-osoitteesta, IP-bannit on varmaan helpoin ratkaisu. Toinen vaihtoehto on se, että laitat vieraskirjaan jonkun Captcha-virityksen.
Tarvitset vieraskirjaasi jonkun varmistuksen, että kirjoittaja on ihminen. Edellä mainittu CAPTCHA on varmaankin paras, mutta näissä voi olla ongelmana, että edes ihminen ei saa (helposti) selvää merkeistä. Jotkin pienet kysymykset ("Mikä on Suomen pääkaupunki?") tai laskutoimitukset ("Paljonko on neljä plus kolme?"), joihin oletat kirjoittajan osaavan vastata, ovat hyviä estämään botteja. Näiden pitää vaihtua joka sivulatauksella, sillä botit voivat saada tarpeaksi monen yrityskerran jälkeen oikean vastauksen. Tyhmimmät botit voi rajata pois lisäämällä sivulle kentän, joka on piilotettu CSS:llä (display: none;
). Sen sisältö tarkistetaan palvelimen päässä, ja hylätään viesti, jos kenttä ei ole tyhjä.
Vielä yksi mahdollisuus on hylätä viestit, joissa on kiellettyjä sanoja. Esimerkiksi jos kaikissa roskaviesteissä lukee "[link=", ne voi tunnistaa tämän perusteella.
Kokeilenpa ensin rajata tyhmät botit pois ja jos ongelma jatkuu niin siirryn Captcha-viritykseen.
Tein yksinkertaisen esimerkin tuollaisesta toteutuksesta.
Tarkistus:
<img src="varmista.php"> <form action="" method="post" /> <input type="text" name="varmista" /> <input type="submit" name="submit" value="Lähetä" /> </form> <p>Ole hyvä ja syötä yllä oleva koodi alla olevaan kenttään.</p> <?php if (isset($_POST["submit"])) { if ($_COOKIE["varmistus"] == $_POST["varmista"]) { laheta_viesti(); } else { tulosta_virhe(); } setcookie("varmistus", "", time()-9000); } ?>
Kuvan luonti:
<?php header('Content-type: image/png'); $merkit = "abcdefghijlmnopqrstuvwxyz123456789"; $merkkijono = ""; for ($i = 0; $i < 8; $i++) { $merkkijono .= $merkit[rand(0, 33)]; // Arvotaan luku 0:n ja 33:n väliltä ja haetaan vastaava kirjain merkeistä. } $kuva = imagecreate(124, 38); // Luodaan kuva. // Määritetään värit. $tausta = imagecolorallocate($kuva, 255, 255, 255); $teksti = imagecolorallocate($kuva, 0, 0, 0); $viiva = imagecolorallocate($kuva, 0, 0, 255); // Piirretään. imagestring($kuva, 5, 10, 10, $merkkijono, $teksti); imageline($kuva, 12, 12, rand(0, 40), rand(0, 40), $viiva); imagepng($kuva); imagedestroy($kuva); setcookie("varmistus", $merkkijono); ?>
Jos botti ei osaa tallentaa keksejä, tuon pitäisi toimia. Keksistä nimittäin selviää generoitu merkkijono.
Kiitoksia
Eikös yleensä "Jätä seuraava kenttä tyhjäksi" -viritelmäkin tepsi tuollasiin, joka siis tungetaan css:llä piilotettuun diviin. Spämmibotit täyttävät yleensä jokaisen kentän samalla sotkulla.
raakaliha kirjoitti:
Eikös yleensä "Jätä seuraava kenttä tyhjäksi" -viritelmäkin tepsi tuollasiin, joka siis tungetaan css:llä piilotettuun diviin. Spämmibotit täyttävät yleensä jokaisen kentän samalla sotkulla.
Miksi se pitäisi olla piilotettu divi?
Siis ei pidä, on kauniimpi vaa.
raakaliha kirjoitti:
Siis ei pidä, on kauniimpi vaa.
Voihan botinkin tehdä niin, että se navigoi nettiselaimella osoitelistaa pitkin, siirtyy kentästä toiseen, täyttää ne ja painaa submit-nappia. Harvat taitaa näin tehdä, mutta on näitäkin varmasti olemassa.
On olemassa jopa botteja, jotka ajavat sivuun liittyvän JavaScriptin, ja tämä on varmasti suurempi saavutus kuin muutaman yksinkertaisen CSS-tyylin tunnistaminen. Niinpä valitettavasti suoraviivainen piilottaminen ei ole varma temppu. Parempaan tulokseen saattaisi päästä mutkikkaammilla CSS-kikkailuilla, jotka eivät varsinaisesti tee elementistä näkymätöntä vaan vain sijoittavat sen niin, ettei oikea käyttäjä voi huomata sitä.
Metabolix kirjoitti:
On olemassa jopa botteja, jotka ajavat sivuun liittyvän JavaScriptin, ja tämä on varmasti suurempi saavutus kuin muutaman yksinkertaisen CSS-tyylin tunnistaminen. Niinpä valitettavasti suoraviivainen piilottaminen ei ole varma temppu. Parempaan tulokseen saattaisi päästä mutkikkaammilla CSS-kikkailuilla, jotka eivät varsinaisesti tee elementistä näkymätöntä vaan vain sijoittavat sen niin, ettei oikea käyttäjä voi huomata sitä.
Ei JavaScriptillä mitään varmistuksia tehdä, miten sen ajaminen liittyy asiaan? Jos display tagit luetaan niin jotain tämän tapaista voi kokeilla:
<div style="width: 0px; height: 0px; overflow: hidden;"> <!-- ... --> </div>
Näin sellaisen jutun kerran, jossa pyydettiin lisäämään kahteen vierekkäiseen kenttään toisistaan poikkeavat, nollaa suuremmat kokonaisluvut; mitä olette tästä mieltä?
Aihe on jo aika vanha, joten et voi enää vastata siihen.