Už vim jak na roboty, ale nevim jak to udělat.. :-)

Hledal sem na netu dost info jak zabránit robotů a už to vim, ale nevim jak to udělat, protože nejsem zkušený programátor.

Mám návštěvní knihu a chtěl bych tam přidat pole, u kterého by bylo napsáno: Nech toto pole prázdné a pokud by prázdné bylo, příspěvek by šlo uložit, pokud ne, pokud by tam něco bylo, neuložilo by se to.

ps. jinak tohle neni z mý hlavy :-)
Co vím, tak nrelativně spolehlicá ochrana před roboty je udělat nejdřív náhled komentáře. Robot se nenamáhá odesílat formulář znova.
prazdne pole:
<input type="text" name="kontrol_pole"> Nech toto pole prazdne!

pak pri zpracovani dat to jen porovnas

if($kontrol_pole=="")
{
vypis prispevek
}
else
{
nic nedelej
}
ja bych mozna pouzil
$kontrol_pole===""
a jeste mozna kontrolovat isset()
3 rovna se? co to dela?
= jendakenda (gonzik.wz.cz) =
http://cz2.php.net
operace
x=1 prirazeni
(x=1) testujes, jestli se zdarilo prirazeni, priradis 1
(x==1) podminka
(x===1) podminka+stejny typ
já myslím že ta nejjednodušší verze je většinou ta správná :)

otázka kolik je tři a tři
//otázka zůstává vždy stejná

odpoved je ve formě číslice nebo slova
//je to vlastně jedno záleží na vás

if ($odpoved == "6") // může být i "sest" (jak jsem řekl záleží jen na vás)
{ script pokračuje }
else
{ vypiš chybu o odpovedi }
= Jiří Počta (jiripocta.wz.cz) =
genialni :) Jen bych volil slozitejsi otazku, aby slovo melo vic, jak 6 znaku
vaše rady sou dobré, ale nějak se v tom nevyznam
<?
Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT");
?>


<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">

<title>Fórum guildy HoP - Heroes of Paradise</title>
</head>
<body bgcolor="#333333" text="#FFFFFF" link="#00FF00" vlink="#00FF00" alink="#FF0000">
<table width="0" align="center">
<tr>
<td width="0">
<center><font face="Tahoma"color="red">Fórum guildy H<a href="http://dpguild.wz.cz/main.php?page=novinky">o</a>P - Heroes of Paradise</font>
<br><br>

<hr color="#FFFFFF">
<br>
<table border="0" cellspacing="0" cellpadding="0" align="center">
<form action="" method="post">
<tr>
<td width=120 class=povinne>
MENO:
</td>
<td>
<input type="text" name="meno" size="20" value="<?
if ($meno=="" || $email=="" || $popis==""):
echo $meno;
endif;
?>">
</td>
</tr>
<tr>
<td width=120 class=povinne>
EMAIL:
</td>
<td>
<input type="text" name="email" size="20" value="<?
if ($meno=="" || $email=="" || $popis==""):
echo $email;
endif;
?>">
</td>
</tr>
<tr>
<td width=120 class=nepovinne>

</td>
<td>
<?
if ($meno=="" || $email=="" || $popis==""):
echo $web;
endif;
?>
<input type="hidden" name="odoslane" value="ano">
</td>
</tr>
<tr>
<td valign=top width=120 class=povinne>
TEXT:
</td>
<td>
<textarea cols="25" rows="3" name="popis"><?
if ($meno=="" || $email=="" || $popis==""):
echo $popis;
endif;
?></textarea>
</td>
</tr>
<tr>
<td width=120> 
</td>
<td>
<center><input type="submit" value="Submit">   <input type="Reset" value="Reset"></center>
</td>
</tr>
</form>
</table>

<?
if ($odoslane=="ano"):
if ($meno=="" || $email=="" || $popis==""):
echo "<center><br><font class=male>Vyplnte všetky údaje<br></font></center>";

else:

$name = "<font class=meno>$meno</font><BR>\n";
$e_mail = "<A class=odkaz HREF=mailto:$email>$email</A><BR>\n";
if ($web!=""):
$www = "<A class=odkaz HREF=\"$web\">$web</A><BR>\n";
endif;
$cas = "<font class=cas>" . Date("j. " . "m. " . "Y, " . "H:i:s") . "</font><BR>\n";
$popis2 = NL2BR(HTMLSpecialChars($popis));
$zprava = "<BR><font class=text>$popis2</font><BR><BR><HR color=\"#FFFFFF\"><BR>\n\n";

$write = StripSlashes($name . $e_mail . $www . $cas . $zprava);

if (File_Exists ("book.dat")):
$fp = FOpen ("book.dat", "r");
$data = FRead ($fp, FileSize("book.dat"));
FClose($fp);
endif;
$fp = FOpen ("book.dat", "w");
FWrite ($fp, $write.$data);
FClose ($fp);
endif;
endif;
?>

<hr color="#FFFFFF"><br>

<?
if (File_Exists ("book.dat")):
$fp = FOpen ("book.dat", "r");
FPassThru($fp);
endif;
?>

</td>
</tr>
</table>
</body>


..to je script, který používám, zkoušel jsem to, ale nevim kam to dát :-)
A kde je to ošetření proti robotům ? :D
<?
Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT");
?>


<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">

