Email contact form защитена с Peoplesign captcha

Всякакви теми от и за начинаещи и напреднали уеб-мастери, уеб дизайнери, apache, php, html, css, seo, hosting и др.
Публикувай отговор
Аватар
teou
Site Admin
Мнения: 2970
Регистриран на: 23 Ное 2012 19:57
Местоположение: Dreieich - Dreieichenhein (Hessen) / София / Синеморец
Обратна връзка:

Email contact form защитена с Peoplesign captcha

Мнение от teou »

Предоставям на вашето внимание едно скриптче, което сглобявах през последните дни: проста имейл контактна форма, подходяща за малки сайтчета.

Скриншот (форматирането НЕ е включено в кода, който ви давам, с изкл. на карето за грешки/успех горе):
*на скриншота капчата е на английски, във финалната версия е на БГ
PREVIEW.jpg
Изисквания:

- Регистрация на http://peoplesign.com/main/registerToHo ... esign.html
- PHP минимум 5.2.0 ! заради валидиращите полетата функции Ако сте с още по-антична версия, махнете тази част от кода.
- Сървър - Linux базиран. Можете да използвате и Windows такъв, но ако се съди по забележките и коментарите тук, ще се натъкнете на разни проблеми и ще трябва да адаптирате кода.

Предимства и функции:

+ Малък и лек скрипт
+ Използва външен сайт за капчата - пести ресурси и усилия и увеличава сигурността (bruteforce impossible)
+ Пълна поддръжка на български - както на формата така и на капчата (utf-8)
+ Пълно (първоначално) скриване на имейл дестинацията, възможност за изпращане до Н мейла едновременно
+ Използва вградената PHP mail функция - не се грижите за сървърни настройки, възможни грешки и т.н.
+ Пълна санитизация на полетата. Валидация на мейла. Изпращане само на plain text в писмото
+ Ограничение на въвежданите във формата символи, вкл. с обратна връзка към потребителя (брояч)
+ Грешки към потребителя "на човешки" - както за капчата така и за валидацията, при това със запазване на записания до сега текст
+ Ще работи и при изключен/блокиран джаваскрипт и бисквитки (с изкл. на брояча) - капчата дифолтва към iframe версия
+ Запис на IP адрес на изпращача
+ Името и мейла на подателя се сервират като изпращач на мейла, т.е. може да се натисне Reply на писмото

Недостатъци и ограничения:

- Използването на външен сайт за капчата - сещате се, ако падне техния сървър по някаква причина сте прецакани :)
- Използването на php mail() - просто е, но липсва гъвкавост. Така например при споделен хостинг получателя на мейл формата ще види маса информация в хедърите за хостинга ви, скрипта и т.н. SPF записа на генерираните писма ще е "best guess", което в даден момент може да е проблем. Няма и възможност за пестене на ресурси на хоста, правене на "опашки" и т.н. С други думи - не е подходящо за натоварени сайтове. На мен лично така ми е ОК, но при определени условия вероятно няма да е ОК. В този случай ще се наложи преработка, за да се използва PHP Mailer class / PEAR mail или някаква ваша функция, позволяваща пращане на SMTP и логване. Пример за такъв скрипт в линковете най-долу на поста ми.
- Формата е подходяща за малки сайтчета. Една от причините е, че сесията на потребителя се държи отворена до откат, т.е. до пращане на мейла. Очевидно, ако имате много пхп скриптове на страницата и потребителя се опита да прави нещо друго, свързано с пхп, няма да може, докато не завърши този скрипт, което може да отнеме 1-2-3-5 секунди. Ако това за вас е проблем, помислете за преработка на скрипта в посока разсинхронизиране, затваряне на сесията със session_write_close и т.н.
- Джаваскрипта, викащ капчата, се зарежда синхронно. Т.е. докато не се зареди, не се зарежда нищо след него и "чупи" страницата. Отново - за малки сайтчета не би следвало да е проблем, защото под капчата не би следвало да има нищо, което потребителят да вижда (само затварящи div, body, html тагове, analytics, такива неща). Ако това за вас е проблем - ще се радвам да пренапишете джаваскрипт частта така че да се зарежда асинхронно и да ни споделите резултата.

