Моля, влезте или се регистрирайте.
Изгубен регистрационен е-мейл?

134,794 Общо мнения в 16,950 Теми от 2,961 Потребители
Последен член: dictio
Джумла! България  |  Компоненти, модули, шаблони  |  Компоненти  |  Модификации и хакове  |  Анти спам защита на контактната форма « назад напред »
Страници: [1] 2 3 ... 5
Печат
Автор Тема: Анти спам защита на контактната форма  (Прочетена 18155 пъти)
majo
DEUS EX MACHINA
Глобален модератор
Мега Гуру
*

Karma: +2185/-0
Offline Offline

Публикации: 1,918


Thunder and sparks in the Heart of the Dark ...

171097034 kalin_sivov
WWW
« : Юни 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  trimmosGetParam$_POST'email''' ) );
$text  trimmosGetParam$_POST'text''' ) );
$name  trimmosGetParam$_POST'name''' ) );
$subject  trimmosGetParam$_POST'subject'$default ) );
$email_copy mosGetParam$_POST'email_copy');

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 Offline

Публикации: 1,918


Thunder and sparks in the Heart of the Dark ...

171097034 kalin_sivov
WWW
« Отговор #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 Offline

Публикации: 2,031


www.webg.org

236351690 vbr_82
WWW Ел. поща
« Отговор #2 : Ноември 17, 2006, 17:54:57 »

Целия код ли трябва да копирам включително <?php и ?> или без тях?
Активен

muslim
Администратор
Мега Гуру
*

Karma: +2520/-0
Offline Offline

Публикации: 2,031


www.webg.org

236351690 vbr_82
WWW Ел. поща
« Отговор #3 : Ноември 17, 2006, 18:12:23 »

На мен нещо ми са непонятни промените в contact.html.php, къде е тва непосредствено след началото на формата <form action="...">, ако може малко по-подробно?!
Активен

muslim
Администратор
Мега Гуру
*

Karma: +2520/-0
Offline Offline

Публикации: 2,031


www.webg.org

236351690 vbr_82
WWW Ел. поща
« Отговор #4 : Ноември 17, 2006, 18:55:15 »

Незнам но тоя хак или не работи за джумла или аз нещо бъркам, писна ми да го човъркам Тъжен
Активен

majo
DEUS EX MACHINA
Глобален модератор
Мега Гуру
*

Karma: +2185/-0
Offline Offline

Публикации: 1,918


Thunder and sparks in the Heart of the Dark ...

171097034 kalin_sivov
WWW
« Отговор #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 Offline

Публикации: 2,031


www.webg.org

236351690 vbr_82
WWW Ел. поща
« Отговор #6 : Ноември 18, 2006, 15:05:18 »

Ами не съм много на ясно с php-то, затова и въпросите ми са толкова елементарни.
Имам още един въпрос, понеже във файла contact.php кода е малко по-различен от показания по-горе, да заменя цялата функция или е достатъчно само това:
Код:
<?php
 
function sendmail$con_id$option$validcaptcha ) {
if (
$validcaptcha == "1")
}
?>
Активен

majo
DEUS EX MACHINA
Глобален модератор
Мега Гуру
*

Karma: +2185/-0
Offline Offline

Публикации: 1,918


Thunder and sparks in the Heart of the Dark ...

171097034 kalin_sivov
WWW
« Отговор #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 Offline

Публикации: 2,031


www.webg.org

236351690 vbr_82
WWW Ел. поща
« Отговор #8 : Ноември 18, 2006, 18:28:48 »

Така, надявам се това да е последния ми въпрос по тоя хак. Къде е това непосредствено след формата, къде точно да го бутна тоя код, ето това е формата:
Код:
<form action="<?php echo sefRelToAbs'index.php?option=com_contact&amp;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>
Активен

majo
DEUS EX MACHINA
Глобален модератор
Мега Гуру
*

Karma: +2185/-0
Offline Offline

Публикации: 1,918


Thunder and sparks in the Heart of the Dark ...

171097034 kalin_sivov
WWW
« Отговор #9 : Ноември 18, 2006, 18:35:11 »

Уеуе мауееее.  Хиля се

Непосредствено след реда:

<form action="<?php echo sefRelToAbs( 'index.php?option=com_contact&amp;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 Offline

Публикации: 2,031


www.webg.org

236351690 vbr_82
WWW Ел. поща
« Отговор #10 : Ноември 18, 2006, 21:07:30 »

изглежда постигнах някакъв напредък по въпроса, сега ми показва формата, но ми дава тази грешка "No Truetypefont available for the CaptchaClass"
Активен

muslim
Администратор
Мега Гуру
*

Karma: +2520/-0
Offline Offline

Публикации: 2,031


www.webg.org

236351690 vbr_82
WWW Ел. поща
« Отговор #11 : Ноември 18, 2006, 21:29:59 »

Сетих се, че не съм задал пътища до папките, затова явно ми дава тая грешка:)
Активен

muslim
Администратор
Мега Гуру
*

Karma: +2520/-0
Offline Offline

Публикации: 2,031


www.webg.org

236351690 vbr_82
WWW Ел. поща
« Отговор #12 : Ноември 18, 2006, 21:50:16 »

Затова друг път, пак си я дава грешката!
А какъв е тоя "counter_filename" и от къде да го намеря.
Имаш ли някви снимки, дай една насам?
За изображенията друга папка ли трябва да създам?
Активен

majo
DEUS EX MACHINA
Глобален модератор
Мега Гуру
*

Karma: +2185/-0
Offline Offline

Публикации: 1,918


Thunder and sparks in the Heart of the Dark ...

171097034 kalin_sivov
WWW
« Отговор #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 Offline

Публикации: 2,031


www.webg.org

236351690 vbr_82
WWW Ел. поща
« Отговор #14 : Ноември 21, 2006, 08:08:27 »

а съответните шрифтове от къде да ги взема?
Активен

Страници: [1] 2 3 ... 5
Печат
Джумла! България  |  Компоненти, модули, шаблони  |  Компоненти  |  Модификации и хакове  |  Анти спам защита на контактната форма « назад напред »
Отиди на: