【问题标题】:secure way of passing form variable传递表单变量的安全方式
【发布时间】:2013-04-30 08:02:52
【问题描述】:

我正在为我的 wordpress 主题构建一个联系表单。我希望能够从后端输入接收者地址。目前我正在传递带有隐藏输入字段的变量。

<input type="text" class="hidden" name="receiver" value="<?php get_option('admin_email') ?>"/>

我读到我不应该这样做,因为它不安全。但是那我该怎么做呢?

编辑:这是我的 process.php。我试图获取管理员电子邮件,但不知何故破坏了它。

<?php if( isset($_POST) ){

    //form validation vars
    $formok = true;
    $errors = array();

    //sumbission data
    $ipaddress = $_SERVER['REMOTE_ADDR'];
    $date = date('d.m.Y');
    $time = date('H:i');

    //form data
    $name = $_POST['name']; 
    $email = $_POST['email'];
    $website = $_POST['website'];
    $budget = $_POST['budget'];
    $message = $_POST['message'];

    $receiver = $_POST['receiver'];
    $sender = get_option('admin_email');

    if(empty($name)){
        $formok = false;
        $errors[] = "Sie haben keinen Namen angegeben.";
    }

    if(empty($email)){
        $formok = false;
        $errors[] = "Sie haben keine Emailadresse angegeben.";
    //validate email address
    }elseif(!filter_var($email, FILTER_VALIDATE_EMAIL)){
        $formok = false;
        $errors[] = "Sie haben keine gültige Emailadresse angegeben.";
    }

    if(empty($message)){
        $formok = false;
        $errors[] = "Das Nachrichtenfeld ist leer.";
    }
    elseif(strlen($message) < 20){
        $formok = false;
        $errors[] = "Ihre Nachricht muss mindestens 20 Zeichen enthalten.";
    }

    if($formok){
        $headers = "From: {$email}" . "\r\n";
        $headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n";

        $emailbody = "<p><strong>Name: </strong> {$name} </p>
                      <p><strong>Website: </strong> {$website} </p>
                      <p><strong>Nachricht: </strong> {$message} </p>
                      <p>Diese Nachricht wurde am {$date} um {$time} über {$sender} gesendet.</p>";

        if($receiver){
            mail($receiver,"Anfrage ".$name,$emailbody,$headers);
        }
        else{
            mail('test@test.com',"Error",$emailbody,$headers);
        }
    }

    //what we need to return back to our form
    $returndata = array(
        'posted_form_data' => array(
            'name' => $name,
            'email' => $email,
            'website' => $website,
            'budget' => $budget,
            'message' => $message
        ),
        'form_ok' => $formok,
        'errors' => $errors
    );

    //if this is not an ajax request
    if(empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest'){
        //set session variables
        session_start();
        $_SESSION['cf_returndata'] = $returndata;

        //redirect back to form
        header('location: ' . $_SERVER['HTTP_REFERER']);
    }
}

【问题讨论】:

  • 您是在为联系表单使用插件,还是在后端编写 PHP 代码来处理表单?我建议您查看 Jetpack,因为它能够在您的页面上放置表单。
  • 不,我自己写的。

标签: php forms argument-passing


【解决方案1】:

将您的表单处理代码放在 Wordpress 页面模板中,然后您可以在后端表单代码中使用get_option('admin_email'),而无需在公共网页上公开它。

【讨论】:

    【解决方案2】:

    由于您知道接收方地址 - 您不应该传递它。 提交表单后 - 您可以使用后端 PHP 脚本将其发送给用户,而不会暴露给用户!

    【讨论】:

    • 我不能在 process.php 中使用 get_option。
    • get_option('admin_email') 从某个地方收到这封电子邮件,可能来自数据库。即使你不能调用它(你应该可以!)你可以直接从数据库中读取它。
    • 如果我添加 get_option 则不会发送表单。它卡在某个地方。我将在上面发布我的 process.php。
    • get_option() 定义在哪里?如果它在另一个文件中,你应该require/include
    • 它是一个内置的 wordpress 功能。我不知道如何或是否可以要求它。我认为这意味着我必须找出如何直接从数据库中获取变量...
    【解决方案3】:

    使用会话。当用户提交时,将数据发送到以下 SQL 查询,该查询将解析您的所有数据

    【讨论】:

    • 这是一个好主意,除非您需要让用户能够使用不同的数据打开相同的页面集。
    猜你喜欢
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2018-12-31
    • 2017-09-27
    • 1970-01-01
    • 2016-04-03
    相关资源
    最近更新 更多