2

ユーザーが私にメールを送信するこのフォームがあります。それがセキュリティで保護されているかどうか、または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;
        }
?>

では、フォームを使用してメールを送信するときにセキュリティ上の問題はありますか?これでいい?ありがとう!

4

7 に答える 7

6

一般に、経験則は常に次のようになります。ユーザーが提供したデータを絶対に信頼しないでください。いいえ、あなたのコードは防弾ではありません。ユーザー入力を検証またはサニタイズせず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を削除するだけで十分です)。自動フォーム送信を利用できるようになったら、キャプチャを追加します。

于 2012-09-07T09:19:08.920 に答える
4
  1. スパムを防ぐためにキャプチャを追加できます。
  2. 次を使用して、電子メールの挿入から保護することができます。

    filter_var($ email、FILTER_VALIDATE_EMAIL)

于 2012-09-07T09:19:49.287 に答える
1

このフォームは安全だと思います。つまり、このフォームを介してWebサイトを実際に操作することはできません。
ただし、より良い結果を得るには、何かを追加する必要があります。1. phpサーバー側のpost変数も確認する必要があります。つまり、メール/名前/メッセージが有効でないかどうかを確認する必要があります
。2。スパムを防ぐためにキャプチャを追加する必要があります。

于 2012-09-07T09:16:59.587 に答える
1

さらに、サーバー側のコードを次のようにラップできます。

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
  /* special ajax here */
  die($content);
}

これにより、ajaxリクエストがサーバーに確実に届きます。

また、質問のjQueryセレクターの1つで使用しているIDに注意してください。

于 2012-09-07T09:19:58.600 に答える
1

データベースを使用していない場合でも、電子メールの送信にセキュリティ上の問題がある可能性があります。もちろん、このフォームでハッキングすることはできませんが、ユーザーが電子メールフィールドに次のようなものを入力すると問題が発生します。

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はすでに悲しいので、ユーザー入力を決して信用しないでください

于 2012-09-07T09:20:20.717 に答える
0

フォームにキャプチャ、クライアント側、サーバー側の検証を追加する必要があります

于 2012-09-07T12:23:47.543 に答える
0

サーバー側で何も変更していないため、セキュリティの問題は発生していません。ただし、スパムの問題である可能性があります。それにキャプチャを追加します。残りは大丈夫そうです。

于 2012-09-07T09:15:10.030 に答える