【问题标题】:Basic php form handling security questions基本的 php 表单处理安全问题
【发布时间】:2018-08-29 10:43:05
【问题描述】:

对 PHP 非常陌生,制作一个将其内容发布到 PHP 文件的 Web 表单。 PHP 文件需要将数据捆绑到给自己的电子邮件中,因为我没有足够的信心将数据直接发送到我们的系统中。我将一个测试 PHP 文件上传到服务器进行测试,在周末我收到了许多由该文件发送的空白电子邮件,我认为这意味着有人在未填写表单的情况下访问该文件。

  1. 当有人导航到我的 php 文件时,我是否使用了正确的 if 语句来阻止代码运行?
  2. 如何使 .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();
    

    ?>

【问题讨论】:

  • 在您对header 的调用中,true 关键字的含义是什么? (这似乎是一个错字/复制粘贴错误)
  • @Gabriel 它替换了以前设置的标题。这是默认行为。我猜这是因为 OP 需要 3 个 arg 但我不知道为什么;)
  • 很对,复制粘贴出错。谢谢。
  • @Robert :我指的是无效的语法(在某处缺少逗号,假设 OP 真的想传递 3 个 args :))

标签: php security webforms


【解决方案1】:

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

不完全是,如果有人使用带有空白表单字段的 POST 请求访问文件,它会向您发送一封电子邮件,其中没有在帖子中指定的变量,例如 m_title m_email 等。

我怎样才能使除了网络表单之外的任何人都无法访问 .php?

您可以在表单中添加 CSRF 令牌

我犯了什么明显的错误吗?

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

【讨论】:

  • 那么对于我来说,在周日凌晨 2:30 收到一封空白电子邮件意味着有人修改了网络表单的副本?我将研究实现一个令牌。验证也是我必须研究的东西,谢谢
【解决方案2】:

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

  • [前端] 对所需的网络表单字段使用 required [HTML]。
  • [后端] 仅在 $POST['required_field'] != NULL 时发送邮件。

【讨论】:

    【解决方案3】:

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

    <?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
    }
    

    希望对你有帮助:)

    【讨论】:

      猜你喜欢
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多