<title>Fórum guildy HoP - Heroes of Paradise</title>
</head>
<body bgcolor="#333333" text="#FFFFFF" link="#00FF00" vlink="#00FF00" alink="#FF0000">
<table width="0" align="center">
<tr>
<td width="0">
<center><font face="Tahoma"color="red">Fórum guildy H<a href="http://dpguild.wz.cz/main.php?page=novinky">o</a>P - Heroes of Paradise</font>
<br><br>

<hr color="#FFFFFF">
<br>
<table border="0" cellspacing="0" cellpadding="0" align="center">
<form action="" method="post">
<tr>
<td width=120 class=povinne>
MENO:
</td>
<td>
<input type="text" name="meno" size="20" value="<? echo $_POST['meno'];?>">
</td>
</tr>
<tr>
<td width=120 class=povinne>
EMAIL:
</td>
<td>
<input type="text" name="email" size="20" value="<? echo $_POST['email'];?>">
</td>
</tr>
<tr>
<td width=120 class=povinne>
WEB:
</td>
<td>
<input type="text" name="web" size="20" value="<? echo $_POST['web'];?>">
</td>
</tr>
<tr>
<td width=120 class=nepovinne>

</td>
<td>
<input type="hidden" name="odoslane" value="ano">
</td>
</tr>
<tr>
<td valign=top width=120 class=povinne>
TEXT:
</td>
<td>
<textarea cols="25" rows="3" name="popis"><? echo $_POST['popis']?></textarea>
</td>
</tr>
<tr>
<td valign=top width=120 class=povinne>
KOLIK JE 6+6(slovy):
</td>
<td>
<input name="soucet" type="text" value="">
</td>
</tr>
<tr>
<td width=120>
</td>
<td>
<center><input type="submit" value="Submit"> <input type="Reset" value="Reset"></center>
</td>
</tr>
</form>
</table>

<?
if($_POST['soucet']=="dvanáct"){
if ($_POST['odoslane']=="ano"):
if ($_POST['meno']=="" || $_POST['email']=="" || $_POST['popis']=="" || $_POST['web']==""):
echo "<center><br><font class=male color=\"#FFFFFF\">Vyplnte všetky údaje<br></font></center>";

else:

$name = "<font class=meno>".$_POST['meno']."</font><BR>\n";
$e_mail = "<A class=odkaz HREF=mailto:".$_POST['email'].">".$_POST['email']."</A><BR>\n";
if ($_POST['web']!=""):
$www = "<A class=odkaz HREF=\"".$_POST['web']."\">".$_POST['web']."</A><BR>\n";
endif;
$cas = "<font class=cas>" . Date("j. " . "m. " . "Y, " . "H:i:s") . "</font><BR>\n";
$popis2 = NL2BR(HTMLSpecialChars($popis));
$zprava = "<BR><font class=text>$popis2</font><BR><BR><HR color=\"#FFFFFF\"><BR>\n\n";

$write = StripSlashes($name . $e_mail . $www . $cas . $zprava);

if (File_Exists ("book.dat")):
$fp = FOpen ("book.dat", "r");
$data = FRead ($fp, FileSize("book.dat"));
FClose($fp);
endif;
$fp = FOpen ("book.dat", "w");
FWrite ($fp, $write.$data);
FClose ($fp);
endif;
endif;
?>

<hr color="#FFFFFF"><br>

<?
if (File_Exists ("book.dat")):
$fp = FOpen ("book.dat", "r");
FPassThru($fp);
endif;
}

?>

</td>
</tr>
</table>
</body>
díííky mocinky, du to zkusit
HUSTý! to je vono, návštěvníci nevidí fórum, kokud neznají heslo...

..jenom takový "pls" co mám smazat, aby se to neptalo na ten web..
už sem to vyřešil... dík
Roboti (pokud se nemylim) nerozpoznavaji JS, takze lze v nejake hidden polozce predavat libovolny hash prispevku (treba pocet znaku krat pocet mezer, nebo prvnich 5 znaku). V PHP pak jen kontrolovat, jestli je hash odpovidajici. Kod asi takto (bez zaruky - netestoval jsem)

Hlavicka:
<script type="text/javascript">
function writehash(){
document.f.hash.value=document.f.text.value.substr(0, 5);
}
</script>

Formular:
<form name="f" action="..." method="POST" onsubmit="writehash();">
<input type="hidden" name="hash" value="xyz"/>
<textarea name="text"></textarea>
<button type="submit">Odeslat</button>
</form>

PHP Kontrola:
<?
$hash=substr($_POST['text'], 0, 5);
if($hash==$_POST['hash']){
... spravne ...
} else {
.. BOT ...
}
?>

Jeidiny problem teto konkretni implementace je, ze pada na retezcich kratsich nez 5 znaku, takze by se muselo pridat do JS, ze ne nema provadet, pokud je prispevek kratky a do PHP, ze pro kratke prispevky je hash prazdny (to se mi ale nechce delat)
=tohe (strelka.unas.cz)=
A co, kdyz JS nemas?
A co kdyz robota ridi clovek a prohlidne si zdrojak a proste robotu jen zmeni nastaveni?
A jeste je mozne dat do kodu INPUT, vyplnit a pres JS skryt. Tim padem je to osetrene i bez JS a predpoklada se, ze robot prepise vsechny polozky INPUT, ktere objevi.