2014-02-18 43 views
0

我試圖在我的聯繫表單中創建一個隱藏的電子郵件字段,當填寫完畢後,將不會向我發送電子郵件(意味着垃圾郵件發送者填寫隱藏的電子郵件字段),而只是將垃圾郵件發送者發送到確認頁面,表明該電子郵件已發送。通過php清除垃圾郵件發送者/殭屍工具

我無法讓它正常工作。

測試網站 - http://www.webexplosive.com/s1/contact.html

這裏是我的聯繫方式PHP腳本:

<?php 
    $firstname = $_POST['firstname']; 
    $lastname = $_POST['lastname']; 
    $email1 = $_POST ['email1']; 
    $phone = $_POST ['phone']; 
    $comments = $_POST ['comments']; 
    $testBot = $_POST ['email2']; 

    $headers = "MIME-Version: 1.0\r\n"; 
    $headers = "From: $email1"; 
    $to = '[email protected]'; 
    $subject = 'Contact Form Submitted - Virginia Subsite'; 
    $message = " 
    First name: $firstname \n 
    Last name: $lastname \n 
    Email: $email1 \n 
    Phone: $phone \n 
    Comments: $comments \n"; 

    mail($to, $subject, $message, $headers); 

    header("Location: thankyou.html"); 

    if(email2 == "") { //If email2 form section is blank then... 
     $firstname = $_POST['firstname']; 
     $lastname = $_POST['lastname']; 
     $email1 = $_POST ['email1']; 
     $phone = $_POST ['phone']; 
     $comments = $_POST ['comments']; 
     $testBot = $_POST ['email2']; 

     $headers = "MIME-Version: 1.0\r\n"; 
     $headers = "From: $email1"; 
     $to = '[email protected]'; 
     $subject = 'Contact Form Submitted - Virginia Subsite'; 
     $message = " 
     First name: $firstname \n 
     Last name: $lastname \n 
     Email: $email1 \n 
     Phone: $phone \n 
     Comments: $comments \n"; 

     mail($to, $subject, $message, $headers); 

     header("Location: thankyou.html"); 
    } 
    else { 
     header("Location: thankyou.html"); 

    } 
?> 
+3

「無法正常工作」對於診斷問題並不完全有用......將無法正常工作?崩潰?語法錯誤?向各國領導人發送恐怖威脅?順便說一句,'如果(電子郵件== ...)'不完全正確..缺少'$',也許? –

+0

當testbot字段填入時,它向我發送一封電子郵件,它不應該。 –

+0

你也沒有檢查空的字段。 @EricBrown - 你的if(email2 ==「」)//如果email2表單部分是空白的,那麼......應該先來,如果這是一個好的Email,那麼就是「發送」。你需要重新考慮這一點。阻止他們在門口,*因爲它*。 ;-) –

回答

0

這是因爲你總是首先調用郵件形式。在你打電話之前,你需要驗證它。檢查email2字段爲空後調用郵件功能。

事實上,它會在發送if語句之前始終發送郵件。

建議:考慮實施一個驗證碼或類似的東西。

+1

原樣,它不會蹲下。缺少分號;) –

1

條碼技術

最好的辦法,我已經看到了淘汰機器人和垃圾郵件發送者在conmment和公衆的形式,沒有驗證碼。是產生一個隨機的md5 hash(每次刷新,應該渲染前面的hash無用),將hash存儲在cookie(用於POST檢索)。然後附加hash字符串到每個input[name=username_d109770c2788b022deb0fac1182c9e19](我也POST在窗體上的散列,並驗證POSTcookie)。

hashing輸入字段的好處是..它會增加殭屍程序能夠硬編碼到特定輸入(加上被動服務器驗證)的難度。

一旦你完成了這個簡單的添加input驗證,如email正則表達式等第四。

安全技術

安裝honeypot project到您的服務器,它已經101,130,389垃圾郵件服務器認定爲下午8時48分,19/02/2014(UTC + 12:00)的。

項目蜜罐是使用嵌入在網站的軟件來收集垃圾郵件

+0

+1甚至這不是OP所要求的。 –

0

這裏收穫的電子郵件地址時使用的IP地址信息的基於web的蜜罐網絡是你的代碼的修訂版與基本的表單驗證(但它只檢查空字段,它不檢查電子郵件是否有效 - 你可以很容易地添加,雖然),更重要的是,email header injection保護。

注:我沒有測試此代碼,它可能會慘遭失敗 - 隨意downvote如果是這樣的話

// Form validation, display errors 
// in case of empty fields 

$fields = ["firstname", "lastname", "email1", "phone", "comments"] 

