2016-04-27 62 views
2

我遇到了一個問題,我的PHP郵件代碼每天晚上運行像下午11:30。我確定沒有人點擊表單提交按鈕。電子郵件內容爲空。PHP郵件腳本每晚自動運行同一時間

在我的PHP郵件代碼中,我將這些內容添加到數據庫中,以防郵件不通過,然後發送郵件。

感謝

表:

<form action="background/mail.php" method="POST"> 
    <div class="row"> 
     <div class="six columns"> 
      <label>Your email</label> 
      <input class="u-full-width" type="email" placeholder="[email protected]" name="email"> 
     </div> 
     <div class="six columns"> 
      <label>Reason for contacting</label> 
      <select class="u-full-width" name="reason"> 
       <option>Inquiry</option> 
       <option>Order</option> 
       <option>Other</option> 
      </select> 
     </div> 
    </div> 
    <div class="row"> 
     <div class="u-full-width"> 
      <label>Message</label> 
      <textarea class="u-full-width" placeholder="Enter message here" name="message"></textarea> 
      <input class="button-primary" type="submit" value="Submit"> 
     </div> 
    </div> 
</form> 

mail.php:

<?php 
    $to = "[email protected]"; 
    $reason = "CUSTOMER MAIL: " . $_POST['reason']; 
    $email = $_post['email']; 
    $msg = $_POST['message'] . "\nemail: " . $email; 
    $header = "MIME-Version: 1.0\r\n"; 
    $header.= "Content-type: text/html\r\n"; 
    $header.= "From: " . $email . "\r\n"; 
    $header.= "Reply-to: [email protected]\r\n" . "X-Mailer: PHP/" . phpversion(); 

    require("login.php"); 

    $sql = "INSERT INTO emails (email, message, reason) VALUES ('$email','$msg','$reason')"; 

    if($conn->query($sql) === TRUE){ 
     mail($to,$reason,$msg, $header); 
     echo "Added to database, mail sent."; 
    } else { 
     echo "Error: " . $sql . "<br>" . $conn->error; 
    } 

    $conn->close(); 

?> 
+0

你有沒有建立一個cron或東西嗎? –

+2

如果您沒有設置任何cron作業來運行腳本,那麼嘗試添加capcha可能? –

+0

您是否設置了cron作業?你如何確信當時沒有人提交你的表格? – Nick

回答

2

As I stated in comments已經成爲機器人(或許多機器人)的受害者;這是我用來阻止某些IP地址並用作每個文件中包含的內容。

您還應該檢查empty()字段,並使用isset()針對提交按鈕。

以下不需要最後的第4集,但您可以隨時添加它,因爲它會檢查第三組之後的任何內容。

你甚至可以縮小到僅使用2組。

$ip = $_SERVER['REMOTE_ADDR']; 

$nums = explode(".", $ip); 

$if = "{$nums[0]}.{$nums[1]}.{$nums[2]}"; 

$blacklist = array(

"184.154.139", 
"123.4.111", 
"234.5.678" 

); 

if (in_array($if, $blacklist)) { 

// echo "Rejected"; 

header("Location: http://www.example.com/"); 
exit; 

} 

else { 

// Run your other code to do the variable check, mail processing etc. 
} 

I.e.:

名稱您的提交按鈕:

<input name="submit" class="button-primary" type="submit" value="Submit"> 

然後檢查它的設置,並且沒有接線柱陣列的(不)空:

if(isset($_POST['submit'])){ 

    if(!empty($_POST['reason']) && !empty($_POST['email'])){ 

     $reason = $_POST['reason']; 
     $email = $_POST['email']; 

     // Run your executables in here 

    } 
} 
  • 另一個有效的方法是使用一個複選框並驗證它是否被選中。

而且作爲說明,你現在的代碼是開放的SQL injection。使用prepared statementsPDOprepared statements

另外,我在評論中提到的有關$_post的語法錯誤需要使用大寫字母$_POST,因爲它是超全球性的。

+2

感謝您的非常詳細的答案。我只有一個問題,在$ ip = $ _SERVER ['REMOTE_ADDR']'之後,你爲什麼要分割它? '$ _SERVER ['REMOTE_ADDR']'是否返回格式爲「xxx.xxx.xxx」的IP? –

+0

@ishyfishy不客氣。原因是這些(偷偷摸摸的)機器人中的一些往往會改變其IP地址的最後序列,例如'123.456.789.111'到'123.456.789.123'或'123.456.789.000'類型的東西。所以在這裏,我們阻止了匹配第三個到最後一個序列的所有內容 –

+0

@ishyfishy要回答你的第二個問題(我忘了回答),請在這裏閱讀http://php.net/manual/en/reserved.variables.server.php你可以修改它,但有點建議你不要,因爲你想檢查一個IP地址而不是域。所以答案是否定的;它只會返回一個IP地址(用於訪問您的站點的服務器/人員)。 –

2

最有可能有人正在POST請求直接向您的郵件腳本來發送電子郵件。有一些非傻瓜式的方法可以阻止它:

  1. 添加一些檢查POST請求的內容。例如沒有空身,有效的電子郵件地址,其他邏輯檢查。 (無論如何,你應該這樣做)。

  2. 向窗體添加一個額外的隱藏字段,該字段爲空。確認它在mail.php中爲空以便繼續。這個想法:爬蟲儘量填寫所有表單字段,但是用戶不會填寫一個隱藏的表單字段

  3. 添加一個隱藏字段,並使用JS的一些價值填充和mail.php驗證。爬蟲不能使用JavaScript,所以這個字段將是空的(gotcha:對禁用JS的用戶不起作用)。

其中的任何一個都可以被規避,但它們對於實現來說並不重要,並且對於爬蟲而言稍微難一些。

爲了真正的安全性,還有更復雜的解決方案。也許有人可以在答案中概述這些。

+0

感謝您的答案。我阻止了該問題的抓取工具的IP!你有一些非常棒的提示,我現在正在執行,以防止這樣的未來問題。 –

+0

是的,跟上黑名單IP可能成爲你的兼職工作。但是一個有效的對策。 – dan08