【问题标题】:Is this form safe?这种形式安全吗?
【发布时间】:2012-09-01 03:51:19
【问题描述】:

我有这个表格,用户可以通过该表格向我发送电子邮件。我不知道它是否安全,或者是否只有在涉及 sql 时才会出现安全问题...

html:

<form id="form4" action="send_mic.php"  name="form4" method="post" >

           <textarea name="message4" cols="4" rows="4"  id="message4" ></textarea><br />

           <input type="text"  id="name4" name="name4" value="" /><br />

           <input type="text"  id="email4" name="email4" value=""  /><br />

          <input type="submit" value="" id="submit" />

</form>

jquery:

<script type="text/javascript">
$(document).ready(function () {
    $('#form4').ajaxForm({
        beforeSubmit: validate
    });

    function validate(formData, jqForm, options) {
        var name = $('input[name=name4]').fieldValue();
        var email = $('input[name=email4]').fieldValue();
        var message = $('textarea[name=message4]').fieldValue();

        if (!name[0]) {
            alert('Please enter a value for name');
            return false;
        }
        if (!email[0]) {
            alert('Please enter a value for email');
            return false;
        }
        if (!message[0]) {
            alert('Please enter a value for message');
            return false;
        }

        else {

        $("#content").fadeOut(1000, function () {
            $(this).html("<img src='images/postauto3.png'/>").fadeIn(2000);
        });

        var message = $('textarea[name=message4]').val('');
        var name = $('input[name=name4]').val('');
        var email = $('input[name=email4]').val('');

            } 
    }

});



    </script> 

php:

<?php
        if($_POST){
                $email = $_POST['email4'];
                $name = $_POST ['name4'];
                $message = $_POST ['message4'];
                // response hash
                $ajaxresponse = array('type'=>'', 'message4'=>'');

                try {
                        // do some sort of data validations, very simple example below
                        $all_fields = array('name4', 'email4', 'message4');

                        foreach($all_fields as $field){
                                if(empty($_POST[$field])){
                                        throw new Exception('Required field "'.ucfirst($field).'" missing input.');
                                }
                        }

                        // ok, if field validations are ok
                        // now Send Email, ect.

                        // let's assume everything is ok, setup successful response
                        $subject = "New Contact";
                        //get todays date
                        $todayis = date("l, F j, Y, g:i a") ;

                        $message = " $todayis \n
                        Attention: \n\n
                        Please see the message below: \n\n
                        Email Address: $email \n\n
                        Message: $message \n\n

                        ";

                        $from = "From: $email\r\n";


                        //put your email address here
                        mail("contact@....ro", $subject, $message, $from);

                        //prep json response
                        $ajaxresponse['type'] = 'success';
                        $ajaxresponse['message'] = 'Thank You! Will be in touch soon';  
                } catch(Exception $e){
                        $ajaxresponse['type'] = 'error';
                        $ajaxresponse['message'] = $e->getMessage();
                }
                // now we are ready to turn this hash into JSON
                print json_encode($ajaxresponse);
                exit;
        }
?>

那么,在使用表单发送电子邮件时,是否存在安全问题?这个可以吗? 谢谢!

【问题讨论】:

  • 您可能会考虑使用filter_var 功能来检查发送的电子邮件(并对其进行清理),检查发送的电子邮件是否不是垃圾邮件,但在最坏的情况下,您可能无法回复此联系人
  • 我记得在某处读过有关确保添加一些检查以确保没有人将 cc 和 bcc 字段注入邮件标头的内容。如果他们这样做了,那么他们就可以通过您的网络表单向他们希望的任何人发送电子邮件。

标签: php jquery html forms security


【解决方案1】:

一般来说,经验法则应该始终是:永远不要相信用户提供的数据。不,您的代码不是防弹的。由于您不验证也不清理用户输入并且同时使用mail(),因此您很容易受到攻击。用户可以轻松地为您提供 email4 提交的精心制作的价值。由于您直接使用表单数据,因此可以使用 email4 向您的外发邮件注入额外的邮件标题。如果这些标头是BCC:CC: 甚至TO:,那么您将只是充当垃圾邮件中继。例如,如果我发布这个

some@address.com
CC: spamvictim1@foo.com, spamvictim2@foo.com, spamvictim3@foo.com,
X-Spam-Owned: Whoa

作为您的email4,那么您的标题将如下所示:

To: some@address.com
CC: spamvictim1@foo.com, spamvictim2@foo.com, spamvictim3@foo.com, 
X-Spam-Owned: Whoa

要发布多行数据,您只需使用 CRLF 粘贴文本。

为了避免这样的安全漏洞,您应该考虑删除 mail() 并使用更聪明的东西来处理这样的事情(并不是说 mail() 不好,但您需要知道自己在做什么是低级而不是高级功能)。我建议使用 PHPMailer 或类似的包。您应该始终验证用户提供的数据(特别是确保单行字段,如主题是真正的单行 - 剥离 CRLF 就足够了)。在您对自动提交表单开放时添加验证码。

【讨论】:

    【解决方案2】:
    1. 您可以添加验证码以防止垃圾邮件。
    2. 您可以使用以下方法防止电子邮件注入:

      filter_var($email, FILTER_VALIDATE_EMAIL)

    【讨论】:

    • 我应该在哪里添加这行代码? $all_fields = array('name4', 'email4', 'message4');没事吧?
    • 毕竟所有领域都很好。事实上,我推荐它,因为您需要确保在尝试验证之前收到电子邮件 POST 字段。
    • 这样可以防止我向他人发送垃圾邮件?就像这里的人说的那样..
    • 它将防止电子邮件注入(人们抄送等)。它不能防止垃圾邮件。只有验证码才能帮助减轻垃圾邮件的影响。
    【解决方案3】:

    我认为这个表格是安全的,这意味着没有人可以通过这个表格真正h@ck你的网站。
    但是您需要添加一些东西以获得更好的结果: 1.你还应该检查php服务器端的post变量,意思是你应该检查email/name/message是否有效
    2.您应该添加一些验证码以防止垃圾邮件

    【讨论】:

      【解决方案4】:

      您还可以使用

      包装您的服务器端代码
      if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
        /* special ajax here */
        die($content);
      }
      

      这将确保 ajax 请求到达服务器。

      请注意您在问题中的一个 jQuery 选择器中使用的 ID。

      【讨论】:

        【解决方案5】:

        即使您不使用数据库,电子邮件发送也可能存在安全问题。当然你不能被这个表单入侵,但是当用户在电子邮件字段中输入这样的内容时就会出现问题:

        email-address1@example.com  // there is a new line here
        CC:email-address2@example.com,email-addresses3@example.com,.............................email-addressesn@example.com
        

        因此,您能做的最好的事情就是清理邮件功能的所有输入字段,以防止此类垃圾邮件传递。正如@WebnetMobile.com 已经伤心的那样,永远不要相信用户输入

        【讨论】:

          【解决方案6】:

          我没有看到其中的安全问题,因为您没有在服务器端修改任何内容。不过可能是垃圾邮件的问题。添加一些验证码。其余的看起来还可以。

          【讨论】:

          • 那么电子邮件注入呢?
          【解决方案7】:

          您应该在表单中添加验证码、客户端和服务器端验证

          【讨论】:

            猜你喜欢
            • 2011-06-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多