phpRS 2.6.5 : phpRS Fórum
Toto fórum je určené výhradně k diskuzi o verzi phpRS v2.6.5.
phpRS - redakční a informační systém
Spam v kometářích - verze 2.6.5 - řešení pomocí kontr. otázky
Zaslán uživatelem/kou: Jarek (IP adresa zaznamenána)
Datum: 2007-03-15, 22:18

Minulý víkend byla nadúroda spamu. Vyjma ochrany proti spamu v komentářích podle community web (nyní však byla prolomena), jsem byl do minulého týdne docela v klidu. Jelikož jsem lenoch a dosud jedu ve verzi 2.6.5., měl jsem velké problémy, až jsem byl nucen vymazat soubor comment.php. Lenochem jsem zůstal a tak malý návod, jak implementovat kontrolní otázku do komentářů i v této verzi.
Takže poskytuji svůj soubor comment se starou (community web) a novou úpravou (otázka 2.8.1) - dole bod 3).
Celý postup:

1) zaprve je třeba upravit databázi
# *** vlozeni default dat do tabulky rs_config
insert into rs_config values
(null,'captcha_komentare','1');

2) založit tabulku a nakrmit ji

create table rs_captcha_test_otazky
(
idc int unsigned not null auto_increment,
identifikator varchar(10) not null,
otazka varchar(100) not null,
odpoved varchar(30) not null,
zobrazit tinyint unsigned not null,
primary key(idc),
index idx_identifikator (identifikator)
);

# *** Vlozeni default dat do tabulky rs_captcha_test_otazky

insert into rs_captcha_test_otazky values
(null,'jkolds','Vypočítejte následující příklad: 1 + 8 =','9',1);
insert into rs_captcha_test_otazky values
(null,'ksslek','Jakou barvu má tráva? Zelenou nebo modrou?','zelenou',1);
insert into rs_captcha_test_otazky values
(null,'saeewf','Vypočítejte následující příklad: 12 - 4 =','8',1);
insert into rs_captcha_test_otazky values
(null,'dewwvs','Dá se ve vodě plavat (ano/ne)?','ano',1);
insert into rs_captcha_test_otazky values
(null,'opelks','Má člověk čtyři oči (ano/ne)?','ne',1);
insert into rs_captcha_test_otazky values
(null,'alwtks','Žije ryba ve vodě (ano/ne)?','ano',1);
insert into rs_captcha_test_otazky values
(null,'qmnhci','Vypočítejte následující příklad: 6 + 6 =','12',1);
insert into rs_captcha_test_otazky values
(null,'dwrtto','Žijí lidé na Slunci (ano/ne)?','ne',1);
insert into rs_captcha_test_otazky values
(null,'lydaxz','Jakou barvu má modrá obloha? Žlutou nebo modrou?','modrou',1);



3) - comment.php
<?
######################################################################
# phpRS Comment 1.6.0
######################################################################

// Copyright (c) 2001-2005 by Jiri Lukas ([email]jirilukas@supersvet.cz[/email])
// [http://www.supersvet.cz/phprs/]
// This program is free software. - Toto je bezplatny a svobodny software.

// vyuzivane tabulky: rs_bloky, rs_user, rs_clanky, rs_komentare

/*
Pro fungovani funkce rozpoznavani registrovanych ctenaru musi byt aktivni trida CMyReader() nalezajici se v souboru myweb.php.
*/

define('IN_CODE',true); // inic. ochranne konstanty

include_once("config.php");
include_once("specfce.php");
include_once("myweb.php");
include_once("sl.php");
include_once("trlayout.php");
include_once($adrlayoutu);

include_once("admin/astdlib_comment.php"); // standardni knihovna komentarovych funkci

// --[pomocne fce]------------------------------------------------------------------------------------

// setrizeni komentaru
function SetridKomentare($vstupnipole)
{
/*
predpoklada se, ze vstupni pole je jiz chnologociky setrizeno
-> u komentaru lze tohoto stavu docilit i setrizenim podle id - lze totiz logicky predpokladat, ze nejnizsi id patri nejdrive vlozenemu komentari, atd.

$vstupnipole[X][0] - id
[1] - id predka
[2] - pouzito 1/0, defaulne 0 (ne)
*/

// inic. vstupniho pole
$trizeni=0; // false
if (is_array($vstupnipole)):
$pocetprvku=count($vstupnipole); // pocet prvku ve vstupnim poli
if ($pocetprvku>0):
$trizeni=1; // true
endif;
endif;

$polehist[0]=0; // historie prohledavani
$polex=0; // akt. pozice v historii

$vysledekcislo=0; // pocitadlo vyslednych radku ve vysledkovem poli

// start trizeni
while ($trizeni==1):
$nasel=0;
$aktpom=0;

for ($pom=0;$pom<$pocetprvku;$pom++):
if ($vstupnipole[$pom][2]==0): // kdyz nebyl akt. radek jeste pouzit
if ($vstupnipole[$pom][1]==$polehist[$polex]): // kdyz nalezi hledanemu predku
$aktpom=$pom;
$nasel=1;
break; // vyskoceni z for cyklu
endif;
endif;
endfor;

if ($nasel==1):
// vysledek hledani je kladny
$vysledek[$vysledekcislo][0]=$aktpom; // pridani do pole vysledku
$vysledek[$vysledekcislo][1]=$polex; // od 0 vyse
$vysledekcislo++; // prechod na dalsi radek ve vysledkovem poli
$vstupnipole[$aktpom][2]=1; // nastaveni prepinace na pouzito
$polex++; // prechod na vyssi uroven v historii
$polehist[$polex]=$vstupnipole[$aktpom][0]; // nastaveni akt. hodnoty v historii
else:
// vysledek hledani je zaporny
if ($polehist[$polex]==0):
// vysledek hledani na zakladni urovni je prazdny -> neexistuje zadna dalsi vetev
$trizeni=0;
else:
$polex--; // prechod na nizsi uroven v historii
endif;
endif;
endwhile;

/*
$vysledek[X][0] - X ve vstupnim poly
[1] - cislo urovne
*/
return $vysledek;
}

