基本的PHP表单处理安全性问题

时间:2018-08-29 10:43:05

标签: php security webforms

PHP的新手,制作了一个将其内容发布到PHP文件的Web表单。 PHP文件需要将数据打包到一封电子邮件中,因为我没有足够的信心直接将数据发送到我们的系统中。我将测试PHP文件上传到服务器进行测试,并且在周末我收到了该文件发送的大量空白电子邮件,我认为这意味着有人在不填写表格的情况下访问该文件。

  1. 我是否使用正确的if语句来防止有人导航到我的php文件时代码运行?
  2. 如何使除Web表单之外的任何人都无法访问.php?
  3. 我犯了任何明显的错误吗?

    <?php 
    if($_SERVER["REQUEST_METHOD"] == "POST") {
    $emailbody = 'Name: '.$_POST['m_title'].' '.$_POST['m_firstname'].' '.$_POST['m_surname']."\n"
                .'Email: '.$_POST['m_email']."\n"
                .'Phone: '.$_POST['m_phone']."\n"
                .'D.O.B: '.$_POST['m_dob_day'].' '.$_POST['m_dob_month'].' '.$_POST['m_dob_year']."\n"          
                .'Postcode: '.$_POST['m_postcode']."\n"
                .'Lenders: '.$_POST['m_bank1'].','.$_POST['m_bank2'].','.$_POST['m_bank3'].','.$_POST['m_bank4'].','.$_POST['m_bank5'].','.$_POST['m_bank6'].','.$_POST['m_bank7'].','.$_POST['m_bank8'];
    mail('**removed**', 'Web Lead', $emailbody);
    header('Location: https://www.**removed**' true, 301);
    }
    exit();
    

    ?>

3 个答案:

答案 0 :(得分:0)

  

我是否使用正确的if语句来防止有人导航到我的php文件时代码运行?

不太正确,如果有人通过POST请求访问带有空白表单字段的文件,它将向您发送一封电子邮件,其中没有在邮件中指定的变量,例如m_title m_email等。

  

如何使除Web表单之外的任何人都无法访问.php?

您可以将CSRF令牌添加到表单中

  

我犯了任何明显的错误吗?

没有验证,没有逃脱可能导致潜在的安全漏洞。 301毫无意义,除非您真的想在用户每次访问带有表单的页面时将其重定向到指定的url。

答案 1 :(得分:0)

您可以通过使用前端和后端验证来阻止用户导航到文件。

  • [前端] 使用必填的Web表单字段[HTML]。
  • [后端] 仅在$ POST ['required_field']!= NULL时发送邮件。

答案 2 :(得分:0)

请确保所有必需的数据均来自请求。

<?php 
if($_SERVER["REQUEST_METHOD"] =="POST") { 
    If(isset($_POST['m_firstname']) && $_POST['m_firstname']!=''){
        If(isset($_POST['m_title']) &&$_POST['m_title']!=''){
            //likewise check for required data are coming from request.
            $emailbody = 'Name: '. $_POST['m_title'].' '.$_POST['m_firstname'].' '.$_POST['m_surname']."\n" .'Email: '.$_POST['m_email']."\n" .'Phone: '.$_POST['m_phone']."\n" .'D.O.B: '.$_POST['m_dob_day'].' '.$_POST['m_dob_month'].' '.$_POST['m_dob_year']."\n" .'Postcode: '.$_POST['m_postcode']."\n" .'Lenders: '.$_POST['m_bank1'].','.$_POST['m_bank2'].','.$_POST['m_bank3'].','.$_POST['m_bank4'].','.$_POST['m_bank5'].','.$_POST['m_bank6'].','.$_POST['m_bank7'].','.$_POST['m_bank8']; mail('**removed**', 'Web Lead', $emailbody); header('Location: https://www.**removed**' true, 301);
        }else{
            Echo 'title required';
        }
    }else{
        Echo 'name required';
    }
 } exit();

这将帮助您停止必要的邮件操作。

否则, 单击检查提交按钮

<?php
If(isset($_POST['submit'])){
    // put mail function here
}

我希望这会对您有所帮助:)