【问题标题】:I get empty mails although PHP mail() is thoroughly checked尽管 PHP mail() 已经过彻底检查,但我收到了空邮件
【发布时间】:2018-03-16 08:10:50
【问题描述】:

我是 php 新手,我正在使用一个简单的表单,在主页上发布帖子给我发送电子邮件。

这是表格:

<form data-abide action="anfrage.php" method="post">
        	<fieldset>
        		<div class="row">
        			<div class="large-12 columns">
        				<label>Firma
        					<input type="text" name="firm" placeholder="Firma" />
        				</label>
        			</div>
        		</div>
        		<div class="row">
        				<div class="large-4 columns">
        					<label>Anrede
        						<select name="salutation">
        							<option value="-">-</option>
        							<option value="Herr">Herr</option>
        							<option value="Frau">Frau</option>
        						</select>
        					</label>
        				</div>
        			<div class="large-8 columns">
        				<label>Name <small>benötigt</small>
        					<input type="text" name="name" placeholder="Ansprechpartner" required pattern="[a-zA-Z]+">
        				</label>
        				<small class="error">Bitte geben Sie einen Ansprechpartner an!</small>
        			</div>
        		</div>
        		<div class="row">
        			<div class="large-4 columns">
        				<label>Adresse <small>benötigt</small> 
        					<input type="text" name="address" placeholder="Strasse, PLZ, Stadt" />
        				</label>
        				<small class="error">Bitte geben Sie eine Adresse an!</small>
        			</div>
        			<div class="large-4 columns">
        				<label>eMail <small>benötigt</small>
        					<input type="eMail" name="email" placeholder="eMail" required/>
        				</label>
        				<small class="error">Bitte geben Sie eine gültige eMail-Adresse an!</small>
        			</div>
        			<div class="large-4 columns">
        				<label>Telefon <small>benötigt</small>
        					<input type="text" name="phoneno" placeholder="0123 0815..." required/>
        				</label>
        				<small class="error">Bitte geben Sie eine gültige Telefonnummer an!</small>
        			</div>
        		</div>
        		<div class="row">
        			<div class="large-6 columns">
        				<label>Art der Anfrage</label>
        				<input type="radio" name="radio" id="dryhire" value="Vermietung"><label for="dryhire">Vermietung</label>
        				<input type="radio" name="radio" id="event" value="Veranstaltung"><label for="event">Veranstaltung</label>
        				<input type="radio" name="radio" id="consultation" value ="Beratung"><label for="consultation">Beratung</label>
        			</div>
        		</div>
        		<div class="row">
        			<div class="large-12 columns">
        				<label>Was können wir für Sie tun?<small>benötigt</small>
        					<textarea name="text" placeholder="Erläutern Sie uns kurz was Sie wann und wo benötigen." required pattern=""></textarea>
        				</label>
        				<small class="error">Bitte erläutern Sie kurz Ihr Anliegen!</small>
        			</div>
        		</div>
        		<div class="antispam">Wenn Sie kein Roboter sind lassen sie diesen Bereich einfach leer: <input type="text" name="url" /></div>
        		<button class="large-12 columns button" type="submit">ANFRAGEN</button>
        	</fieldset>
        </form>

anfrage.php 看起来像这样:

<?php
$to          = "anfrage@myhomepage.de";  
$subject     = $_POST["radio"];  
$email       = $_POST["email"];  
$returnPage = 'http://myhomepage.de#success';  
$returnErrorPage = 'http://myhomepage.de#error';  

$dodgy_strings = array(  
                "content-type:"  
                ,"mime-version:"  
                ,"multipart/mixed"  
                ,"bcc:"  
);  

function is_valid_email($email) {  
    return preg_match('#^[a-z0-9.!\#$%&\'*+-/=?^_`{|}~]+@([0-9.]+|([^\s]+\.+  
[a-z]{2,6}))$#si', $email);  
}  

function contains_bad_str($str_to_test) {  
    $bad_strings = array(  
        "content-type:"  
        ,"mime-version:"  
        ,"multipart/mixed"  
        ,"Content-Transfer-Encoding:"  
        ,"bcc:"  
        ,"cc:"  
        ,"to:"  
    );  

foreach($bad_strings as $bad_string) {  
        if(eregi($bad_string, strtolower($str_to_test))) {  
            header("Location: " . $returnErrorPage);  
            exit;  
        }  
    }  
}  