function NactiKontrolniRetezec()
{
$vysl['captcha_id']='';
$vysl['captcha_otazka']='';

// dotaz na vypis vsech dostupnych kontrolnich otazek
// tento zpusob ziskani kontrolni otazky nepocitani s prilis velkym mnoztvim otazek v databazi; v pripade vetsiho mnozstvi by se musel upravit dotazovaci mechanizmus
$dotaz="select * from ".$GLOBALS["rspredpona"]."captcha_test_otazky where zobrazit=1 order by idc";
$dotazpol=mysql_query($dotaz,$GLOBALS["dbspojeni"]);
$pocetpol=mysql_num_rows($dotazpol);

if ($pocetpol>0):
$akt_vybrana_otazka=rand(0,($pocetpol-1));
if (mysql_data_seek($dotazpol,$akt_vybrana_otazka)):
// nacteni kontrolni otazky
$pole_data=mysql_fetch_assoc($dotazpol);
// zaplneni vysledkoveho pole
$vysl['captcha_id']=$pole_data['identifikator'];
$vysl['captcha_otazka']=$pole_data['otazka'];
endif;
endif;

return $vysl;
}

function OverKontrolniRetezec($captcha_id = '', $captcha_odpoved = '')
{
// bezpecnostni korekce
$captcha_id=mysql_escape_string($captcha_id);
$captcha_odpoved=mysql_escape_string($captcha_odpoved);

// uprava odpovedi
$captcha_odpoved=strtolower(trim($captcha_odpoved));

// kontrolni dotaz
$dotaz="select idc from ".$GLOBALS["rspredpona"]."captcha_test_otazky where identifikator='".$captcha_id."' and odpoved='".$captcha_odpoved."' and zobrazit=1";
$dotazpol=mysql_query($dotaz,$GLOBALS["dbspojeni"]);
if ($dotazpol!=0&&mysql_num_rows($dotazpol)==1):
return 1; // OK; kontrolni retezec plati
else:
return 0; // chyba
endif;
}

// --[zakladni fce]-----------------------------------------------------------------------------------

// zobrazeni vyberoveho prehledu vsech komentaru nalezicich k vybranemu clanku
function ZobrazKom()
{
// bezpecnostni korekce
$GLOBALS["cisloclanku"]=mysql_escape_string($GLOBALS["cisloclanku"]);

$dotaz="select idk,datum,od,titulek,reakce_na,registrovany,reg_prezdivka from ".$GLOBALS["rspredpona"]."komentare where clanek='".$GLOBALS["cisloclanku"]."' order by idk desc";
$dotazkom=mysql_query($dotaz,$GLOBALS["dbspojeni"]);
$pocetkom=mysql_num_rows($dotazkom);

if ($pocetkom==0):
// chyba - neni prirazen zadny komentar
echo "<p align=\"center\" class=\"komz\">".RS_KO_NIC."</p>\n";
else:
// prevod do pole
for ($pom=0;$pom<$pocetkom;$pom++):
// nacteni dat z DB
$akt_pole_data=mysql_fetch_assoc($dotazkom);
// pole informaci
$data[$pom]['idk']=$akt_pole_data['idk']; // idk
$data[$pom]['titulek']=$akt_pole_data['titulek']; // titulek
$data[$pom]['od']=$akt_pole_data['od']; // autor
$data[$pom]['datum']=$akt_pole_data['datum']; // datum
$data[$pom]['registr']=$akt_pole_data['registrovany']; // registrovany ctenar
$data[$pom]['reg_jmeno']=$akt_pole_data['reg_prezdivka']; // prezdivka registr. ctenare
// pom. pole k setrideni
$pomporadi[$pom][0]=$akt_pole_data['idk']; // id komentare
$pomporadi[$pom][1]=$akt_pole_data['reakce_na']; // id predka komentare
$pomporadi[$pom][2]=0; // nastaveni stavu radku
endfor;
// setrideni
$poradi=SetridKomentare($pomporadi);
// zobraz
echo "<form action=\"comment.php\" method=\"post\">\n";
echo "<input type=\"hidden\" name=\"akce\" value=\"selectview\" /><input type=\"hidden\" name=\"cisloclanku\" value=\"".$GLOBALS["cisloclanku"]."\" />\n";
echo "<table border=\"0\" cellpadding=\"2\" align=\"center\">\n";
for($pom=0;$pom<$pocetkom;$pom++):
$akt_komentar=$poradi[$pom][0]; // $poradi[$pom][0] -> obsahuje hodnotu poradi v poli $data
// vypis radku
echo "<tr class=\"komz\"><td><input type=\"checkbox\" name=\"kclanek[]\" value=\"".$data[$akt_komentar]['idk']."\" /></td>";
echo "<td>";
// generator mezery
if ($poradi[$pom][1]>0):
echo str_repeat('&nbsp;&nbsp;&nbsp;',$poradi[$pom][1]);
endif;
echo $data[$akt_komentar]['titulek']."</td>";
// test na registraci ctenare
if ($data[$akt_komentar]['registr']==1):
echo "<td>[".$data[$akt_komentar]['reg_jmeno']."] - ".$data[$akt_komentar]['od']."</td>";
else:
echo "<td>".RS_KO_NEREG." - ".$data[$akt_komentar]['od']."</td>";
endif;
echo "<td align=\"right\">".MyDatetimeToStd($data[$akt_komentar]['datum'])."</td></tr>\n";
endfor;
echo "<tr><td align=\"center\" colspan=\"4\"><input type=\"submit\" value=\" ".RS_KO_ZOBRAZ_OZN." \" class=\"tl\" /></td></tr>\n";
echo "</table>\n";
echo "</form>\n";
endif;
// paticka
echo "<p align=\"center\" class=\"komlink\">
<a href=\"comment.php?akce=fullview&amp;cisloclanku=".$GLOBALS["cisloclanku"]."\">".RS_KO_ZOBRAZ_VSE."</a>
&nbsp;&nbsp;
<a href=\"comment.php?akce=new&amp;cisloclanku=".$GLOBALS["cisloclanku"]."\">".RS_KO_PRIDAT."</a>
</p>\n";
}

