Autor Zpráva
Solidgauleiter
Profil
Zdravím. Mám problém. Spravil som jednoduchú návštevnú knihu. je tam aj Antispamová ochrana a i tak tam spamuje dáky robot. Musím to ptm mazať ručne.

Kód:

<?php
$action = $_POST['action'];
$meno = $_POST['meno'];
$mail = $_POST['mail'];
$text = $_POST['text'];
$kontrola = $_POST['kontrola'];

function antispam($email, $meno){
    $return = "<script type=\"text/javascript\"><!--\ndocument.write('<a href=\"' + 'mailto:' + '";
    for($i=0;$i<strlen($email);$i++){
        $code .= $email{$i}=='@' ? "' + '&#".ord("@")."' + '"
                                   : "&#".ord($email{$i}).";";
    }
    $return .= $code."' + '\">' + '".$meno."' + '<\/a>');\n--></script>";
RETURN $return;
}
?>
                      <center>
                       <form name="contactform" id="contactform" method="post" action="navstevna-kniha.php">
                         <table width="450px">
                         <tr>
                          <td valign="top">
                           <label for="meno">Meno: *</label>
                          </td>
                          <input type="hidden" value="uloz" name="action" />
                          <td valign="top">
                           <input  type="text" name="meno" maxlength="25" size="30" value="<?php echo $meno ?>">
                          </td>
                         </tr>
                         <tr>
                          <td valign="top">
                           <label for="text">E-mail:</label>
                          </td>
                          <td valign="top">
                           <input type="text" name="mail" maxlength="50" value="<?php echo $mail ?>" size="30" />
                          </td>
                         </tr>
                         <tr>
                          <td valign="top">
                           <label for="text"><br>Text: *</label>
                          </td>
                          <td valign="top">
                           <textarea  name="text" maxlength="1000" cols="42" value="<?php echo $text ?>" rows="6"><?php echo $text ?></textarea>
                          </td>
                         </tr>
                         <tr>
                          <td>
                          </td>
                           <td>Ochrana proti spamu: 2 + 3 =
                          <input type="text" name="kontrola" value="<?php echo $kontrola ?>" size="8" />
                          </td>
                         </tr>
                         </table>
                         <button type="submit" name="odoslat" value="Odoslať!"> Odoslať !</button>
                         <h2>Položky označené hviezdičkou (*) sú povinné !</h2>
                         <h3>ˆ Pizza Západ 2012</h3>
                       </form>
                      <div class="vysledok">
                      <table>
<?php
if ($action=='uloz'):
$subor = "kniha.body";
@$ext = fopen($subor, "r");
@$obsah = fread($ext, filesize($subor));
@FClose($ext);

if($kontrola != "5"):
echo "<h6>Nesprávny údaj pri ochrane proti spamu !</h6>";
elseif(($text=="") or ($meno=="")):
echo "<h6>Nie sú vyplnené všetky povinné údaje !</h6>";
else:
$ext = fopen("kniha.body", "w");
$mail = HTMLSpecialCHars($mail);

if($mail == "")
$mail = "";
else $mail = antispam($mail,$mail);

$meno = HTMLSpecialCHars($meno);
$text = HTMLSpecialCHars($text);
$tab = "<tr><td width=\"250\" ><b>".$meno." | ".Date(" j.n.Y   H:i")."</b></td></tr>
<tr><td colspan=\"2\"><i>".$text."</i></td></tr>
<tr><td width=\"150\" align=\"right\"><h3>".$mail."</h3></td></tr>
<tr><td width=\"350\"><hr/></td></tr>"; 
fputs($ext, "$tab");
fputs ($ext, "$obsah");
FClose($ext);
@$ext = fopen("kniha.body", "r");
@fpassThru($ext);

endif;
else: @$ext = fopen("kniha.body", "r");
@fpassThru($ext); endif;

?>



Príklad:

http://pizza-zapad.sk/navstevna-kniha.php
LaMMa
Profil
"Ochrana proti spamu: 2 + 3 ="
to je pre robota moc lahke, co tak to pozmenit aspon takto:
"Kolko je 3 - 2 (napiste celym slovom):"
a budes to kontrolovat: if( strtolower($kontrola) !="jedna"):
LaMMa
Profil
Ale spamuje ti to slusne :) ... este si prehod ten kod na ukladanie pred formular a po uspesnom odoslani vymaz $_POSTy vo formulari.
Marek88
Profil
Tu ochranu proti spamu je potřeba udělat trochu komplikovanější... Roboti umějí najít a vyplnit matematický příklad do inputu, který následuje.

Zkusil bych něco jako:
<span>Napište, kolik je 3+2:</span> <input type="text" name="antispam" class="schovane">
<span class="schovane">www:</span> <input type="text" name="www">

Třída schovane obsahuje vlastnost display: none.

Uživatel uvidí:
Napište, kolik je 3+2:  [input, kam se má zapsat číslo pět]
Robot "uvidí":
Napište, kolik je 3+2:  [input, kam se nesmí nic napsat]
www:                    [input, kam se má zapsat číslo pět]

Na tohle už (snad) žádný běžný robot stačit nebude. Kód můžeš samozřejmě různě modifikovat. Tohle je jen pro ilustraci.

Navíc je lepší pro pohodlí uživatele vyplnit hodnotu pomocí js a následně pomocí js celou antispamovou ochranu schovat.


Ty spamovým robotům hodně ulehčuješ práci tím, že tvůj zápis ochrany proti nim odpovídá jednoduchému regulárnímu výrazu:
[0-9]+ *[+-*/] *[0-9]+ *[=:]? *<input // snad tam nemám chybu, píšu to rychle...
Stačí pak už jen příklad vypočítat a input "vyplnit" (zjistit jeho name a odeslat správný požadavek na server).
Solidgauleiter
Profil
Zatiaľ som skúsil tam spraviť komplikovanejší príklad. Je tam delenie odzadu. Takže je tam 2 : 5, ale je tam napísané ž deľte odzadu.. Takže 5 : 2 .. A zatiaľ nič no :) Uvidíme.. ak predsa tak spravím toto čo ste mi napísali..
LaMMa
Profil
Si mal rovno povedať, že sa chceš zbaviť komentárov od ľudí a nie len spamu :D
Keeehi
Profil
Solidgauleiter:
Tak tam dej alespoň příklad, co ti bude vycházet v celých číslech.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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

0