Код:

Кодът реално е прикачен към поста, тук поствам единият файл (моят), с цел по-лесен преглед преди сваляне и дискусия. Вътре има и доста коментари, защото трябва да смените примерните данни (персонален ключ, мейли и т.н.) с вашите, иначе няма да работи.

Код за потвърждение: Избери целия код

<?php
session_start();
// peoplesignClient.php ТРЯБВА ДА Е В СЪЩАТА ПАПКА КАТО ФОРМАТА
include("peoplesignClient.php");
$statusteo="";
// ВАШИЯТ УНИКАЛЕН КЛЮЧ, ПОЛУЧЕН ПРИ РЕГИСТРАЦИЯТА ВИ В PEOPLESIGN.COM
$peoplesignKey = "---КЛЮЧ---";
$thisPeoplesignLocation = "form41";
$peoplesignResponse = $_POST['captcha_peoplesignCRS'];
$peoplesignSessionID = $_POST['challengeSessionID'];
$allowPass = processPeoplesignResponse($peoplesignSessionID,
				   $peoplesignResponse,
				   $thisPeoplesignLocation,
				   $peoplesignKey );
if ($allowPass) 
	{
        if ($_POST['name'] != "") {  
            $_POST['name'] = filter_var($_POST['name'], FILTER_SANITIZE_STRING);  
            if ($_POST['name'] == "") {  
                $errors .= 'Моля въведете валидно име.<br/>';  
            }  
        } else {  
            $errors .= 'Моля въведете вашето име.<br/>';  
        }  
        if ($_POST['email'] != "") {  
            $_POST['email'] = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);  
            if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {  
                $errors .= $_POST['email'] . " <strong>НЕ</strong> е валиден email адрес.<br/>";  
            }  
        } else {  
            $errors .= 'Моля въведете вашият email адрес.<br/>';  
        }  
          
        if ($_POST['message'] != "") {
		// АКО ИСКАТЕ ЛИМИТА НА ФОРМАТА ДА Е РАЗЛИЧЕН ОТ 2000 ЗНАКА ПРОМЕНЕТЕ ЧИСЛОТО 2000 НАВСЯКЪДЕ В ТОЗИ ФАЙЛ!
			$_POST['message'] = substr($_POST['message'], 0, 2000);
            $_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING);  
            if ($_POST['message'] == "") {  
                $errors .= 'Моля въведете съобщение.<br/>';  
            }  
        } else {  
            $errors .= 'Моля въведете съобщение.<br/>';  
        }  
        if (!$errors) {  
		// НА СЛЕДВАЩИТЕ 2 РЕДА ВЪВЕДЕТЕ КОЙ ДА ПОЛУЧАВА МЕЙЛ ОТ ТАЗИ ФОРМА И SUBJECT НА МЕЙЛИТЕ
			$mail_to = 'MAIL RECIPIENT 1 <MAIL1@EXAMPLE.COM>, MAIL RECIPIENT 2 <MAIL2@EXAMPLE.COM>'; 			
            $subject = 'SUBJECT НА МЕЙЛИТЕ ГЕНЕРИГАНИ С ФОРМАТА';  
			$message = $_POST['message'] . "\r\n" . "\r\n" . "Изпратено от IP: " . $_SERVER["REMOTE_ADDR"];
			
			$header = "MIME-Version: 1.0\r\n";  
			$header .= "Content-type: text/plain; charset=utf-8\r\n";  
			$header .= "From: ".$_POST['name']." <". $_POST['email'] .">";
            $send_contact= mail($mail_to, $subject, $message, $header); 
				if($send_contact){
				$statusteo= '<div style="background-color:#008000;  color:#FFFFFF; text-align:center;">Вашето запитване е изпратено успешно, благодарим ви!</div>';
				}
				else {
				$statusteo='<div style="background-color:#F30;  color:#FFFFFF; text-align:center;">Вашето запитване не може да бъде изпратено в момента. Моля използвайте телефоните за контакт и ни уведомете за тази грешка.</div>';
				}  
        } else {   
			$statusteo = '<div style="background-color:#F30;  color:#FFFFFF; text-align:center;">' . $errors . '</div>'; 
        } 
	} 
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Cache-Control" content="no-cache" />
<title>ФОРМА ЗА КОНТАКТ</title>