// zobrazeni vsech komentaru pridanych k vybranemu clanku
function ZobrazKoKom()
{
// bezpecnostni korekce
$GLOBALS["cisloclanku"]=mysql_escape_string($GLOBALS["cisloclanku"]);

$dotaz="select idk,datum,obsah,od,od_mail,titulek,reakce_na,registrovany,reg_prezdivka from ".$GLOBALS["rspredpona"]."komentare where clanek='".$GLOBALS["cisloclanku"]."' order by idk";
$dotazkom=mysql_query($dotaz,$GLOBALS["dbspojeni"]);
$pocetkom=mysql_num_rows($dotazkom);

if ($pocetkom==0):
// chyba - neni prirazen zadny komentar
echo "<p align=\"center\" class=\"komz\">".RS_KO_NIC."</p>\n";
else:
// pridavaci link
echo "<p align=\"center\" class=\"komlink\"><a href=\"comment.php?akce=new&amp;cisloclanku=".$GLOBALS["cisloclanku"]."\">".RS_KO_PRIDAT."</a></p>\n";
// prevod do pole
for ($pom=0;$pom<$pocetkom;$pom++):
// nacteni dat z DB
$akt_pole_data=mysql_fetch_assoc($dotazkom);
// pole informaci
$data[$pom][0]=$akt_pole_data['idk']; // idk
$data[$pom][1]=$akt_pole_data['titulek']; // titulek
$data[$pom][2]=$akt_pole_data['od']; // autor
$data[$pom][3]=$akt_pole_data['datum']; // datum
$data[$pom][4]=$akt_pole_data['obsah']; // obsah komentare
$data[$pom][5]=$akt_pole_data['od_mail']; // mail autora
$data[$pom][6]=$akt_pole_data['registrovany']; // registrovany ctenar
$data[$pom][7]=$akt_pole_data['reg_prezdivka']; // prezdivka registr. ctenare
// pom. pole k setrideni
$pomporadi[$pom][0]=$akt_pole_data['idk']; // id komentare
$pomporadi[$pom][1]=$akt_pole_data['reakce_na']; // id predka komentare
$pomporadi[$pom][2]=0; // nastaveni stavu radku
endfor;
// setrideni
$poradi=SetridKomentare($pomporadi);
// zjisteni maximalniho levelu
$maxim_level=0;
for($pom=0;$pom<$pocetkom;$pom++):
if ($maxim_level<$poradi[$pom][1]):
$maxim_level=$poradi[$pom][1];
endif;
endfor;
// preddefinovani zakladniho levelu
if ($maxim_level>0):
$vzhled_zakl_level=" colspan=\"".($maxim_level+1)."\"";
else:
$vzhled_zakl_level="";
endif;
// zobrazeni komentaru
echo "<table border=\"0\" cellpadding=\"2\" cellspacing=\"0\">\n";
for($pom=0;$pom<$pocetkom;$pom++):
$akt_komentar=$poradi[$pom][0]; // $poradi[$pom][0] -> obsahuje hodnotu poradi v poli $data
// vypis radku
echo "<tr class=\"komz\">\n";
if ($poradi[$pom][1]==0):
// zakladni level
echo "<td align=\"left\"".$vzhled_zakl_level.">\n";
else:
// sublevel
if ($poradi[$pom][1]>0):
echo str_repeat('<td align="left">&nbsp;&nbsp;</td>',$poradi[$pom][1])."\n";
endif;
echo "<td align=\"left\" colspan=\"".($maxim_level+1-$poradi[$pom][1])."\">\n";
endif;
// hlavicka
echo "<div class=\"komhlav\">";
echo "<b>".RS_KO_ZPR_ZE_DNE.":</b> ".MyDatetimeToStd($data[$akt_komentar][3])." &nbsp;&nbsp;&nbsp;&nbsp;";
echo "<a href=\"comment.php?akce=re&amp;cisloclanku=".$GLOBALS["cisloclanku"]."&amp;ck=".$data[$akt_komentar][0]."\">".RS_KO_ZPR_REG."</a><br />\n";
echo "<b>".RS_KO_ZPR_AUT.":</b> ";
if ($data[$akt_komentar][6]==1): // test na registraci ctenare
echo "[".$data[$akt_komentar][7]."] - ".$data[$akt_komentar][2];
else:
echo RS_KO_NEREG." - ".$data[$akt_komentar][2];
endif;
if ($data[$akt_komentar][5]!=''): // test na existenci e-mailu
echo " (".$data[$akt_komentar][5].")";
endif;
echo "<br />\n";
echo "<b>".RS_KO_ZPR_TIT.":</b> ".VycistiKoment($data[$akt_komentar][1]);
echo "</div>\n";
// telo
echo "<div class=\"komtext\">";
echo VycistiKoment($data[$akt_komentar][4]);
echo "</div><br />\n";
echo "</td>\n";
echo "</tr>\n";
endfor;
echo "</table>\n";
endif;
// paticka
echo "<p align=\"center\" class=\"komlink\"><a href=\"comment.php?akce=new&amp;cisloclanku=".$GLOBALS["cisloclanku"]."\">".RS_KO_PRIDAT."</a></p>\n";
}

