Autor Zpráva
JayykI
Profil
Ahoj, udělal jsem si jednoduchou Poradnu na webu, prostý formulář. Potřeboval bych tam dát anti-spamovou ochranu, ale nevím jak na to, věděl by prosím někdo?
Zdroj. kód:
<?
$data="data.txt"; // file guestbook data
$maxchar=500; // maximum characters for guesbook comments

  function conv_asc2html($str,$mode){
   if ($mode==1){
      $str=str_replace("&gt;",">",$str);
      $str=str_replace("&lt;","<",$str);
   }
   if ($mode==2){
      $str=str_replace(">","&gt;",$str);
      $str=str_replace("<","&lt;",$str);
   }
   return $str;
}

  function splitwordx(&$text,$w_max,$w_cut){
   if (!strstr($text," ")){ $text=$text." "; }
   $word = explode(" ", $text);
   if (empty($w_max)){ $w_max=10; }
   if (empty($w_cut)){ $w_cut=10; }
   for ($w=0; $w<count($word); $w++){
      $wordlen=strlen($word[$w]);
      if ($wordlen>$w_max){
         $wordnew="";
         $wordpart="";
         for ($l=0; $l<ceil($wordlen/$w_cut); $l++){
            $wordpart[$l]=substr($word[$w],($l*$w_cut),$w_cut)." ";
         }
         $wordnew=implode(" ",$wordpart);
         $word[$w]=$wordnew;
      }
   }
   $text = implode(" ", $word);
   return $text;
}

  function disperr($str){
   echo "<table border=1 cellspacing=0 cellpadding=10 style=\"border-collapse:collapse\" bordercolor=#FFCCCC bgcolor=#FFEEEE><tr><td><font color=#FF0000 style=\"font-size:14px\"><b>Vnitřní chyba:<br>$str</td></tr></table>\n";
}

  // *** CHECKING FILE EXISTING
if (!file_exists($data)){
  disperr("Soubor &quot;$data&quot; nenalezen!");
  exit;
}

  ?>
<html>
<head><title>Poradna</title>

  <style><!--