<script language="javascript" type="text/javascript">
function limitText(limitField, limitCount, limitNum) {
	if (limitField.value.length > limitNum) {
		limitField.value = limitField.value.substring(0, limitNum);
	} else {
		limitCount.value = limitNum - limitField.value.length;
	}
}
</script>
</head>

<body>

 
     <p>Форма за контакти - всички полета са задължителни</p>
    
	<div style="padding:10px;">

<?php
print ( $statusteo );
?>	
<!-- ФОРМАТА СЕ ОБРАБОТВА ОТ СЪЩИЯ ФАЙЛ, Т.Е. АКО ПРОМЕНИТЕ ИМЕТО НА ФАЙЛА НЕ ЗАБРАВЯЙТЕ ДА ГО ПРОМЕНИТЕ И НА ДОЛНИЯ РЕД -->	
<form name="form1" method="post" action="contactform.php">

Име: <br/>  
<input type="text" name="name" value="<?php echo $_POST['name']; ?>" size="40" maxlength="80" /><br/>  
Email адрес: <br/>  
<input type="text" name="email" value="<?php echo $_POST['email']; ?>" size="40" maxlength="90" /> <br/>  
Съобщение - до 2000 знака: <br/>  
<textarea name="message" rows="11" cols="75" maxlength="2000" onKeyDown="limitText(this.form.message,this.form.countdown,2000);" 
onKeyUp="limitText(this.form.message,this.form.countdown,2000);" ><?php echo $_POST['message']; ?></textarea>  
<br/>
<font size="1">(Максимум знаци: 2000)<br>
Остават ви още <input readonly type="text" name="countdown" size="3" value="2000"> знака. <noscript>Броячът няма да работи без да включите Javascript!</noscript></font><br/><br/> 
Защита от спам - моля за всяка от двете големи картинки горе намерете и кликнете подобната й малка картинка долу: <br/>  

<?php
$thisPeoplesignLocation = "form41";
// ВАШИЯТ УНИКАЛЕН КЛЮЧ, ПОЛУЧЕН ПРИ РЕГИСТРАЦИЯТА ВИ В PEOPLESIGN.COM
$my_peoplesign_key = "---КЛЮЧ---";
$peoplesign_options = "";
$peoplesign_options = "language=bulgarian&useDispersedPics=false&numPanels=2&numSmallPhotos=9&useDragAndDrop=false&challengeType=pairThePhoto&category=(all)&hideResponseAreaWhenInactive=false";
$peoplesignSessionID = $_SESSION["psid"];
$retVal = getPeoplesignSessionID (
			$my_peoplesign_key, "",
                        $peoplesign_options,
                        $thisPeoplesignLocation, "", $peoplesignSessionID);

$peoplesignSessionID = $retVal[1];
echo getPeoplesignHTMLJavascript($peoplesignSessionID);
$_SESSION["psid"] = $peoplesignSessionID;
?>

</br>
<input type="submit" value="Изпрати запитването">
</form>
	</div>
	</br>
    
</body>
</html>
Забележки:

Не съм писал нищо от нулата, а съм адаптирал и събирал в едно готови скриптове. Някои от по-важните сайтове, които съм използвал:
- http://net.tutsplus.com/tutorials/php/s ... p-filters/ - пример за валидация и санитизация на форми
- http://www.phpeasystep.com/phptu/8.html - примерче за пхп контактна форма
- http://www.mediacollege.com/internet/ja ... cters.html - джаваскрипта-брояч на знаците (реално рязането е в пхп кода, брояча е само козметика)
- http://support.webecs.com/KB/a390/php-m ... ation.aspx - пращане на мейл със смтп, но без php mailer, pear mail. Не го използвах накрая, но е полезно четиво.
- и разбира се, http://peoplesign.com и незаменимият http://php.net/manual/en/
Прикачени файлове
peoplesign_test.zip
(7.89 KiB) Свалено 204 пъти