// zobrazeni jen pozadovanych komentaru
function ZobrazVyKom()
{
// bezpecnostni korekce
$GLOBALS["cisloclanku"]=mysql_escape_string($GLOBALS["cisloclanku"]);

// zjisteni poctu vybranych komentaru + sestaveni omezujiciho pole
if (isset($GLOBALS["kclanek"])):
$pocetvybr=count($GLOBALS["kclanek"]);
// sestaveni omezujiciho pole
for ($pom=0;$pom<$pocetvybr;$pom++):
$pole_pov_id_kom[addslashes($GLOBALS["kclanek"][$pom])]=1;
endfor;
else:
$pocetvybr=0;
echo "<p align=\"center\">".RS_KO_PRAZDNY_VYB."</p>\n";
endif;

$dotaz="select idk,datum,obsah,od,od_mail,titulek,reakce_na,registrovany,reg_prezdivka from ".$GLOBALS["rspredpona"]."komentare where clanek='".$GLOBALS["cisloclanku"]."' order by idk";
$dotazkom=mysql_query($dotaz,$GLOBALS["dbspojeni"]);
$pocetkom=mysql_num_rows($dotazkom);

if ($pocetkom>0&&$pocetvybr>0):
// pridavaci link
echo "<p align=\"center\" class=\"komlink\"><a href=\"comment.php?akce=new&amp;cisloclanku=".$GLOBALS["cisloclanku"]."\">".RS_KO_PRIDAT."</a></p>\n";
// prevod do pole
for ($pom=0;$pom<$pocetkom;$pom++):
// nacteni dat z DB
$akt_pole_data=mysql_fetch_assoc($dotazkom);
// pole informaci
$data[$pom][0]=$akt_pole_data['idk']; // idk
$data[$pom][1]=$akt_pole_data['titulek']; // titulek
$data[$pom][2]=$akt_pole_data['od']; // autor
$data[$pom][3]=$akt_pole_data['datum']; // datum
$data[$pom][4]=$akt_pole_data['obsah']; // obsah komentare
$data[$pom][5]=$akt_pole_data['od_mail']; // mail autora
if (isset($pole_pov_id_kom[$akt_pole_data['idk']])):
$data[$pom][6]=1; // zobrazit komentar - ANO
else:
$data[$pom][6]=0; // zobrazit komentar - NE
endif;
$data[$pom][7]=$akt_pole_data['registrovany']; // registrovany ctenar
$data[$pom][8]=$akt_pole_data['reg_prezdivka']; // prezdivka registr. ctenare
// pom. pole k setrideni
$pomporadi[$pom][0]=$akt_pole_data['idk']; // id komentare
$pomporadi[$pom][1]=$akt_pole_data['reakce_na']; // id predka komentare
$pomporadi[$pom][2]=0; // nastaveni stavu radku
endfor;
// setrideni
$poradi=SetridKomentare($pomporadi);
// zjisteni maximalniho levelu
$maxim_level=0;
for($pom=0;$pom<$pocetkom;$pom++):
if ($maxim_level<$poradi[$pom][1]):
$maxim_level=$poradi[$pom][1];
endif;
endfor;
// preddefinovani zakladniho levelu
if ($maxim_level>0):
$vzhled_zakl_level=" colspan=\"".($maxim_level+1)."\"";
else:
$vzhled_zakl_level="";
endif;
// zobrazeni komentaru
echo "<table border=\"0\" cellpadding=\"2\" cellspacing=\"0\">\n";
for($pom=0;$pom<$pocetkom;$pom++):
$akt_komentar=$poradi[$pom][0]; // $poradi[$pom][0] -> obsahuje hodnotu poradi v poli $data
// vypis radku
if ($data[$akt_komentar][6]==1): // test na povoleni zobrazeni komentare
echo "<tr class=\"komz\">\n";
if ($poradi[$pom][1]==0):
// zakladni level
echo "<td align=\"left\"".$vzhled_zakl_level.">\n";
else:
// sublevel
if ($poradi[$pom][1]>0):
echo str_repeat('<td align="left">&nbsp;&nbsp;</td>',$poradi[$pom][1])."\n";
endif;
echo "<td align=\"left\" colspan=\"".($maxim_level+1-$poradi[$pom][1])."\">\n";
endif;
// hlavicka
echo "<div class=\"komhlav\">";
echo "<b>".RS_KO_ZPR_ZE_DNE.":</b> ".MyDatetimeToStd($data[$akt_komentar][3])." &nbsp;&nbsp;&nbsp;&nbsp;";
echo "<a href=\"comment.php?akce=re&amp;cisloclanku=".$GLOBALS["cisloclanku"]."&amp;ck=".$data[$akt_komentar][0]."\">".RS_KO_ZPR_REG."</a><br />\n";
echo "<b>".RS_KO_ZPR_AUT.":</b> ";
if ($data[$akt_komentar][7]==1): // test na registraci ctenare
echo "[".$data[$akt_komentar][8]."] - ".$data[$akt_komentar][2];
else:
echo RS_KO_NEREG." - ".$data[$akt_komentar][2];
endif;
if ($data[$akt_komentar][5]!=''): // test na existenci e-mailu
echo " (".$data[$akt_komentar][5].")";
endif;
echo "<br />\n";
echo "<b>".RS_KO_ZPR_TIT.":</b> ".VycistiKoment($data[$akt_komentar][1]);
echo "</div>\n";
// telo
echo "<div class=\"komtext\">";
echo VycistiKoment($data[$akt_komentar][4]);
echo "</div><br />\n";
echo "</td>\n";
echo "</tr>\n";
endif;
endfor;
echo "</table>\n";
endif;
// paticka
echo "<p align=\"center\" class=\"komlink\">
<a href=\"comment.php?akce=fullview&amp;cisloclanku=".$GLOBALS["cisloclanku"]."\">".RS_KO_ZOBRAZ_VSE."</a>
&nbsp;&nbsp;
<a href=\"comment.php?akce=new&amp;cisloclanku=".$GLOBALS["cisloclanku"]."\">".RS_KO_PRIDAT."</a>
</p>\n";
}

