Начало
Форум
Преводи
Помощ
Услуги
Мрежа
Ден
Въпроси
Приложения
Магазин
Хостинг
Реклама
Моля,
влезте
или
се регистрирайте
.
Изгубен
регистрационен е-мейл?
1 Час
за 1 Ден
1 Седмица
1 Месец
завинаги
134,794
Общо мнения в
16,950
Теми от
2,961
Потребители
Последен член:
dictio
Джумла! България
|
Компоненти, модули, шаблони
|
Компоненти
|
Модификации и хакове
|
Анти спам защита на контактната форма
« назад
напред »
Страници:
[
1
]
2
3
...
5
Автор
Тема: Анти спам защита на контактната форма (Прочетена 18155 пъти)
majo
DEUS EX MACHINA
Глобален модератор
Мега Гуру
Karma: +2185/-0
Offline
Публикации: 1,918
Thunder and sparks in the Heart of the Dark ...
Анти спам защита на контактната форма
«
:
Юни 14, 2006, 15:19:36 »
Предлагам ви следния хак. Имайте предвид, че го направих за мамбо - за джумла не би трябвало да има проблеми, тъй като се ползва съвсем независим клас, но все пак описанието и примерите са от мамбо.
Ето я в готов вариант:
http://pravoslavie.bg/index.php?option=com_contact&Itemid=3
Ползвам класа hn_captcha, който може да бъде свален от:
http://hn273.users.phpclasses.org/browse/package/1569.html
Накратко:
1.
Работната директория
е com_contact. В нея си правя поддир-я /captcha, a в тая - поддир-я /tmp, която трябва да е достъпна за писане от всички. Дървото изглежда горе долу така:
-> com_contact
-- contact.php
-- contact.html.php
-- contact.class.php
/captcha
-- hn_captcha.class.php (самия клас)
-- hn_captcha.class.x1.php (разширение към класа, което добавя garbage collector - изтривалка на стари картинки)
/tmp (chmod 777 !)
2. Промени в contact.php:
----------------1
Код:
<?php
//Приблизително около ред 43
switch(
$op
) {
case
'sendmail'
:
sendmail
(
$con_id
,
$option
,
$validcaptcha
);
//Добавям $validcaptchа променливата
break;
}
?>
----------------2
В function sendmail( $con_id, $option, $validcaptcha ) { също добавям горната променлива. При мене е около 328 ред. После цялата функция вътре я ограждам с if ... ето така:
Код:
<?php
function
sendmail
(
$con_id
,
$option
,
$validcaptcha
) {
if (
$validcaptcha
==
"1"
){
global
$database
,
$Itemid
;
global
$mosConfig_sitename
,
$mosConfig_live_site
,
$mosConfig_mailfrom
,
$mosConfig_fromname
;
$query
=
"SELECT * FROM #__contact_details WHERE id='$con_id'"
;
$database
->
setQuery
(
$query
);
$contact
=
$database
->
loadObjectList
();
$default
=
$mosConfig_sitename
.
' '
.
_ENQUIRY
;
$email
=
trim
(
mosGetParam
(
$_POST
,
'email'
,
''
) );
$text
=
trim
(
mosGetParam
(
$_POST
,
'text'
,
''
) );
$name
=
trim
(
mosGetParam
(
$_POST
,
'name'
,
''
) );
$subject
=
trim
(
mosGetParam
(
$_POST
,
'subject'
,
$default
) );
$email_copy
=
mosGetParam
(
$_POST
,
'email_copy'
,
0
);
if ( !
$email
|| !
$text
|| (
is_email
(
$email
)==
false
) ) {
echo
"<script>alert (\""
.
_CONTACT_FORM_NC
.
"\"); window.history.go(-1);</script>"
;
exit(
0
);
}
$prefix
=
sprintf
(
_ENQUIRY_TEXT
,
$mosConfig_live_site
);
$text
=
$prefix
.
"\n"
.
$name
.
' <'
.
$email
.
'>'
.
"\n\n"
.
stripslashes
(
$text
);
mosMail
(
$email
,
$name
,
$contact
[
0
]->
email_to
,
$mosConfig_fromname
.
': '
.
$subject
,
$text
);
if (
$email_copy
) {
$copy_text
=
sprintf
(
_COPY_TEXT
,
$contact
[
0
]->
name
,
$mosConfig_sitename
);
$copy_text
=
$copy_text
.
"\n\n"
.
$text
.
''
;
$copy_subject
=
_COPY_SUBJECT
.
$subject
;
mosMail
(
$mosConfig_mailfrom
,
$mosConfig_fromname
,
$email
,
$copy_subject
,
$copy_text
);
}
?>
<script>
alert( "
<?php
echo
_THANK_MESSAGE
;
?>
" );
document.location.href='
<?php
echo
sefRelToAbs
(
'index.php?option='
.
$option
.
'&Itemid='
.
$Itemid
);
?>
';
</script>
<?php
}
}
?>
3. Промени в hn_captcha.class.php:
Самото показване на формата става в function display_form(). Там може да се променят красотите. В началото на файла има доста променливи за настройка, но те си идват пресетнати добре, така че няма да им обръщам внимание.
4. Промени в hn_captcha.class.x1.php:
Никакви, освен малко промени по настройването на променливите в началото на файла.
5. Промени в contact.html.php:
Работим във function _writeEmailForm( &$contact, &$params, $sitename ). Около 675 ред. Непосредствено след началото на формата <form action="..."> слагаме следното:
Код:
<?php
//CAPTCHA HACK STARTS HERE
require_once(
"captcha/hn_captcha.class.x1.php"
);
// ConfigArray
$CAPTCHA_INIT
= array(
'tempfolder'
=>
'/put/do/tmp/'
,
// абсолютната пътека до /tmp (със завършваща наклонена черта!)
//'tempfolder' => $_SERVER['DOCUMENT_ROOT'].'/_tmp/', // може и така
'TTF_folder'
=>
'/put/do/fonts/'
,
//абсолютната пътека до директориятa с TrueType шрифтове (със завършваща наклонена черта!)
// имена на файлове с шрифтове от горната директория; може и един само да има - пак работи; ако са повече е по-шарено
'TTF_RANGE'
=> array(
'verdana.ttf'
,
'COMIC.TTF'
,
'JACOBITE.TTF'
,
'LYDIAN.TTF'
,
'MREARL.TTF'
,
'RUBBERSTAMP.TTF'
,
'ZINJARON.TTF'
),
//
'TTF_RANGE' => 'COMIC.TTF',
'chars'
=>
5
,
// integer: number of chars to use for ID
'minsize'
=>
20
,
// integer: minimal size of chars
'maxsize'
=>
30
,
// integer: maximal size of chars
'maxrotation'
=>
25
,
// integer: define the maximal angle for char-rotation, good results are between 0 and 30
'noise'
=>
TRUE
,
// boolean: TRUE = noisy chars | FALSE = grid
'websafecolors'
=>
FALSE
,
// boolean
'refreshlink'
=>
TRUE
,
// boolean
'lang'
=>
'en'
,
// string: ['en'|'de']
'maxtry'
=>
9
,
// integer: [1-9]
'badguys_url'
=>
'/'
,
// string: URL
'secretstring'
=>
'A very, very secret string which is used to generate a md5-key!'
,
'secretposition'
=>
24
,
// integer: [1-32]
'debug'
=>
FALSE
,
'counter_filename'
=>
''
,
// string: absolute filename for textfile which stores current counter-value. Needs read- & write-access!
'prefix'
=>
'hn_captcha_'
,
// string: prefix for the captcha-images, is needed to identify the files in shared tempfolders
'collect_garbage_after'
=>
60
,
// integer: the garbage-collector run once after this number of script-calls
'maxlifetime'
=>
20
// integer: only imagefiles which are older than this amount of seconds will be deleted
);
$captcha
=& new
hn_captcha_X1
(
$CAPTCHA_INIT
);
if(
$captcha
->
garbage_collector_error
)
{
// Error! (Counter-file or deleting lost images)
echo
"<p><h3>ГРЕШКА при зачистването на изображенията от стари тестове!</h3></p>"
;
}
switch(
$captcha
->
validate_submit
())
{
// was submitted and has valid keys
case
1
:
// PUT IN ALL YOUR STUFF HERE //
echo
"<div class=\"captcha_validfin\">
<br>
Благодарим Ви! Вече можете да ни изпратите Вашето съобщение.
</div>"
;
$validcaptcha
=
"1"
;
// Това е важно!
break;
// was submitted with no matching keys, but has not reached the maximum try's
case
2
:
echo
$captcha
->
display_form
();
$validcaptcha
=
"0"
;
// Това е важно!
break;
// was submitted, has bad keys and also reached the maximum try's
case
3
:
//if(!headers_sent() && isset($captcha->badguys_url)) header('location: '.$captcha->badguys_url);
//echo "<p><br>Reached the maximum try's of ".$captcha->maxtry." without success!";
//echo "<br><br><a href=\"".$_SERVER['PHP_SELF']."?download=yes&id=1234\">New DEMO</a></p>";
echo
"<br><br><a href=\"http://my.domain.com/validate.php\">Моля, кликнете първо тук!</a></p>"
;
$validcaptcha
=
"0"
;
break;
// was not submitted, first entry
default:
echo
$captcha
->
display_form
();
$validcaptcha
=
"0"
;
// Това е важно!
break;
}
//echo $validcaptcha;
//CAPTCHA HACK STOPS HERE
?>
Тук добавяме и още едно нещо. Непосредствено преди края на формата, там, където се вкарват hidden полета, добавяме едно:
<input type="hidden" name="validcaptcha" value="<?php echo $validcaptcha; ?>" />
Прикачам и самия клас, но така или иначе ви съветвам да се запишете в phpclasses.org - има и други подобни благини.
captcha-class.zip
(11.67 КВ - свалено 209 пъти.)
Активен
You're welcome to the metal age!
majo
DEUS EX MACHINA
Глобален модератор
Мега Гуру
Karma: +2185/-0
Offline
Публикации: 1,918
Thunder and sparks in the Heart of the Dark ...
Re: Анти спам защита на контактната форма
«
Отговор #1 :
Юни 14, 2006, 15:34:07 »
За тези, които не знаят:
CAPTCHA = completely automated public Turing test to tell computers and humans apart, Напълно автоматизиран публичен Тюринг тест за различаване на компютри (ботове) от хора.
Активен
You're welcome to the metal age!
muslim
Администратор
Мега Гуру
Karma: +2520/-0
Offline
Публикации: 2,031
www.webg.org
Re: Анти спам защита на контактната форма
«
Отговор #2 :
Ноември 17, 2006, 17:54:57 »
Целия код ли трябва да копирам включително <?php и ?> или без тях?
Активен
SEO
|
Видеозаснемане
|
Безплатни програми
muslim
Администратор
Мега Гуру
Karma: +2520/-0
Offline
Публикации: 2,031
www.webg.org
Re: Анти спам защита на контактната форма
«
Отговор #3 :
Ноември 17, 2006, 18:12:23 »
На мен нещо ми са непонятни промените в contact.html.php, къде е тва непосредствено след началото на формата <form action="...">, ако може малко по-подробно?!
Активен
SEO
|
Видеозаснемане
|
Безплатни програми
muslim
Администратор
Мега Гуру
Karma: +2520/-0
Offline
Публикации: 2,031
www.webg.org
Re: Анти спам защита на контактната форма
«
Отговор #4 :
Ноември 17, 2006, 18:55:15 »
Незнам но тоя хак или не работи за джумла или аз нещо бъркам, писна ми да го човъркам
Активен
SEO
|
Видеозаснемане
|
Безплатни програми
majo
DEUS EX MACHINA
Глобален модератор
Мега Гуру
Karma: +2185/-0
Offline
Публикации: 1,918
Thunder and sparks in the Heart of the Dark ...
Re: Анти спам защита на контактната форма
«
Отговор #5 :
Ноември 17, 2006, 23:05:41 »
Бате, много рано се отказваш!
Що се отнася, къде е тоз форм екшън, виж по-внимателно изречението: "Работим във function _writeEmailForm( &$contact, &$params, $sitename )..." Та къде ли е според теб тоз форм, м?
А пък за това дали да слагаш <? и ?> сам си прецени. Аз съм ги слагал тука, за да се оцвети кода. Ако на тебе не ти трябва да бягаш от хтмл и да влизаш в пхп (или обратното), няма защо да ги слагаш естествено.
Причините да не слагам стъпка по стъпка описание от типа find / replace / add, както например дават за модовете хакове в phpbb и въобще в хилядите подобни описания, е същата, която посочвам всеки път - кодът ми е изключително нашарен с мои си работи и find / replace / add няма да помогне на никой, просто защото при мене може да е сменено да кажем името на екшъна за тази форма преди и по съвсем други причини, нямащи нищо общо с обсъжданите в момента промени. Опитвам се да обяснявам принципи, а не да давам решения наготово. Освен това смятам, че решенията наготово измързеляват, което, разбира се, не е мой проблем, стига да не създавам аз среда и условия за това.
По отношение на последното "или-или". Ти бъркаш. Току-що проверих функциите в тия файлове в джумлата. Същите са си. Което ме навежда на мисълта, че и тук би трябвало да сработи, стига да схванеш принципа и да приложиш хака правилно. Отново не мога да ти дам точен ред, който да заместваш, по причините, които ти посочих по-горе и които соча всеки път, когато стане подобен въпрос. ИМАШ такъв ред function _writeEmailForm {. Точно над нея с едро коментирани букви пише:
/**
* Writes Email form
*/
Точно 14 реда по-долу имаш ред с "<form action="<?php echo sefRelToAbs(.." , който е ЕДИНСТВЕНАТА форма в тази функция.
Виж си класа CAPTCHA, правата на директориите и т.н. Направи стъпка по стъпка това, което съм описал отначало, ама се опитай да схванеш логиката и принципа.
Сори. Повече от това не мога да ти помогна, освен вместо теб да редактирам скриптовете, което няма да направя. Подобни хакове пиша, както вече ти казах, за да има документирани начини и принципи, а не готови решения. Затова не правя и инсталатори. Туй то.
Активен
You're welcome to the metal age!
muslim
Администратор
Мега Гуру
Karma: +2520/-0
Offline
Публикации: 2,031
www.webg.org
Re: Анти спам защита на контактната форма
«
Отговор #6 :
Ноември 18, 2006, 15:05:18 »
Ами не съм много на ясно с php-то, затова и въпросите ми са толкова елементарни.
Имам още един въпрос, понеже във файла contact.php кода е малко по-различен от показания по-горе, да заменя цялата функция или е достатъчно само това:
Код:
<?php
function
sendmail
(
$con_id
,
$option
,
$validcaptcha
) {
if (
$validcaptcha
==
"1"
)
}
?>
Активен
SEO
|
Видеозаснемане
|
Безплатни програми
majo
DEUS EX MACHINA
Глобален модератор
Мега Гуру
Karma: +2185/-0
Offline
Публикации: 1,918
Thunder and sparks in the Heart of the Dark ...
Re: Анти спам защита на контактната форма
«
Отговор #7 :
Ноември 18, 2006, 17:07:34 »
Ми запази функцията както си е. Номерът са 2 неща:
1во да й придадеш като аргумент променливата $validcaptcha в реда, в който я дефинираш:
function sendmail( $con_id, $option,
$validcaptcha
) { ... }
и 2рото е да ползваш все пак таз променлива, а именно като оградиш цялото съдържание на функцията с
if ($validcaptcha == "1") { ... }.
Логиката е следната. В случая sendmail в суича $op (което на прост език значи "когато променливата $op = 'sendmail' ") казваш на системата да изпълни функцията sendmail () с няколко променливи. Тези променливи й се предават, за да се изпълни коректно.
switch( $op ) {
case 'sendmail':
sendmail( $con_id, $option, $validcaptcha ); //Добавям $validcaptchа променливата
break;
...
...
}
После тази функция се дефинира от
function sendmail( $con_id, $option, $validcaptcha ) { ... } (Многоточието бележи съдържанието й). Виждаш, че в декларирането на функцията слагаме таз променлива като аргумент по същите причини и на същото място - за да знае пхп, че искаме да правим нещо с нея и да я очаква на съответното й място. (А за това, тя да е на това място, се грижи горния суич.)
Когато тръгне да се изпълнява, тази фунцкия си търси аргументите. След като си ги получи, прави нещо с тях, което й е казано във всичките редове м/у { и }. Т.е., ако искаме да ползваме стойността на променливата $validcaptcha (0 или 1) като условие да се праща или не съобщението, трябва да оградим с проверка if цялата фунцкия ето така:
function sendmail ( $con_id, $option, $validcaptcha ) {
if ($validcaptcha == "1") {
// Цялото съдържание на функцията
// То е оригиналнното от файла ти
// Не се налага да го изтриваш или променяш
// Просто изпълняваме тия няколко реда
САМО КОГАТО
променливата $validcaptcha има стойнмост 1.
}
// затваряща скоба за проверката
} // затваряща скоба за функцията
Активен
You're welcome to the metal age!
muslim
Администратор
Мега Гуру
Karma: +2520/-0
Offline
Публикации: 2,031
www.webg.org
Re: Анти спам защита на контактната форма
«
Отговор #8 :
Ноември 18, 2006, 18:28:48 »
Така, надявам се това да е последния ми въпрос по тоя хак. Къде е това непосредствено след формата, къде точно да го бутна тоя код, ето това е формата:
Код:
<form action="
<?php
echo
sefRelToAbs
(
'index.php?option=com_contact&Itemid='
.
$Itemid
);
?>
" method="post" name="emailForm" target="_top" id="emailForm">
<div class="contact_email
<?php
echo
$menu_params
->
get
(
'pageclass_sfx'
);
?>
">
<label for="contact_name">
<?php
echo(
_NAME_PROMPT
);
?>
</label>
Активен
SEO
|
Видеозаснемане
|
Безплатни програми
majo
DEUS EX MACHINA
Глобален модератор
Мега Гуру
Karma: +2185/-0
Offline
Публикации: 1,918
Thunder and sparks in the Heart of the Dark ...
Re: Анти спам защита на контактната форма
«
Отговор #9 :
Ноември 18, 2006, 18:35:11 »
Уеуе мауееее.
Непосредствено след реда:
<form action="<?php echo sefRelToAbs( 'index.php?option=com_contact&Itemid='. $Itemid ); ?>" method="post" name="emailForm" target="_top" id="emailForm">
слагаш сичко, барабар с <?php и ?>, от
"5. Промени в contact.html.php:
Работим във function _writeEmailForm( &$contact, &$params, $sitename ). Около 675 ред. Непосредствено след началото на формата <form action="..."> слагаме следното:
Код:"
<?php
//CAPTCHA HACK STARTS HERE
require_once("captcha/hn_captcha.class.x1.php");
...
...
...
...
//echo $validcaptcha;
//CAPTCHA HACK STOPS HERE
?>
Активен
You're welcome to the metal age!
muslim
Администратор
Мега Гуру
Karma: +2520/-0
Offline
Публикации: 2,031
www.webg.org
Re: Анти спам защита на контактната форма
«
Отговор #10 :
Ноември 18, 2006, 21:07:30 »
изглежда постигнах някакъв напредък по въпроса, сега ми показва формата, но ми дава тази грешка "No Truetypefont available for the CaptchaClass"
Активен
SEO
|
Видеозаснемане
|
Безплатни програми
muslim
Администратор
Мега Гуру
Karma: +2520/-0
Offline
Публикации: 2,031
www.webg.org
Re: Анти спам защита на контактната форма
«
Отговор #11 :
Ноември 18, 2006, 21:29:59 »
Сетих се, че не съм задал пътища до папките, затова явно ми дава тая грешка:)
Активен
SEO
|
Видеозаснемане
|
Безплатни програми
muslim
Администратор
Мега Гуру
Karma: +2520/-0
Offline
Публикации: 2,031
www.webg.org
Re: Анти спам защита на контактната форма
«
Отговор #12 :
Ноември 18, 2006, 21:50:16 »
Затова друг път, пак си я дава грешката!
А какъв е тоя "counter_filename" и от къде да го намеря.
Имаш ли някви снимки, дай една насам?
За изображенията друга папка ли трябва да създам?
Активен
SEO
|
Видеозаснемане
|
Безплатни програми
majo
DEUS EX MACHINA
Глобален модератор
Мега Гуру
Karma: +2185/-0
Offline
Публикации: 1,918
Thunder and sparks in the Heart of the Dark ...
Re: Анти спам защита на контактната форма
«
Отговор #13 :
Ноември 19, 2006, 12:28:19 »
За директориите и правата виж най-първия постинг - там всичко съм си казал без бой.
За шрифтовете - трябва да си ги сложиш в съответната директория, чийто път си задал в
'TTF_folder' => '/put/do/fonts/'
В следващия масив трябва да туриш имената НА ФАЙЛОВЕТЕ на тия шрифтове като внимаваш за МаЛКи и ГоЛЕми букви, щото пхп-то обръща внимание на тия неща.
'TTF_RANGE' => array('verdana.ttf','COMIC.TTF','JACOBITE.TTF','LYDIAN.TTF','MREARL.TTF','RUBBERSTAMP.TTF','ZINJARON.TTF'),
За
'counter_filename' => '', // string: absolute filename for textfile which stores current counter-value. Needs read- & write-access!
можеш да си окажеш некво име на временния файл, който ще цъка брояча. Той се пише в
'tempfolder' => '/put/do/tmp/', // абсолютната пътека до /tmp (със завършваща наклонена черта!)
//'tempfolder' => $_SERVER['DOCUMENT_ROOT'].'/_tmp/', // може и така
и може да го има прдварително създаден, а може и да го няма. Тук можеш и да дадеш име на файла, можеш и да не дадеш - мисля, че в самия клас е зададено име по подразбиране, така че се не бой.
На този етап най-важна е структурата на директориите и правилно да си им записал пътечките и да си им задал правилните права.
Активен
You're welcome to the metal age!
muslim
Администратор
Мега Гуру
Karma: +2520/-0
Offline
Публикации: 2,031
www.webg.org
Re: Анти спам защита на контактната форма
«
Отговор #14 :
Ноември 21, 2006, 08:08:27 »
а съответните шрифтове от къде да ги взема?
Активен
SEO
|
Видеозаснемане
|
Безплатни програми
Страници:
[
1
]
2
3
...
5
Джумла! България
|
Компоненти, модули, шаблони
|
Компоненти
|
Модификации и хакове
|
Анти спам защита на контактната форма
« назад
напред »
Отиди на:
Моля, изберете:
-----------------------------
Джумла! България
-----------------------------
=> Правила и анонси
=> Общи съобщения
=> Джумла! Ден
=> Шоуто на Пламен&Co
===> Шоуто на дамите
-----------------------------
Форум за Джумла!
-----------------------------
=> Джумла! - 1.5.x
===> За начинаещи
=====> Дискусии на FAQ
===> Решени проблеми
===> SEO
=> Joomla 1.6
=> Преводи
===> Текущи преводи
===> Завършени преводи
===> Преводи на македонски
=> Джумла! ревю
=> JoomFish Content Elements
-----------------------------
Компоненти, модули, шаблони
-----------------------------
=> Компоненти
===> Форуми
===> VirtueMart (ВиртюеМарт),модули и ботове
=====> Първи стъпки в VirtueMart
===> Галерии
===> Файлови архиви
===> Магазини и каталози
===> Модификации и хакове
=> Модули
=> Добавки (plugins)
=> Шаблони
-----------------------------
Бизнес
-----------------------------
=> Купувам / Продавам
=> Оптимизация и бизнес
===> Размяна на банери
=> Хостинг
===> www.joomla-bg.net
===> SuperHosting.bg
===> Хост България
===> Други доставчици
-----------------------------
Разработки
-----------------------------
=> Всичко за Ваши разработки и проекти
=> PHP и MySQL
-----------------------------
Архив и кошче
-----------------------------
=> Архив
===> ICDSoft
===> ICNBG.com
===> SiteGround
===> cbox.biz
===> Goto.BG
===> dom.bg
===> Fcolor
===> ТопХост.БГ
===> Пилакс
===> my32.net
===> Джумла! - 1.0.x
=====> Джумла! - UTF-8
=====> Решени проблеми
=====> За начинаещи
=====> SEO
===> Архив Преводи