Autor Zpráva
shamania
Profil *
Ahoj.. chtěl bych se zeptat jak mám udělat ochranu proti spamu pomocí vygenerovaného obrázku s číslicemi, tak jak se to už hojně používá.. V podstatě vim jak na to, ale mám problémy s na stavováním hlaviček. Jednou se mi zobrazí jen ten obrázek bez html jindy stránka, ale plná znaků (obrázek v asci) no a tak no.. Na internetu jsem na nic nenarazil co by mi pomohlo, ale jestli o něčem víte, tak mě na to prosím odkažte.. Uvítám každou radu, děkuji!
krteczek
Profil
vykašli se na obrázek, a použij něco na tento zpusob:
<label for="kontrol">napište číslici čtyři: </label><input type="text" id="kontrol" name="kontrol">
a na konci si to zkontroluješ. krteczek
krteczek
Profil
dobře dávám k dispozici funkci:


<?php
function cislo_text()
{
$ck=array( 1 => 'jedna',
2 => 'dvě',
3 => 'tři',
4 => 'čtyři',
5 => 'pět',
6 => 'šest',
7 => 'sedm',
8 => 'osm',
9 => 'devět'
);
$cis=rand(1,count($ck));
$vystup[1]=$ck[$cis];//čísla jedna-devět
$vystup[2]=$cis;//číslice 1-9
return $vystup;

}

/
?>

takže funkci máme, jdeme ji použít. definuji si prázdné proměnné na začátku scriptu, a mužu je tím pádem kdekoliv ve scriptu použít bez ověřování, čehož využívám u formuláře

//nulování proměnnách
$titulok='';
$komentar='';
$sprava='';
if(isset($_POST['ok']))
{ //nejprve si zpracujeme obsah všech proměnných $_POST['titulok'],$_POST['text'],
//to si vyřešte :-) jen pro inspiraci:
if((!empty($_POST['titulok'])) and (trim($_POST['titulok']!='')))
{
$titulok=htmlspecialchars($_POST['titulok']);
//a další ošetření jako max délka řetězce...
}
if($titulok=='')
{
$sprava.='<p class="varovani">Nevyplnili jste titulek.</p>';
}
//jdeme zkontrolovat jestli bylo vyplněno i číslo
if((!empty($_POST['testik']))and(!empty($_SESSION['cislo_kontrola']))a nd ($_SESSION['cislo_kontrola']==$_POST['testik']) and ($sprava==''))
{
//vše je v pořádku můžeme zprávu uložit (podle sebe)
}
else
{
$sprava.='<p class="varovani">Nenapsali jste číslo, nebo je vámi zadané číslo jiné než to, které bylo zobrazeno.</p>';
}
}
echo $sprava;
//volání funkce:
$cislo_kontrola=cislo_text();

//předání předání čísla (1-9) do session
$_SESSION['cislo_kontrola']=$cislo_kontrola[2];

//zobrazení formuláře s kontrolním inputem
echo '<p>Zde můžete přidat příspěvek do knihy návštěv.</p>'."\n".
'<form name="form" method="post" action="index.php?kniha=pridat">
<label for="titulok">Titulek:</label><input type="text" id="titulok" name="titulok" size="30" value="'.$titulok."' maxlength="30">
<label for="komentar">Komentář:</label><textarea id="komentar" name="komentar" cols="34" rows="5">'.$komentar.'</textarea>
<label for="testik">Prosím napište číslici '.$cislo_kontrola[1].':<br><small>(Je to ochrana před zaneřáděním knihy příspěvky, které odesílají spamovací roboti...)</small></label><input type="text" name="testik" size="30" maxlength="50">
<input type="submit" name="ok" value="Odeslat komentář">
</form>';
?>


celý skriptík je psán tak aby v případě že dojde k odeslání formuláře, ale nebude vyplněna některá položka, zobrazí se opět formulář s již vyplněnými hodnotami, s výjimkou testik který se s každým reloadem stránky mění, takže nelze vložit ten předešlý.
Je třeba dopsat kontrolu komentar, z nastíněného řešení je zřejmé kudu postupovat.
kkrteczek
PS:Omluvte případné chyby, nekoukal jsem na to v editoru ale psal to rovnou sem (něco stylem copy->paste)
shamania
Profil *
Děkuji za víc než vyčerpávající odpověd, ale řekněme, že tuto lekci php už nepotřebuji :) chtěl jsem to udělat přes obrázek, ale pokud to do týdne nesprovoznim, tak to udělám v podstatě výše popsanym způsobem i když mi to nepřijde zcela stoprocentní řešení..
děkuji
krteczek
Profil
shamania: toto je myslím si, jednoduché, účinné, navíc je to i přístupné, kdo píše umí i číst, je to rozhodně přístupnější řešení než captcha (nevidomí a slabozrací s captcha nemají šanci odeslat regulérně příspěvek). krteczek
dodatek:
dal jsem to zde celé proto aby případní další zájemci nemuseli tápat. myslím že udělám článeček u sebe na Jak na to?
24k
Profil *
krtecku ze ty dycky pises takovy romany ;)
krteczek
Profil
24k: a tobě to nedá a musíš si rypnout... :-( krteczek
llook
Profil
Obrázek v ascii? Tipuju že problém bude v těch hlavičkách. Ten skript, který ti generuje obrázek (adresu tohodle skriptu pak dáváš do <img src="">) musí posílat správnou hlavičku Content-type, například v případě jpegu:
header("Content-type: image/jpeg");
shamania
Profil *
tak jsem to vyřešil krtečkovým způsobem.. děkuji :) jednoduché a doufám, že účelné.. časem se ještě ozvu :)
Toto téma je uzamčeno. Odpověď nelze zaslat.

0