function NovyFormKom()
{
// bezpecnostni korekce
$GLOBALS["cisloclanku"]=mysql_escape_string($GLOBALS["cisloclanku"]);

// test na existenci reg. ctenare
if ($GLOBALS["prmyctenar"]->ctenarstav==1||NactiConfigProm('captcha_komentare',0)==0):
$prctenar=$GLOBALS["prmyctenar"]->Ukaz("jmeno");
$prctenar_mail=$GLOBALS["prmyctenar"]->Ukaz("email");
$prctenar_test_robot=''; // bez testu
else:
$akt_pole_test_robot=NactiKontrolniRetezec();
$prctenar='';
$prctenar_mail='@';
$prctenar_test_robot='<p align="center" class="komz">'.RS_KO_ZPR_KONTROLA.'<br /><br />'.$akt_pole_test_robot['captcha_otazka'].' <input type="text" name="captchaodpoved" size="12" class="textpole" /><input type="hidden" name="captchaid" value="'.$akt_pole_test_robot['captcha_id'].'" /></p>';
endif;
// formular pro pridani noveho komentare
echo "<form action=\"comment.php\" method=\"post\">
<input type=\"hidden\" name=\"akce\" value=\"insert\" />
<input type=\"hidden\" name=\"cisloclanku\" value=\"".$GLOBALS["cisloclanku"]."\" />
<input type=\"hidden\" name=\"cislokom\" value=\"0\" />
<p><table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\">
<tr class=\"komz\"><td><b>".RS_KO_ZPR_JME.":</b>&nbsp;</td><td><input type=\"text\" size=\"40\" name=\"kod\" value=\"".$prctenar."\" class=\"textpole\" /></td></tr>
<tr class=\"komz\"><td><b>".RS_KO_ZPR_EMAIL.":</b>&nbsp;</td><td><input type=\"text\" size=\"40\" name=\"kodmail\" value=\"".$prctenar_mail."\" class=\"textpole\" /></td></tr>
<tr class=\"komz\"><td><b>".RS_KO_ZPR_TIT.":</b>&nbsp;</td><td><input type=\"text\" size=\"40\" name=\"ktitulek\" class=\"textpole\" /></td></tr>
</table></p>
<p align=\"center\"><textarea name=\"kobsah\" cols=\"60\" rows=\"16\" wrap=\"yes\" class=\"textbox\"></textarea></p>
".$prctenar_test_robot."
<p align=\"center\"><input type=\"hidden\" name=\"odeslano\" value=\"1\"><input type=\"submit\" name=\"pridej\" value=\" ".RS_ODESLAT." \" class=\"tl\" /> <input type=\"reset\" value=\" ".RS_RESET." \" class=\"tl\" /><input type=\"submit\" name=\"nepridavat\" value=\"1\" class=\"tl\" style=\"display:none;\"/></p>
<p align=\"center\" class=\"komz\">".RS_KO_INFO."</p>
</form>
<p align=\"center\" class=\"komlink\"><a href=\"comment.php?akce=view&amp;cisloclanku=".$GLOBALS["cisloclanku"]."\">".RS_KO_ZOBRAZ_KOM."</a></p>
<p></p>\n";
}

function NovyReFormKom()
{
// bezpecnostni korekce
$GLOBALS["cisloclanku"]=mysql_escape_string($GLOBALS["cisloclanku"]);
$GLOBALS["ck"]=mysql_escape_string($GLOBALS["ck"]);

// nacteni puvodniho komentare
$dotazkom=mysql_query("select datum,obsah,od,od_mail,titulek from ".$GLOBALS["rspredpona"]."komentare where idk='".$GLOBALS["ck"]."'",$GLOBALS["dbspojeni"]);
list($prdatum,$probsah,$prod,$prodmail,$prtitulek)=mysql_fetch_row($dotazkom);

// zobrazeni puvodni komentare
echo "<p><table border=\"0\" cellpadding=\"2\" cellspacing=\"0\" width=\"100%\"><tr><td>\n";
echo "<div class=\"komhlav\">";
echo "<b>".RS_KO_ZPR_ZE_DNE.":</b> ".MyDatetimeToStd($prdatum)."<br />\n";
echo "<b>".RS_KO_ZPR_AUT.":</b> ".$prod;
if ($prodmail!=''):
echo " (".$prodmail.")";
endif;
echo "<br />\n";
echo "<b>".RS_KO_ZPR_TIT.":</b> ".$prtitulek;
echo "</div>\n";
echo "<div class=\"komtext\">\n";
echo $probsah;
echo "</div>\n";
echo "</td></tr></table></p>\n";

// test na existenci reg. ctenare
if ($GLOBALS["prmyctenar"]->ctenarstav==1||NactiConfigProm('captcha_komentare',0)==0):
$prctenar=$GLOBALS["prmyctenar"]->Ukaz("jmeno");
$prctenar_mail=$GLOBALS["prmyctenar"]->Ukaz("email");
$prctenar_test_robot=''; // bez testu
else:
$akt_pole_test_robot=NactiKontrolniRetezec();
$prctenar='';
$prctenar_mail='@';
$prctenar_test_robot='<p align="center" class="kom-z">'.RS_KO_ZPR_KONTROLA.'<br /><br />'.$akt_pole_test_robot['captcha_otazka'].' <input type="text" name="captchaodpoved" size="12" class="textpole" /><input type="hidden" name="captchaid" value="'.$akt_pole_test_robot['captcha_id'].'" /></p>';
endif;

// formular na vlozeni odpovedi na predesly komentar
echo "<p align=\"center\" class=\"komz\"><big><b>".RS_KO_RE_NA_KOM."<br />\"".$prtitulek."\"</b></big></p>
<form action=\"comment.php\" method=\"post\">
<input type=\"hidden\" name=\"akce\" value=\"insert\" />
<input type=\"hidden\" name=\"cisloclanku\" value=\"".$GLOBALS["cisloclanku"]."\" />
<input type=\"hidden\" name=\"cislokom\" value=\"".$GLOBALS["ck"]."\" />
<p align=\"center\"><table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\">
<tr class=\"komz\"><td><b>".RS_KO_ZPR_JME.":</b>&nbsp;</td><td><input type=\"text\" size=\"40\" name=\"kod\" value=\"".$prctenar."\" class=\"textpole\" /></td></tr>
<tr class=\"komz\"><td><b>".RS_KO_ZPR_EMAIL.":</b>&nbsp;</td><td><input type=\"text\" size=\"40\" name=\"kodmail\" value=\"".$prctenar_mail."\" class=\"textpole\" /></td></tr>
<tr class=\"komz\"><td><b>".RS_KO_ZPR_TIT.":</b>&nbsp;</td><td><input type=\"text\" size=\"40\" name=\"ktitulek\" value=\"Re: ".$prtitulek."\" class=\"textpole\" /></td></tr>
</table></p>
<p align=\"center\"><textarea name=\"kobsah\" cols=\"60\" rows=\"16\" wrap=\"yes\" class=\"textbox\"></textarea></p>
".$prctenar_test_robot."
<p align=\"center\"><input type=\"hidden\" name=\"odeslano\" value=\"1\"><input type=\"submit\" name=\"pridej\" value=\" ".RS_ODESLAT." \" class=\"tl\" /> <input type=\"reset\" value=\" ".RS_RESET." \" class=\"tl\" /><input type=\"submit\" name=\"nepridavat\" value=\"1\" class=\"tl\" style=\"display:none;\"/></p>
<p align=\"center\" class=\"komz\">".RS_KO_INFO."</p>
</form>
<p align=\"center\" class=\"komlink\"><a href=\"comment.php?akce=view&amp;cisloclanku=".$GLOBALS["cisloclanku"]."\">".RS_KO_ZOBRAZ_KOM."</a></p>
<p></p>\n";
}

