Autor | Zpráva | ||
---|---|---|---|
JayykI Profil |
#1 · Zasláno: 26. 12. 2011, 12:00:58 · Upravil/a: JayykI
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(">",">",$str); $str=str_replace("<","<",$str); } if ($mode==2){ $str=str_replace(">",">",$str); $str=str_replace("<","<",$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 "$data" 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 " <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 |
#2 · Zasláno: 26. 12. 2011, 12:32:38
Co třeba použit captchu?
|
||
JayykI Profil |
#3 · Zasláno: 26. 12. 2011, 13:38:18
Ano, to bych věděl - ale nevím jak ji tam nasadit.
|
||
BuGeR Profil |
#4 · Zasláno: 26. 12. 2011, 13:42:14
Předpokládam, že to tady za tebe nikdo dělat nebude.
Tudiž Práce a zakázky |
||
JayykI Profil |
#5 · Zasláno: 26. 12. 2011, 13:44:20
No já věřím, že mi alespoň někdo snad napoví. Potřeboval bych alespoň nějakou nápovědu...
|
||
Mimi Profil |
#6 · Zasláno: 26. 12. 2011, 13:48:04
|
||
JayykI Profil |
#7 · Zasláno: 26. 12. 2011, 13:49:27
Mnohokrát díky ;) snad už si poradím...
|
||
Marek88 Profil |
#8 · Zasláno: 26. 12. 2011, 21:52:19
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 * |
#9 · Zasláno: 26. 12. 2011, 22:03:02
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 |
#10 · Zasláno: 26. 12. 2011, 22:08:49
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 |
#11 · Zasláno: 27. 12. 2011, 10:56:01
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 |
#12 · Zasláno: 27. 12. 2011, 11:01:05
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 |
#13 · Zasláno: 27. 12. 2011, 11:32:30
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]. |
||
Časová prodleva: 12 let
|
0