2012-08-22 40 views
0

您好!我只是想知道我剛剛創建的這個contactform腳本有多安全?很久以前,我的老師在made contact我的聯繫人時很嘮叨我。確保聯繫表格腳本

if($_SERVER['REQUEST_METHOD'] === 'POST'){ 

    $myemail = "[email protected]"; 
    $name  = $_POST['name']; 
    $email = $_POST['email']; 
    $phone = $_POST['phone']; 
    $subject = $_POST['subject']; 
    $comments = $_POST['comments']; 

    if($name == 0 || !preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/", $email) || !preg_match("/^\d{2}(-\d{3}){2}(\d{2})?$/", $phone) || $subject == 0 || $comments == 0){ 

     $error_message = 'Something was written wrong..'; 

    } else { 

     $message = "Hello! 
     Your contact form has been submitted by: 
     Name: $name 
     E-mail: $email 
     Phone: $phone 
     Comments: $comments 
     End of message"; 
     mail($myemail, $subject, $message); 
     $error_message = 'Your message was sent!'; 

    } 
} 

有關如何使其安全的任何建議?

P.S. Securing a Contact FormSecuring a php contact form都適用於WordPress,這不是我所要做的。

+0

您可能想要在http://codereview.stackexchange.com/ – j08691

+0

上發佈此信息似乎很容易受到郵件注入攻擊,這意味着通過注入自定義標頭和自定義正文通過服務器發送(垃圾郵件)郵件。可以通過\ r和\ n關閉主題以及將其他所有未過濾到郵件標題中的內容進行修復。 –

+0

也許老師指的是人類/機器人跳棋,如[recaptcha](http://www.google.com/recaptcha)。 – Matt

回答

6

您可以使用函數驗證項,例如:

function check_input($data) 
{ 
    $data = trim($data); 
    $data = stripslashes($data); 
    $data = htmlspecialchars($data); 
    return $data; 
} 

而且

 $name      =    check_input($_POST['name']); 
     $email    =    check_input($_POST['email']); 
     $phone    =    check_input($_POST['phone']); 
     $subject  =    check_input($_POST['subject']); 
     $comments =    check_input($_POST['comments']); 

而且

 if ($name && $email && $phone && $subject && $comments) { 
     Send contact form... 

} 

當然,您可以添加驗證碼以使其更安全。

+0

這是可怕的建議。閱讀[偉大的逃避現實(或:你需要知道如何處理文本中的文本)](http://kunststube.net/escapism/)。 – deceze

+0

@deceze好,它是5歲...發佈更新的答案。 –

+0

@Michael 5年前,這是可怕的建議。 – deceze

0

在缺乏數據驗證的情況下,代碼中確實沒有任何不安全因素。您只需收集表單數據併發送出去。所以唯一的'不安全'是,除非使用任何形式的驗證碼,否則您將很容易通過該表單發送垃圾郵件。目前我還不確定,但可以誘騙郵件()添加更多帶有精心製作的$主題的收件人,因此這將是保存以確保它的鏈接並剝離任何CRLF

+0

所以我必須使用CAPTCHA?剝離任何CRLFs是什麼意思? – Nworks

+1

他的意思是我的意思。 CRLF =回車/換行(\ r \ n)。剝離它們意味着將它們移除。 –

+3

我也強烈建議遠離郵件()並忘記它曾經存在過。這是愚蠢的(如果你知道你需要這樣,這是一件好事 - 這幾乎從未如此)。有很多專用的庫用於發送郵件,這些郵件可以通過構建郵件結構或處理附件或處理經過驗證的smtp來處理您的頭腦中的許多問題,即使使用郵件()也不應考慮。看看PHP梅勒 - 簡單,漂亮並經過測試。 –