function NovyPridejKom()
{
// uprava vstupu
$GLOBALS["cisloclanku"]=KorekceVstupu($GLOBALS["cisloclanku"]);
$GLOBALS["cislokom"]=KorekceVstupu($GLOBALS["cislokom"]);
$GLOBALS["kobsah"]=KorekceVstupu($GLOBALS["kobsah"]);
$GLOBALS["kobsah"]=PrelozKomZnacky($GLOBALS["kobsah"]); // prelozeni kom. znacek
$GLOBALS["kobsah"]=KorekceVelikosti($GLOBALS["kobsah"]); // omezeni velikosti
$GLOBALS["kobsah"]=nl2br($GLOBALS["kobsah"]);
$GLOBALS["ktitulek"]=KorekceVstupu($GLOBALS["ktitulek"]);
$GLOBALS["ktitulek"]=KorekceVelikosti($GLOBALS["ktitulek"]); // omezeni velikosti
$GLOBALS["kod"]=KorekceVstupu($GLOBALS["kod"]);
$GLOBALS["kodmail"]=KorekceVstupu($GLOBALS["kodmail"]);
// bezpecnostni korekce
$GLOBALS["cisloclanku"]=mysql_escape_string($GLOBALS["cisloclanku"]);
$GLOBALS["cislokom"]=mysql_escape_string($GLOBALS["cislokom"]);
$GLOBALS["kobsah"]=mysql_escape_string($GLOBALS["kobsah"]);
$GLOBALS["ktitulek"]=mysql_escape_string($GLOBALS["ktitulek"]);
$GLOBALS["kod"]=mysql_escape_string($GLOBALS["kod"]);
$GLOBALS["kodmail"]=mysql_escape_string($GLOBALS["kodmail"]);

$ip_adresa=$_SERVER["REMOTE_ADDR"]; // ip adresa ctenare
$aktdatum=Date("Y-m-d H:i:s");

if ($GLOBALS["kobsah"]==''):
// chyba - prazdny komentar
echo "<p align=\"center\">".RS_KO_ERR2."</p>\n";
else:
// test na existenci reg. ctenare
if ($GLOBALS['prmyctenar']->ctenarstav==1):
$nast_registrovany=1;
$nast_reg_prezdivka=$GLOBALS['prmyctenar']->Ukaz('username');
$nast_reg_id=$GLOBALS['prmyctenar']->Ukaz('id');
// vyhodnoceni captcha testu - u reg. ctenare je automaticky "true"
$vysl_captcha_test=1;
else:
$nast_registrovany=0;
$nast_reg_prezdivka='';
$nast_reg_id=0;
// vyhodnoceni captcha testu - nutno provest test
if (isset($GLOBALS['captchaodpoved'])): $GLOBALS['captchaodpoved']=mysql_escape_string($GLOBALS['captchaodpoved']); else: $GLOBALS['captchaodpoved']=''; endif;
if (isset($GLOBALS['captchaid'])): $GLOBALS['captchaid']=mysql_escape_string($GLOBALS['captchaid']); else: $GLOBALS['captchaid']=''; endif;
// vyhodnoceni captcha testu - zalezi na nastaveni systemu
if (NactiConfigProm('captcha_komentare',0)==0):
$vysl_captcha_test=1; // captcha vypnuta
else:
$vysl_captcha_test=OverKontrolniRetezec($GLOBALS['captchaid'],$GLOBALS['captchaodpoved']); // captcha zapnuta - nutno provest vyhodnoceni
endif;
endif;
// test na vysledek kontrolni otazky (captcha kontrola)
if ($vysl_captcha_test==1):
// sestaveni dotazu
$dotaz="insert into ".$GLOBALS["rspredpona"]."komentare values ";
$dotaz.="(null,'".$aktdatum."','".$GLOBALS["kobsah"]."','".$GLOBALS["cisloclanku"]."','".$GLOBALS["kod"]."','".$GLOBALS["kodmail"]."','".$ip_adresa."',";
$dotaz.="'".$GLOBALS["ktitulek"]."','".$GLOBALS["cislokom"]."','".$nast_registrovany."','".$nast_reg_prezdivka."','".$nast_reg_id."')";
// pridani komentare
if(!isset($GLOBALS["nepridavat"]) and isset($GLOBALS["odeslano"])):
@$error=mysql_query($dotaz,$GLOBALS["dbspojeni"]);
else:
$error=0;
$robot=1;
endif;
if (!$error):
// chyba - neuspesny sql prikaz
echo "<p align=\"center\">".RS_KO_ERR1."</p>\n";
if(isset($robot)):
echo "<p align=\"center\">Byli jste označeni jako robot!</p>\n";
/* ---- smazat tento radek v pripade zajmu o zasilani
include_once("admin/astdlib_mail.php");
$odeslani_posty = new CPosta();
$odeslani_posty->Nastav("adresat",$GLOBALS['redakceadr']);
$odeslani_posty->Nastav("predmet","Novy blokovany komentar");
$odeslani_posty->Nastav("obsah",$GLOBALS["kod"]."\n\r\n\r".$GLOBALS["kobsah"]."\n\r\n\r".$GLOBALS["cisloclanku"]);
$odeslani_posty->Odesilac();
---- smazat tento radek v pripade zajmu o zasilani */
endif;
else:
// vse je OK; pripocitani 1 komentare k celkovemu poctu
@mysql_query("update ".$GLOBALS["rspredpona"]."clanky set kom=(kom+1) where link='".$GLOBALS["cisloclanku"]."'",$GLOBALS["dbspojeni"]);
echo "<p align=\"center\">".RS_KO_VLOZEN_OK."</p>\n";
endif;
else:
// chyba - neuspesny kontrolni test (captcha kontrola)
echo "<p align=\"center\">".RS_KO_ERR6."</p>\n";
endif;
endif;
// paticka
echo "<p align=\"center\" class=\"komlink\"><a href=\"comment.php?akce=view&amp;cisloclanku=".$GLOBALS["cisloclanku"]."\">".RS_KO_ZOBRAZ_KOM."</a></p>\n";
echo "<p></p>\n";
}

