Autor Zpráva
xciza
Profil
ahoj, na webu mám následující formulář:
<hr width="70%"><br>

<script language="JavaScript" type="Text/Javascript">
function kontrola () {
 if (document.formular.jmeno.value=="") { alert("Musíte vyplnit své jméno"); document.formular.jmeno.focus(); return false; }
 if (document.formular.nazev.value=="") { alert("Musíte vyplnit název inzerátu"); document.formular.nazev.focus(); return false; }
 if (document.formular.antim.value=="") { alert("Musíte vyplnit protispamové políčko"); document.formular.antim.focus(); return false; }
 //if (!document.formular.text.value=="5") { alert("Špatně zadaná hodnota v protispamovém políčku."); document.formular.text.focus(); return false; }
 if (document.formular.antim.value != "6") { alert("Špatně zadaná hodnota v protispamovém políčku."); return false; }

 return true;
}

</script>

<form action="modules/inzerce/add.php" onsubmit="return kontrola()" name="formular" method="post">
<table border="0" cellspacing="0" cellpadding="0">
<tr><td><?php echo get_textil_text("Název","Inzerce"); ?>*</td><td><input type="text" name="nazev" style="width:400px"></td></tr>
<tr><td><?php echo get_textil_text("Jméno","Inzerce"); ?>*</td><td><input type="text" name="jmeno" style="width:400px" value="<?php echo (isset($_SESSION['info_name']) ? $_SESSION['info_name'] : "") ?>"></td></tr>
<tr><td><?php echo get_textil_text("Email","Inzerce"); ?></td><td><input type="text" name="email" style="width:400px" value="<?php echo (isset($_SESSION['info_email']) ? $_SESSION['info_email'] : "") ?>"></td></tr>
<tr><td><?php echo get_textil_text("Rubrika","Inzerce"); ?></td><td><select name="rubrika" style="width:400px"><option>Nabídka</option><option>Poptávka</option></select></td></tr>
<tr><td><?php echo get_textil_text("Heslo","Inzerce"); ?>&nbsp;&nbsp;</td><td><input type="text" name="heslo" style="width:400px"></td></tr>
<tr><td><?php echo get_textil_text("Text inzerátu","Inzerce"); ?>*</td><td><textarea name="text" style="width:400px" rows="7"></textarea></td></tr>
<tr><td>&nbsp;</td><td><label for="antim"><img src="./modules/images/antispam.jpg">(ochrana proti spamu)</label><input type="text" id="antim" name="antim" size="3"> </td></tr>

<tr><td>&nbsp;</td><td><input type="submit" value="<?php echo get_textil_text("Uložit inzerát","Inzerce"); ?>    "> </td></tr>
        <!--<input type="checkbox" id="antim" name="antim" value="1"> <label for="antim"><b>Zde zaškrtněte</b> (ochrana proti spamu)</label></td></tr>-->
        <tr><td>&nbsp;</td><td><br><?php echo get_textil_text("Označené údaje jsou povinné","Inzerce"); ?></td></tr>
</table>

<input type="hidden" name="menuid" value="<?php echo $menuid; ?>">
</form>
<br><br><center><a href="javascript:history.go(-1)"><?php echo get_textil_text("Zpět","Inzerce"); ?></a></center>

Problém je v tom, že mě jako uživatele při zadávání nového záznamu, formulář nepustí dále, pokud nezadám správnou hodnotu do antispam pole (což je dobře). Ale nějaký robot stále bez problémů přidává nesmyslné záznamy na stránku. Ptám se tedy: Je tento formulář v pořádku a mám hledat chybu jinde (i když nevím kde)?

Díky
tiso
Profil
A kontroluješ v tom skripte add.php, či v tom políčku antim máš správnu hodnotu?
xciza
Profil
jj je tam klasická podmínka
xciza
Profil
případně ješte doplním tu podmínku:
$antim = $_POST['antim'];

if(!$antim == 6){
//přesmerovani zpet na stranku formulare;
    exit; 
}
//SQL dotaz na insert udaju do tabulky
//presmerovani

do promenne antim se ta hodnota vklada spravne - pri dupnutí tam je.
jenikkozak
Profil
Zkoušel jsi změnit hodnotu, kterou je nutné do toho políčka zadat?
Nevím, jestli je dobré přímo v tom JS správnou hodnotu uvádět.
xciza
Profil
Myslíš zmenit ji v JS nebo v PHP?
jenikkozak
Profil
Změnit bys ji musel všude. V kontrole v PHP, v obrázku i v tom JS. Zkus tam dát dvojciferné číslo větší než 20. Pokud to nepomůže, bude potřeba zvolit jiné řešení.
xciza
Profil
No puvodne tam byla 5 ale zkusim to dvouciferne. Ale kdyz uz robot pozna jednociferne tak dvouciferne mu asi problem delat nebude ne?
jenikkozak
Profil
Pro spoustu robotů to problém bude, protože ony zkoušejí do neznámých políček vládat náhodné hodnoty, nejčastěji čísla do 10.
Je dobré si logovat neúspěšné snahy o vyplnění formuláře. Z toho pak můžeš poznat, jestli se robot snažil hodnotu uhodnout, nebo šel na jistotu.
xciza
Profil
OK, zkusím změnit a pak se ozvu.
had
Profil *
...co zvolit spíš jiné řešení ochrany a neobtěžovat uživatele opisováním nějakých počmáraných obrázků...?

http://michal.skrabalek.cz/navody/opravdu-funkcni-antispam-reseni tady je něco pro inspiraci...

navrhuju ještě své řešení - do databáze uložit několik náhodně vygenerovaných řetězců (třeba 100) a ty střídat ve skrytém poli. Roboti a parazitní formuláře často tyhle "náhodně generované" řetězce mění a vytváří vlastní. Dostanu-li jiný řetězec, než těch mých 100 oblíbených, vím s jistotou, že je to spam / parazit.
xciza
Profil
Tak dvouciferne cislo nepomohlo.. zkusim reseni od HADa
xciza
Profil
Tak jsem to prepsal takto:
Do formu:
 <input type="text" name="antispam" value="" />

V CSS:
input[name="antispam"] { display: none; }

Kontrola v php
$antim = $_POST['antispam'];

if ($antim != "") {
    header("Location: XY.php");
    exit;
}

Je to v pořádku nebo to mám ještě nějak upravit?
jenikkozak
Profil
Ano, tohle je jedna z metod. Místo „antispam“ bych ale zvolil nějaký lákavější název, např. url, www nebo web.

Tak dvouciferne cislo nepomohlo
Trefil ho na první pokus? To by znamenalo, že umí přečíst obrázek. Takže by to mohl být robot, co umí číst obrázky, nebo člověk, což by byla o dost horší varianta.
xciza
Profil
ok jeste zmenim nazev pole.
no myslim ze clovek by to tam asi nevkladal kazdej den
had
Profil *
Co časová prodleva ve formuláři? A dvě odesílací tlačítka...? + záměna action formuláře javascriptem před odesláním?

Pokud byste chtěl zůstat u stávajícího řešení, určitě bych změnil name (formulář musí být přirozený, nebo neutrální) a nezačínal bych s value="", ale s nějakou předepsanou hodnotou... někteří chytří roboti nemusí vyplňovat všechno (třeba nepovinné pole web), kdežto formulář odešlou všemi odesílacími tlačítky, protože zpravidla netuší, které je správné...
xciza
Profil
Na web jsem dal hidden pole a zatim je to OK. robot neprojde

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: