Osoitteessa http://koti.mbnet.fi/mvnet/kotisivuohjeet4.php oli tällainen koodinpätkä, jolla pitäisi kyetä tarkistamaan, mistä palautelomakkeen tiedot on laitettu liikkeelle:
if (eregi("http://palautelomakkeesi_osoite.php", $_SERVER['HTTP_REFERER'])) { // OK } else { exit("Lomake lähetetty palvelimen ulkopuolelta."); }
Vaikuttaa käytännölliseltä. Miten on, takaako riittävän turvan sen varalta, että joku väsää oman lomakkeen?
Ihan mielenkiinnosta: jos käyttäjä haluaa tehdä oman lomakkeen, miksi sellaisen käyttö pitää estää?
Tuohon $_SERVER['HTTP_REFERER']-arvoon ei sinänsä voi luottaa, koska sitä ei läheskään aina lähetetä.
Tarkkaan en tiedä... Mutta jos lomakkeen kenttien pituuksia on rajoitettu maxlength- tai javascript-jutuilla, ne eivät ole voimassa, samoin lomakkeelta laitetut hidden-arvot saattavat muuttua "matkalla".
No tietenkin niitä varten tulee olla täällä neuvotun mukaan palvelinpään tarkistus. Eli kait se niin on, että riittää, kun tarkistaa palvelinpäässä tiedon oikeellisuuden?
Eteen on tullut pari tapausta joissa vieraskirjaa on spammattu jatkuvasti ulkopuolisella lomakkeella hakukonetuloksien parantamiseksi. Siinä ainakin yksi syy tarkastaa mistä lomake on laitettu.
Tuo referer ei välttämättä ole hyvä toteutustapa. Ehkä jos generoisit jonkin dynaamisesti muuttuvan hidden inputin. Eli vaikka jotain tyyliin:
<?php echo " <form> <textarea>Tähän viestisi</textarea> <input type=\"hidden\" name=\"unixtime\" value=\"",time(),"\"> <input type=\"submit\">"; ?>
Ja sitten tarkastat tallennuksen yhteydessä:
<?php if (abs(time() - $_POST['unixtime']) < 36000 && $_POST['unixtime'] > 0 && is_numeric($_POST['unixtime'])) { //Tee mitä oletkin tekemässä, tallenna postin tiedot jne... } else echo "Lomake on vanhentunut, ole hyvä ja yritä uudestaan."; ?>
En jaksa kokeilla tuota koodia mutta mitään täysin toimivaa ratkaisua ei tarkoitus olekaan antaa.
Eli tuossa lähetetään unix-timestamp piilotettuna lomakkeen yhteydessä. Tietoja käsitellessä sitten tarkastetaan kuinka vanha lomake on, tuossa esimerkissä maksimiaika on 36000 sekuntia eli kymmenen tuntia jossa ajassa kyllä kuka tahansa lomakkeen kerkeää täyttämään, mutta esimerkiksi nuo spammerit tuskin jaksavat alkaa erikseen säätämään mitään vastaavia systeemejä...
Edit: Pitipä sitä koodia rukata, liekö vieläkään idiottivarma. Ei näin vastaheränneenä pää pelaa.
Tuolla on keskustelua asiasta enemmän:
http://mureakuha.com/keskustelut/1?7818p1
Ei toimi tuollaisenaan - eikä tarvitsekaan: kukaan ei opi mitään, jos ei ota itse pähkäilläkseen. (Mutta näin PHP:n alussa, ja kun on vielä tarve saada valmista aikaan, on pakko kysyä. Parempi lie kysyä hankalissa kohdissa kuin katua.)
Eli tuosta JTS:n pätkästä: aika pitänee lukea lomaketta avattaessa php:llä serveriltä, ja tallettaa tuon hiddenin arvoksi. Kokeilin nimittäin, ja tuolla "esimerkityllä" tavalla ei aika palaudu lomakkeelta lomakekäsittelijälle.
Ja vaikka, eikös kiero käyttäjä tietenkin osaa muuttaa tuon hiddenin arvoa niin, että lomake ei vanhene.
Tästä taas seuraa, että koko aikatarkistus kannattaa tehdä sessioneilla? Niin taidan tehdä.
Tuli vielä toinen juttu: jos minulla on lomake, jonka lähettäjä saa vahvistuksen viestistään omaan sähköpostiinsa (siihen, jonka on itse syöttänyt lomakkeen kenttään), sehän tekee mahdolliseksi lähettää vahvistuskirjeen mihin tahansa osoitteeseen nimissäni (sillä nimellä, joka minulle on määritelty headereissa).
Eli mulla on Palautetta kotisivulta-lomake. Joku kirjoittaa siihen (öh...): "Haista, Matti-Maija Möttönen, mitä ehdit ja ime 8===3". Sitten tämä laittaa oman osoitteensa sijaan Möttösen osoitteen ja painaa nappia.
Möttönen saa MINULTA tuollaisen vekkulin viestin: "Kiitos mielenkiintoisesta palautteestasi! Haista, Matti-Maija Möttönen, mitä ehdit ja ime 8===3. Terveisin Pale. " Tuotapa ei taitane pystyä estämään millään - vain sulkemaan sen mahdollisuuden pois, että Möttönen ei saa sataa tuollaista viestiä.
pale kirjoitti:
Ei toimi tuollaisenaan - eikä tarvitsekaan: kukaan ei opi mitään, jos ei ota itse pähkäilläkseen. (Mutta näin PHP:n alussa, ja kun on vielä tarve saada valmista aikaan, on pakko kysyä. Parempi lie kysyä hankalissa kohdissa kuin katua.)
Eli tuosta JTS:n pätkästä: aika pitänee lukea lomaketta avattaessa php:llä serveriltä, ja tallettaa tuon hiddenin arvoksi. Kokeilin nimittäin, ja tuolla "esimerkityllä" tavalla ei aika palaudu lomakkeelta lomakekäsittelijälle.
Aika ei palaudu koska näemmä unohdin näemmä laittaa formin methodiksi sen POST:in, GET:illä se taitaa oletuksena tulla. Muuten kait tuon pitäisi toimia. Vaikka edelleenkin kirjoitin tuon koodin enemmänkin "ajatuskoodiksi" kuin valmiiksi koodiksi, jos sait tuosta idean selville niin hyvä, muuhun tarkoitukseen en sitä kirjoittanut. Eli älä odota että kukaan sulle valmiita ratkaisuja antaa, ideoita toteutukseen ennemminkin ja tätä yhtä toteutustapaa yritinkin tuolla esimerkillä valottaa.
Ja tuohan on vain yksi tapa, esimerkiksi keksit ovat toinen tapa.
pale kirjoitti:
Ja vaikka, eikös kiero käyttäjä tietenkin osaa muuttaa tuon hiddenin arvoa niin, että lomake ei vanhene.
Osaa varmaankin (vaikkakaan se ei ihan helppoa ole), siksi ehdotinkin tuota vain mainitsemieni spammereiden poistoon enkä mihinkään pankkipalveluiden rekisteröinnin tarkastajaksi :|
" Eli älä odota että kukaan sulle valmiita ratkaisuja antaa"
Sitä viimeksi. Kokeilen aina perehtyä asiaan itse, mutta usein ei vasta-alkajalla ei taito riitä. Huomauttaisin myös, että jos jotain aloittelijan näkökulmasta kertomisen arvoiseksi katsomaani tiedän, kerron sen jonain pikkuvinkkinä tms. muille. Eli en kerjää valmista, ei kuulu luonteeseeni, ja "maksan takaisin" sikäli kuin pystyn. Vain näin tämä hommeli toimii.
Itse tekisin varmaan sessioilla tarkistuksen, eli kun käyttäjälle näytetään lomake, luodaan sessio, ja sitten lomakkeenkäsittelijä tarkistaa onko sessiota olemassa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.