function Chyba($idchyba = 0)
{
switch ($idchyba):
case 0: echo "<p align=\"center\">".RS_KO_ERR5."</p>\n"; break; // defaultni chyba
case 1: echo "<p align=\"center\">".RS_KO_ERR3."</p>\n"; break; // chybi cislo (link) clanku
case 2: echo "<p align=\"center\">".RS_KO_ERR4."</p>\n"; break; // chybi clanek (vstupni link neukazuje na zadny clanek)
endswitch;
}

// overeni existence potrebnych promennych
if (!isset($GLOBALS["cisloclanku"])): $GLOBALS["akce"]="chyba1"; endif;
if (!isset($GLOBALS["akce"])): $GLOBALS["akce"]="view"; endif;

// bezpecnostni korekce
$GLOBALS["cisloclanku"]=mysql_escape_string($GLOBALS["cisloclanku"]);

// kontrola existence clanku
$dotazclanek=mysql_query("select titulek,datum,autor from ".$GLOBALS["rspredpona"]."clanky where link='".$GLOBALS["cisloclanku"]."'",$GLOBALS["dbspojeni"]);
if (mysql_num_rows($dotazclanek)==0):
// clanek neexistuje
$GLOBALS["akce"]="chyba2";
else:
// ziskani dat o clanku
list($clatitulek,$cladatum,$claautor)=mysql_fetch_row($dotazclanek);
$cladatum=MyDatetimeToDate($cladatum); // vysledek dd.mm.rrrr
// ziskani informaci o autorovi clanku
$dotazautori=mysql_query("select idu,jmeno,email from ".$GLOBALS["rspredpona"]."user where idu=".$claautor,$GLOBALS["dbspojeni"]);
if (mysql_num_rows($dotazautori)==1):
$claautor_jm=mysql_Result($dotazautori,0,"jmeno");
$claautor_mail='mailto:'.mysql_Result($dotazautori,0,"email");
else:
$claautor_jm='';
$claautor_mail='';
endif;
endif;

// Tvorba stranky
$vzhledwebu->Generuj();
ObrTabulka(); // Vlozeni layout prvku

if ($akce!="chyba1"||$akce!="chyba2"): // zobraz jen, kdyz je vse OK
echo "<p align=\"center\" class=\"z\">\n";
echo "<span class=\"nadpis\">".RS_KO_NADPIS."</span><br />".RS_KO_KE_CLA.": ".$clatitulek."<br />"; // Komentar - ke clanku - X
echo "(".RS_KO_ZE_DNE." ".$cladatum.", ".RS_KO_AUTOR_CLA.": <a href=\"".$claautor_mail."\">".$claautor_jm."</a>)"; // ze dne - X - autor clanku - X
echo "<p>\n";
endif;

// rozhodnuti o obsahu stranky
switch($akce):
case "view": ZobrazKom(); break;
case "fullview": ZobrazKoKom(); break;
case "selectview": ZobrazVyKom(); break;
case "new": NovyFormKom(); break;
case "re": NovyReFormKom(); break;
case "insert": NovyPridejKom(); break;
case "chyba1": Chyba(1); break;
case "chyba2": Chyba(2); break;
endswitch;

if ($GLOBALS["akce"]!="chyba1"||$GLOBALS["akce"]!="chyba2"): // zobraz jen, kdyz je vse OK
echo "<p align=\"center\" class=\"komlink\"><a href=\"view.php?cisloclanku=".$GLOBALS["cisloclanku"]."\">".RS_KO_ZOBRAZ_CLA." ".$clatitulek."</a></p>\n";
endif;

// Dokonceni tvorby stranky
KonecObrTabulka(); // Vlozeni layout prvku
$vzhledwebu->Generuj();
?>


4) do slovníku přidat // komentare (comment.php)
define('RS_KO_ZPR_KONTROLA','Odpovězte, prosím, na následující kontrolní otázku, která nám pomůže rozlišit, zda jste člověk nebo počítačový robot. Bez správné odpovědi na tuto otázku nebude váš komentář uložen. Tato kontrolní otázka se nezobrazuje registrovaným čtenářům.'); // N

define('RS_KO_ERR6','Vaše odpověď na kontrolní otázku je chybná! Zopakujte akci.'); // N



Celkem upraveno 1×. Poslední úprava Jarek v 16.03.2007 11:09.

Re: Spam v kometářích - verze 2.6.5
Zaslán uživatelem/kou: frankieRS (IP adresa zaznamenána)
Datum: 2007-03-16, 10:38

Vzpadá to dobře, nevím jestli zvládnu bod 1 a 2. Nemohl by jsi to popsat podrobněji, používám phpMyAdmin 2.6.2-Debian-3sarge1 u Banánu

Re: Spam v kometářích - verze 2.6.5
Zaslán uživatelem/kou: Jarek (IP adresa zaznamenána)
Datum: 2007-03-16, 11:02

Zvádneš, když se to podařilo mě:-)
Budu to vysvětlovat dost blbě, protože tomu tak nerozumím- v phpMyAdmin si normálně otevřeš SQL okno a hezky jedno podruhém to přes "SQL - pustit SQL dotaz(y) na databázi" nahraješ. To je vše - ono si to ty správné chlívečky najde.

Re: Spam v kometářích - verze 2.6.5 - řešení pomocí kontr. otázky
Zaslán uživatelem/kou: šimi (IP adresa zaznamenána)
Datum: 2007-03-29, 11:22