foreach ($fields as $field) { 
    if (!isset($_POST[$field]) || empty($_POST[$field])) { 
     die("Error, ".$field." can't be empty, please retry."); // if validation fails we stop the script 
    } 
} 

if (isset($_POST["email2"]) && !empty($_POST["email2"])) { 
    die(); // hidden field isn't empty, so it's spam, so we stop there 
} 

// e-mail header injection protection 
$email1 = filter_var($_POST["email1"], FILTER_SANITIZE_EMAIL); 


$firstname = $_POST['firstname']; 
$lastname = $_POST['lastname']; 
$phone = $_POST ['phone']; 
$comments = $_POST ['comments']; 

$headers = "MIME-Version: 1.0\r\n"; 
$headers = "From: $email1"; 
$to = '[email protected]'; 
$subject = 'Contact Form Submitted - Virginia Subsite'; 
$message = " 
First name: $firstname \n 
Last name: $lastname \n 
Email: $email1 \n 
Phone: $phone \n 
Comments: $comments \n"; 

mail($to, $subject, $message, $headers); 

header("Location: thankyou.html"); 
0

(A後期的答案,但可能被證明是下跌的有用路)。

一般來說,垃圾郵件機器人將尋找一個表單元素稱爲emailcontact或任何可見的輸入,他們可以把自己的小手垃圾上。

你可以做的是顯示/標記一個輸入,說明「如果你是人類,請不要填寫」。

例如:

如果你是人,請勿填寫此:<input type="text" name="email">

然後檢查該字段爲not empty。如果它不是空的,並且(最有可能)被SPAMBOT填滿,則將其設爲die();或重定向。

例如:使用來自一個名爲提交按鈕的if(isset...

<input type="submit" name="soobmeet" value="Send"> 

旁註:我選擇了「soobmeet」,因爲它通常不是一個好主意,將其命名爲「提交」等

(我的東西從一個最近才知道這裏的大槍上SO)

PHP

<?php 
if(isset($_POST['soobmeet'])){ 

    $firstname = $_POST['firstname']; 
    $lastname = $_POST['lastname']; 
    $email1 = $_POST ['email1']; 
    $phone = $_POST ['phone']; 
    $comments = $_POST ['comments']; 
    $email = $_POST ['email']; 

    if(!empty($_POST['email'])){ 
     header("Location: get_lost.html"); 
    // or make it die(); 
    } 

    else{ 
    $headers = "MIME-Version: 1.0\r\n"; 
    $headers = "From: $email1"; 
    $to = '[email protected]'; 
    $subject = 'Contact Form Submitted - Virginia Subsite'; 
    $message = " 
    First name: $firstname \n 
    Last name: $lastname \n 
    Email: $email1 \n 
    Phone: $phone \n 
    Comments: $comments \n"; 

    mail($to, $subject, $message, $headers); 
    header("Location: thankyou.html"); 
    } 
} 
?> 
+0

或者你可以使用CSS隱藏該字段 - 通常spambots不會解析CSS以檢測這些「蜜罐」字段並填充它們。 – 2014-03-20 18:44:34

+0

你確實*是正確的André,奇怪的是我記得在回答問題時想到了同樣的東西。我想記下它,但我認爲OP希望修正他/她的代碼。 –

0

首先,我誠實地不推薦這個作爲垃圾郵件/機器人威懾物 - 有許多經過良好測試的第三方庫供您使用。話雖如此,我已經通過一些小改進來編輯您的代碼。希望這有些幫助。

<?php 

// Note: It is your own responsibility to validate user input! 

if(isset($_POST['email2']) && $_POST['email2'] != "") { 
    $strFirstName = $_REQUEST['firstname']; 
    $strLastName = $_REQUEST['lastname']; 
    $strEmail = $_REQUEST['email1']; 
    $strPhone = $_REQUEST['phone']; 
    $strComments = $_REQUEST['comments']; 
    $strTestBot = $_REQUEST['email2']; 

    $strBody = "First name: ".$strFirstName." \nLast name: ".$strLastName." \nEmail: ".$strEmail." \nPhone: ".$strComments." \n"; 
    mail('[email protected]', 'Contact Form Submitted - Virginia Subsite', $strBody, 'From: '.$strEmail); 

    header("Location: thankyou.html"); 
} else { 
    header("Location: thankyou.html"); 
} 

?> 

這是你想要實現的嗎?另外,您應該驗證每個字段,例如檢查它們是否爲空,格式和長度是否合適等。preg_match()是一種非常棒的方法,此外,您還可以在客戶端添加一些次要驗證。

相關問題