BODY {font-family:tahoma; background-color:#B0C4DE; font-size:12px}
TD {font-family:tahoma; font-size:12px}
INPUT {font-family:tahoma; font-size:12px}
TEXTAREA {font-family:tahoma; font-size:12px}
SMALL {font-family:tahoma; color=#666666; font-size:11px}
--></style>

  <script language="javascript">
<!--
function jumlahKata(form)
{ with (form)
  { sisa.value = <?=$maxchar?>-fcomment.value.length;
    if (parseInt(sisa.value)<0) { sisa.value = '0'; }
    fcomment.value = fcomment.value.substr(0,<?=$maxchar?>);
  }
  return;
}
//-->
</script>

  </head>
<body>
<center>
<h3>Vítejte v mé jednoduché on-line poradně, do které mi pište své problémy s počítačem. <p>Budu se snažit vám pomoci.</h3>
<?

  // *** LOADING DATA
   if($file=fopen($data,"r"))
   {
      while(!feof($file))
      {
         $contents_old.=fgets($file,255);
      }
      fclose($file);
   }

  // *** UPDATING CONTENT
if ($_POST[act]=="post"){
   if (empty($_POST[fname])){ $ferr.="<li>Zadejte prosím své jméno!"; }
   if (empty($_POST[femail])){ $ferr.="<li>Zadejte prosím svůj e-mail"; }
   if (empty($_POST[fcomment])){ $ferr.="<li>Zadejte prosím dotaz"; }

     if (!empty($ferr)){
      disperr($ferr);
   } else {
      $ftanggal=date("d M Y - H:i");
      splitwordx($_POST[fname],30,5);
      splitwordx($_POST[femail],50,30);
      splitwordx($_POST[fhomepage],50,30);
      splitwordx($_POST[fcomment],30,5);
      $fcomment=substr($_POST[fcomment],0,$maxchar);
      $contents_new="|line|".$ftanggal;
      $contents_entry="|#|".$_POST[fname]."|#|".$_POST[femail]."|#|".$_POST[femail_show]."|#|".$_POST[fhomepage]."|#|".$_POST[fcomment];
      $contents_new.=$contents_entry;
      $contents_new=stripslashes($contents_new);
      $contents_new=conv_asc2html($contents_new,1);
      if (strstr($contents_old,$contents_entry)){
         disperr("Opakující se přípěvek. Zamítnuto!");
      } else {
         if ($file=fopen($data,"w")){
            $contents_new=$contents_new. "\r\n" . $contents_old;
            fputs($file,$contents_new);
            fclose($file);
            $contents_old=$contents_new;
         }
      }
   }
}
   echo "<table bgcolor=#EEEEEE border=1 cellspacing=0 cellpadding=5 style=\"border-collapse:collapse\" bordercolor=#999999>\n";
   echo "<FORM name=pesan METHOD=\"post\" ACTION=\"".$_SERVER[PHP_SELF]."\">\n";
   echo "<tr><td>Jméno* :<td><input name=\"fname\"></tr>\n";
   echo "<tr><td>E-mail* :<td><input name=\"femail\" width=10> \n";
   echo "<input type=\"checkbox\" name=\"femail_show\" value=\"y\" checked><small>ukázat e-mail</tr>\n";
   echo "<tr><td>Operační systém :<td><input name=\"fhomepage\" size=30></tr>\n";
   echo "<tr><td>Dotaz* :<td><textarea max=\"$machar\" name=\"fcomment\" rows=5 cols=40 ";
   echo " onKeyup='jumlahKata(document.pesan);' RAP";
   echo "></textarea><small><br>Max. $maxchar znaků. ";
   echo "Zbývající počet znaků : <input type=\"text\" size=3 name=sisa maxlength=3 value=\"$maxchar\">";
   echo "</tr>\n";
   echo "<input type=hidden name=act value=post>";
   echo "<tr><td colspan=2><div>*: <small>Povinná pole</small></div><div align=center><input type=\"submit\" name=\"btpost\" value=\"Odeslat\"> <input type=\"reset\"></div></tr>\n";
   echo "</FORM>";
   echo "</table>\n";
   



     $contents_old=conv_asc2html($contents_old,2);
   $ar_row=explode("|line|",$contents_old);

     $recperpage=10;
   $row_first=1;
   $row_last=count($ar_row)-1;
   if (empty($_GET[row_start])){ $_GET[row_start]=$row_first; }
   $row_end=$_GET[row_start]+$recperpage-1;
   if ($row_end>$row_last){ $row_end=$row_last; }

     if ($row_last>$recperpage){
      echo "Stránka : ";
      for ($p=1; $p<=ceil($row_last / $recperpage); $p++){
         if ($p>1){ $start=((($p-1)*$recperpage)+1);
         } else { $start=1; }
         echo "[<a href=\"$PHP_SELF?row_start=$start\">$p</a>] ";
      }
   }

  //echo "first:$row_first|start:$row_start|end:$row_end|last:$row_last";
   echo "&nbsp;<table bgcolor=#EEEEEE border=1 cellspacing=0 cellpadding=5 style=\"border-collapse:collapse\" bordercolor=#999999>\n";
   for ($r=$_GET[row_start]; $r<=$row_end; $r++){
      $ar_field=explode("|#|",$ar_row[$r]);
      $tanggal=$ar_field[0];
      $name=$ar_field[1];
      $email=$ar_field[2];
      $email_show=$ar_field[3];
      if ($email_show=="y"){
         $email="(<a href=\"mailto:$email\">$email</a>)";
      } else {
         $email="(<font color=#666666>E-mail schován!</font>)";
      }
      $homepage=$ar_field[4];
      $comment=$ar_field[5];
      echo "<tr><td rowspan=2>$r <td><small>$tanggal<td><small>$name $email<td><small>$homepage</tr>\n";
      echo "<tr><td bgcolor=#EEEECC colspan=3>$comment</tr>\n";
   }
   echo "</table>\n";
   echo "<big> <a href=\"http://www.pc-xp.net\">← Zpět na pc-xp.net</a> | </big> ";
   echo "<a href=\"http://pc-xp.net/guestbook/adm_guestbook.php\">Administrace →</a> ";
?>
</body>
</html>

WEB: Poradna
BuGeR
Profil
Co třeba použit captchu?
JayykI
Profil
Ano, to bych věděl - ale nevím jak ji tam nasadit.
BuGeR
Profil
Předpokládam, že to tady za tebe nikdo dělat nebude.
Tudiž Práce a zakázky
JayykI
Profil
No já věřím, že mi alespoň někdo snad napoví. Potřeboval bych alespoň nějakou nápovědu...
Mimi
Profil
[#3] JayykI
Zkus se podívat sem: http://blok.net-vor.cz/php-captcha-s-diakritikou/
JayykI
Profil
Mnohokrát díky ;) snad už si poradím...
Marek88
Profil
BuGeR:
Co třeba použit captchu?
A co třeba ne...
http://suplik.petnik.cz/funkcni-javascriptova-bariera-na-komentarovy-spam-qxxq628.html
Pokud nikdo nepovede cílený útok, tak to opravdu funguje. A i tak velké a známé stránky, jako je tato diskuse si s tím vystačí. Vidíte tu snad někde captchu? Vidíte tu snad někde spam?

PS: Jen se tam nesmí napsat "Kolik je 1+1?" a podobně - ten výraz s plusem zřejmě už umí roboti přečíst (někde jsem to četl/slyšel, ale nevím už kde, takže za to ruku do ohně nedám).
Giga
Profil *
Na stránke :http://www.dreamface.net/michal/?face=zajimavost&c=31 sa rozoberá elegantné riešenie, ktoré skúma (okrem iného) dobu,
ktorú potrebuje uživateľ na vyplnenie príspevku. Ak je tá doba neprimerane krátka (menej ako 10 sekúnd),
tak sa s veľkou pravdepodobnosťou jedná o spam.

Je to jednoduché a dá sa to urobiť aj len s využitím PHP.
Nox
Profil
Mno jo, nic není dokonalé -- u toho zase bacha -> dnes existují různé druhy automatického doplňování, takže i normálně může člověk odeslat formulář pod 1 sekundu
JayykI
Profil
Tak jsem zkusil to násobení, ale funguje mi to napůl, je mu jedno co tam zadám za znak a prostě to odešle, nejspíš asi chybav podmínce - nevěděl by někdo?
   echo "<table bgcolor=#EEEEEE border=1 cellspacing=0 cellpadding=5 style=\"border-collapse:collapse\" bordercolor=#999999>\n";
   echo "<FORM name=pesan METHOD=\"post\" ACTION=\"".$_SERVER[PHP_SELF]."\">\n";
   echo "<tr><td>Jméno* :<td><input name=\"fname\"></tr>\n";
   echo "<tr><td>E-mail* :<td><input name=\"femail\" width=10> \n";
   echo "<input type=\"checkbox\" name=\"femail_show\" value=\"y\" checked><small>ukázat e-mail</tr>\n";
   echo "<tr><td>Operační systém :<td><input name=\"fhomepage\" size=30></tr>\n";
   echo "<tr><td>Dotaz* :<td><textarea max=\"$machar\" name=\"fcomment\" rows=5 cols=40 ";
   echo " onKeyup='jumlahKata(document.pesan);' RAP";
   echo "></textarea><small><br>Max. $maxchar znaků. ";
   echo "Zbývající počet znaků : <input type=\"text\" size=3 name=sisa maxlength=3 value=\"$maxchar\">";
   echo "</tr>\n";
   echo "<input type=hidden name=act value=post>";
   echo "<p id='spamprotirobotum'>";
   echo "Ochrana proti spamu. Kolik je dvakrát tři?";
   echo "<input type='text' name='robot' value='' id='protirobotum'></p>";
        if ($_POST["robot"]*1==6);
   echo "<p><input type='submit' value='Odeslat'></p>";
   echo "</FORM>";
   echo "</table>\n";
Ugo
Profil
nevím oč jde ale

1.if ($_POST["robot"]*1==6); je zbytečná, aby měla smysl tak odeber středník. (jednořádkové IFy vůbec piš radejí na 1 řádek když už, lepší je ale vždycky tam dát závorky
2. ten html kód kompletně v echo je hroznej, přiřazuješ tam jenom pár proměných, nebylo by lepší to napsat normálně a občas dát <?= $var ?> (<?php echo $var ?>)? takovéto kousky jsou vodou na mlejn zaslepeným smartistům :)
Marek88
Profil
JayykI:
Když na to tak koukám, tak asi bude lepší, když si stáhneš jiný kód - takový, který antispamovou ochranu má. Popřípadě pořád platí příspěvek [#4].

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:

0