Nevím asi su úplně blbej, ale nepodařilo se mi to zprovoznit. hlásí mi to:
Parse error: parse error, expecting `','' or `';'' in /3w/wz.cz/s/sdhkurim/comment.php on line 203
nikde jsem ale chybu nenašel tak nevím

Re: Spam v kometářích - verze 2.6.5 - řešení pomocí kontr. otázky
Zaslán uživatelem/kou: JanVar (IP adresa zaznamenána)
Datum: 2007-03-29, 11:53

chybí (přebývá) ti někde čárka nebo tečko-čárka... :-)

-- JaV ---- [http://www.hades.cz] ---- security by obscurity ---------------------------------------------
motto:
It's OK to be ignorant; it's not OK to play stupid.
But it's simply not efficient for us to try to help people who are not willing to help themselves.
----------------------------------------------------------------------------------------------------------------------

Re: Spam v kometářích - verze 2.6.5 - řešení pomocí kontr. otázky
Zaslán uživatelem/kou: zool (IP adresa zaznamenána)
Datum: 2007-03-31, 10:02

Lidičky, provedl jsem tuto modifikaci, ale zobrazuje se mi pouze čistá stránka. Pomozte mi, prosím.

--------------------------

Re: Spam v kometářích - verze 2.6.5 - řešení pomocí kontr. otázky
Zaslán uživatelem/kou: Jarek (IP adresa zaznamenána)
Datum: 2007-04-02, 10:35

Můžeš se rozepsat víc? Jak provedl?

Re: Spam v kometářích - verze 2.6.5 - řešení pomocí kontr. otázky
Zaslán uživatelem/kou: zool (IP adresa zaznamenána)
Datum: 2007-06-08, 21:11

Udělal jsem vše jak je zde napsáno, ale když chci přidat komentář ke článku, zobrazí se mi čistá stránka :((((((((

--------------------------

Re: Spam v kometářích - verze 2.6.5 - řešení pomocí kontr. otázky
Zaslán uživatelem/kou: zool (IP adresa zaznamenána)
Datum: 2007-06-09, 21:55

Tak jsem to nakonec rozchodil, v kódu máš spoustu "chyb", např.

< ;/a>

< input...

...atd., ale nyní mi kontrola captcha u přidání komentáře neustále hlásí, že odpovídám špatně, i když samozřejmě vkládám správnou odpověď....

--------------------------

Re: Spam v kometářích - verze 2.6.5 - řešení pomocí kontr. otázky
Zaslán uživatelem/kou: Jarek (IP adresa zaznamenána)
Datum: 2007-06-12, 22:36

Ahoj, pro zoola a ostatní, kteří by měli problémy s okopírováním comment.php, mám příslušný soubor na serveru
www.afrikaonline.cz



Celkem upraveno 1×. Poslední úprava Jarek v 12.06.2007 22:36.

Re: Spam v kometářích - verze 2.6.5 - řešení pomocí kontr. otázky
Zaslán uživatelem/kou: casey (IP adresa zaznamenána)
Datum: 2007-06-20, 19:30

funguje to, ale ještě bych potřeboval někde naplnit proměnné:
- RS_KO_ZPR_KONTROLA
- RS_KO_ERR6

kde a co mám dopsat?

Díky

Jindra, [http://dino.saur.cz]

Re: Spam v kometářích - verze 2.6.5 - řešení pomocí kontr. otázky
Zaslán uživatelem/kou: mr3ska (IP adresa zaznamenána)
Datum: 2007-06-20, 20:42

stačí jen číst - v tom návodu nahoře je to napsaný viz. bod 4

4) do slovníku přidat // komentare (comment.php)
define('RS_KO_ZPR_KONTROLA','Odpovězte, prosím, na následující kontrolní otázku, která nám pomůže rozlišit, zda jste člověk nebo počítačový robot. Bez správné odpovědi na tuto otázku nebude váš komentář uložen. Tato kontrolní otázka se nezobrazuje registrovaným čtenářům.');

define('RS_KO_ERR6','Vaše odpověď na kontrolní otázku je chybná! Zopakujte akci.');

slovníkem je myslím míněno hlavní slovníky systému - soubory sl_cz.php a sl_sk.php

Re: Spam v kometářích - verze 2.6.5 - řešení pomocí kontr. otázky
Zaslán uživatelem/kou: casey (IP adresa zaznamenána)
Datum: 2007-06-20, 21:31

sakra, ten jsem pod tím kódem přehlédl :-(( sorry...

Jindra, [http://dino.saur.cz]

Re: Spam v kometářích - verze 2.6.5 - řešení pomocí kontr. otázky
Zaslán uživatelem/kou: mr3ska (IP adresa zaznamenána)
Datum: 2007-06-20, 22:15

v poho....

Re: Spam v kometářích - verze 2.6.5 - řešení pomocí kontr. otázky
Zaslán uživatelem/kou: šimi (IP adresa zaznamenána)
Datum: 2007-11-19, 16:30

Mám stejnej problém jako zool. I když zadám odpověď správně, tak mi to napíše, že nelze přidat komentář, jelikož je odpověď špatná. Zřejmě to bude někde v kódu špatně nadefinovaný, ale nenašel jsem to. Poraďte pls. Už mám těch robotů plný zuby. Díky

Re: Spam v kometářích - verze 2.6.5 - řešení pomocí kontr. otázky
Zaslán uživatelem/kou: Jarek (IP adresa zaznamenána)
Datum: 2007-11-20, 23:40

Ahoj, chtělo by to více se rozepsat - první věc co mě napadá - pokud fungují funkce - je kontrola tabulky rs_captcha_test_otazky

Re: Spam v kometářích - verze 2.6.5 - řešení pomocí kontr. otázky
Zaslán uživatelem/kou: šimi (IP adresa zaznamenána)
Datum: 2007-11-21, 09:09

no víc rozepsat. Stáhl jsem si od tebe ten soubor comment.php a zbytek udělal podle návodu. Nevím kde může být chyba



Lituji, ale pouze registrovaní uživatelé mohou zasílat příspěvky do této sekce.
This forum powered by Phorum and designed by STaNBoSS.