function contains_newlines($str_to_test) {  
   if(preg_match("/(%0A|%0D|\\n+|\\r+)/i", $str_to_test) != 0) {  
        header("Location: " . $returnErrorPage);  
        exit;  
   }  
}  

function isEmpty($str_to_test){  
    return preg_match('/\S/', $str_to_test);  
}  

function checkFormCompletion($str_to_test){  
    contains_bad_str($str_to_test);  
    if(isEmpty($str_totest)){  
        header("Location: " . $returnErrorPage);  
        exit;  
    }  
    else  
        return $str_to_test;  
}  

if($_SERVER['REQUEST_METHOD'] != "POST"){  
    header("Location: " . $returnErrorPage);  
    exit;  
}  

if (!is_valid_email($email)) {  
    header("Location: " . $returnErrorPage);  
    exit;  
}  

$body .= "Firma: " .checkFormCompletion($_POST['firm']);  
$body .= "\n";  
$body .= "Ansprechpartner: " .checkFormCompletion($_POST['salutation']) ." "   
.checkFormCompletion($_POST['name']);  
$body .= "\n";  
$body .= "Adresse: " .checkFormCompletion($_POST['address']);  
$body .= "\n";  
$body .= "Telefonnummer: " .checkFormCompletion($_POST['phoneno']);  
$body .= "\n";  
$body .= "\n";  
$body .= "Anfrage: " .checkFormCompletion($_POST['text']);  

contains_bad_str($email);  
contains_bad_str($subject);  

contains_newlines($email);  
contains_newlines($subject);  

checkFormCompletion($subject);  

if(isset($_POST['url']) && $_POST['url'] == ''){  
    $mailSent = @mail($to, $subject, $body, "From: ".$email);  
}  
else {  
    header("Location: " . $returnErrorPage);  
}  

if($mailSent == TRUE) {  
   header("Location: " . $returnPage);  
} else {  
   header("Location: " . $returnErrorPage);  
}  

exit();   
?>  

虽然恕我直言,我不会收到任何空电子邮件,但我还是会不断收到这样的电子邮件:

To: anfrage@myhomepage.de  
From: bflaccus@anyaddressyoucanimagine.com  
Subject:  
Body:  
Firma:  
Ansprechpartner: Herr 59d4f7714f4d7  
Adresse:  
Telefonnummer:  
Anfrage:  

有时一天只有一封电子邮件,有时是三十多封。
我不知道为什么我不断收到这些电子邮件。 你知道如何避免它吗? 或者你知道我的anfrage.php哪里有安全问题吗?

提前致谢!

【问题讨论】:

  • 无论如何它都是垃圾邮件,您的第一个选择应该是验证码(无论多么基本)。 -- 表单检查逻辑有点难理解;本地变量太多。应该直接在$_POST 中工作并使用一些哈希来运行函数/并生成最终模板。 -- 否则:让它制作一个带有 POST 值和最终 $body 结果的日志文件。

标签: php email spam-prevention email-spam


【解决方案1】:

您的 checkFormCompletion 函数中有错字,因此它将始终将字段评估为空。

function checkFormCompletion($str_to_test){  
    contains_bad_str($str_to_test);  
    if(isEmpty($str_totest)){   // $str_totest should be $str_to_test

你知道 PHP 已经有一个检查变量是否为空的函数,对吧? empty

【讨论】:

  • 非常感谢...我直接试一试!但这不应该总是避免发送任何电子邮件吗?
  • 老实说,我无法面对试图找出您的表单清理代码。如果您设置了 requestb.in 并将表单操作指向该 URL,那么您的表单是否发布了您期望的值?如果是这样,那么您的消毒过程就被打破了。就我个人而言,我可能会重新开始,表单清理很重要,所以 PHP 已经有许多内置函数来清理输入。请参阅 php.net/manual/en/filter.filters.sanitize.php
  • 错字是问题的原因... :-) 不过,我使用您指出的一些 php 函数来清理我收到的数据。谢了!
猜你喜欢
  • 2022-06-20
  • 2020-03-08
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 2019-09-17
相关资源
最近更新 更多