Аватар
teou
Site Admin
Мнения: 2970
Регистриран на: 23 Ное 2012 19:57
Местоположение: Dreieich - Dreieichenhein (Hessen) / София / Синеморец
Обратна връзка:

Re: Email contact form защитена с Peoplesign captcha

Мнение от teou »

Пропуснах нещо важно по-горе: Използвайте читав текстов редактор, например Notepad++. Кодировката на файла трябва да остане UTF-8 without BOM (menu Edit), за да нямате проблеми с кирилицата. Също ви препоръчвам и subject-a да го оставите на латиница (Андроид например не позна кирилицата там).

Друг момент е използването на \r\n за нови редове. По принцип това е Уиндоус комбинация, но почти всички нови Линукс пощенски сървъри трябва да я разпознаят и заместят ако е нужно, така че този край на ред е "универсален". Ако вашият пошенски сървър е по-старичък, ще трябва да замените с \n, което е чистият UNIX нов ред.

sharo
Старши потребител
Мнения: 63
Регистриран на: 27 Дек 2012 22:11

Re: Email contact form защитена с Peoplesign captcha

Мнение от sharo »

Браво Тео!
Единствено не ми харесва каптчата. Естетически не е окей. Грозна е и едва ли би се вписала в който и да е сайт :). По-добре го направи с reCaptcha (recaptcha.net). Освен това можеш да махнеш ползването на mail и да го направиш да ползва pear::mail (би трябвало да го има инсталирано на почти всички споделени хостинги). Ето малко инфо: http://www.authsmtp.com/php-pear-mail/index.html

Аватар
teou
Site Admin
Мнения: 2970
Регистриран на: 23 Ное 2012 19:57
Местоположение: Dreieich - Dreieichenhein (Hessen) / София / Синеморец
Обратна връзка:

Re: Email contact form защитена с Peoplesign captcha

Мнение от teou »

Вярно е, че не е най-красива, ама е ядва. Мислех за реКапча, но нея не я ли хакнаха? Бях останал с впечатление, че новите версии на Xrumer и подобните имат някаква успеваемост там, макар и не 100%?

А пращането на мейл може да стане по сто начина, конкретно в моя случай Pear явно не е инсталиран. Може и с PHP Mailer примерно. Както съм писал по-горе - mail е ултимейт простотата, което е и предимство и недостатък. За натоварени сайтове определено е недостатък, затова съм казал, че без дребни преработки кода е уместен за малки лични сайтчета.

Аватар
teou
Site Admin
Мнения: 2970
Регистриран на: 23 Ное 2012 19:57
Местоположение: Dreieich - Dreieichenhein (Hessen) / София / Синеморец
Обратна връзка:

Re: Email contact form защитена с Peoplesign captcha

Мнение от teou »

Извинявам се на тези, които са изтеглили горните файлове и нещо не им е работело. Оказа се, че са необходими още 2 файла от библиотеките на Peoplesign, прикачам и тях. Не бях забелязал, защото досега всичко ми беше в една папка, днес тръгнах да местя и се оказа, че има още 2 зависимости, освен клиент библиотеката.
Прикачени файлове
peoplesign2.zip
(1.09 KiB) Свалено 222 пъти

Аватар
teou
Site Admin
Мнения: 2970
Регистриран на: 23 Ное 2012 19:57
Местоположение: Dreieich - Dreieichenhein (Hessen) / София / Синеморец
Обратна връзка:

Re: Email contact form защитена с Peoplesign captcha

Мнение от teou »

За съжаление гореспоменатият сайт вече не функционира. Оставям темата за да се ползват евентуално части от кода за други проекти.

Публикувай отговор