javascriptと連携したフォーム送信

このQ&Aのポイント
  • フォーム送信(メールフォーム)に関する質問です。フォームの入力チェックをJavascirptのバリデータライブラリで行い送信だけPHPを使用するというタイプのメールフォーム作成を考えています。
  • 必須入力、正規表現によるチェックなどをJavascript側で行い、PHPではPOSTされた値を受け取って変換し、メール関数に渡す方法を検討しています。
  • また、Javascriptの無効状態による送信については、hiddenかクッキーを使用して有効無効を判断し、無効状態での送信をエラーとする方法を考えています。
回答を見る
  • ベストアンサー

javascriptと連携したフォーム送信

フォーム送信(メールフォーム)に関する質問です。 フォームの入力チェックをJavascirptのバリデータライブラリで行い 送信だけPHPを使用するというタイプのメールフォーム作成を考えています。 必須入力、正規表現によるチェックなどをJavascript側でやるので ・PHPではPOSTされた値を受け取って、htmlspecialchars・mb_ereg_replaceあたりで変換した後メール関数に渡す。値がなければエラー これでいいんじゃないかと思うのですが、甘いでしょうか? javascriptの無効状態による送信は、 ・Javascriptでhiddenかクッキーを出して、有効無効を判断 (hiddenのvalueかクッキーがPHPで受け取れなければJavascript無効状態での送信としてエラー) を考えています。 ご意見よろしくお願いします。

  • PHP
  • 回答数3
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.3

JavaScriptでチェックするというのは、POST前に不備がわかるので間違ったときの余計な待ちがないというインタフェイスの問題だけですね。ANo.2さんが書かれたように、phpでも同じチェックをするのが基本です。 >保存されたらどんなプログラムもハックできてしまうのでは? それを考えて「POSTされるデータはアテにしない」のが普通です。どんなおかしなデータがPOSTされるかわからないという前提でチェックします。 >たしかにjavascriptのコード送ってもメールじゃ動かないですが >HTMLメールになったりするのでは、と思ってしまいます htmlメールがどういう仕組みになっているか、一度「生のメールデータ」を読んでみることをお勧めします。mb_send_mailでhtmlメールが送れない理由がわかると思います。

tenderfeel
質問者

お礼

お礼が遅れました。 javascriptのバリデータはおまけとして、PHP側で色々チェックをするように作ることにしました。 アドバイスありがとうございました。

tenderfeel
質問者

補足

確かにそうです<インタフェイスの問題だけ 利便性優先でセキュリティゆるゆるって例を晒しましたね…。 以後気をつけたいと思います。 >htmlメールがどういう仕組みになっているか~ アドバイスありがとうございます。確認してみます。

その他の回答 (2)

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.2

なんだかんだ工夫してJavaScriptでvalidateしても、結局はPHP側でも同じvalidateかけないと駄目ですよ 表示されたサイトのHTMLとJavaScriptを保存して、解読して強制的にPHPに悪意ある値をPOSTするように改変すれば、簡単にハッキングされてしまう可能性はありますよ。 メールを送信するのであれば、簡単にメールヘッダーインジェクションされてしまいます しかも htmlspecialchars を使ってなにをするんでしょう? HTMLのタグや特殊文字を排除したところでメールにはなんにも関係ないですよ HTMLで悪意あるコードの排除するためのものであって、メールに関してはなんにもしてくれません。 hiddenだろうとcookieだろうと、結局は閲覧している人のパソコン内でどうとでも改変できますし、だますような値を送りつけることも可能です

tenderfeel
質問者

お礼

htmlspecialcharsは確認画面表示するので結局つけることにしました。 でもデコードでver4系だとエラーが出てしまうのですね…難しいです。 アドバイスありがとうございました。

tenderfeel
質問者

補足

>結局はPHP側でも同じvalidateかけないと駄目 やはり甘かったようですね。質問してよかったです。 ローカル保存は頭に無かったのですが、保存されたらどんなプログラムもハックできてしまうのでは? そこでセッションなんでしょうか… 安全性に何が有効なのかがいまいち理解出来ません…。 htmlspecialcharsは参考に見たメール送信プログラムによく付けられてたからなのですが メール送信ではなくてもいいのでしょうか? たしかにjavascriptのコード送ってもメールじゃ動かないですが HTMLメールになったりするのでは、と思ってしまいます

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

#JavaScriptが無効になっている環境は切捨てということですか? 甘いというか「hiddenで渡した値でチェック」などはローカル保存されたhtmlからでもPOSTを許可することになるのでは?もちろんこの意味ではCookieでもじゅうぶんではないです。 チェックが必要なものであれば「JavaScriptでだけチェック」ということはあり得ません。phpスクリプトでも同様のチェックを必ず行います。ほとんどのケースでは無駄なチェックですが、この無駄を省いてはいけません。

tenderfeel
質問者

補足

あ、言われてみれば確かにそうですね…<ローカル保存 PHPでこれは絶対入れた方がいいというチェックはありますか?

関連するQ&A

  • お問合せフォームのセキュリティについて

    PHP初心者です。 ようやく簡単なお問合せフォームを作る事ができました。 ですがセキュリティの面で不安がありませすので、ご質問させていただきます。 1. contact.html(入力フォームを表示) <form action="kakunin.php" method="post"> method="POST"で kakunin.php に値を渡してます。 2. kakunin.php(入力内容の確認やエラーを表示) $_SERVER["REQUEST_METHOD"] == "POST"でフォームの値を取得して、 input type="hidden"を使用して値を受け渡してます。 入力内容表示のフォームは <form method="POST" action="mail.php"> この時フォームでの表示は <td><?php echo $name ?></td> としているのですが、 これを、 <td><?php echo htmlspecialchars($name) ?></td> にした方がいいのでしょうか? 3 mail.php(入力内容をメールで送信) $_SERVER["REQUEST_METHOD"] == "POST"でフォームの値を取得して、 mb_send_mailで送信しています。 このようにして、フォームを作りましたが、 セキュリティの観点から見て注意しなければならない事は何でしょうか? 作り方に問題ありでしょうか? 駄文で失礼します。宜しくお願い致します。

    • 締切済み
    • PHP
  • フォーム入力チェックはCGI(サーバ)で行う必要がありますか?

    漠然と思ったのですが、HTMLの入力フォーム値のチェックをCGIでは行わずに、Javascriptのみで済ませる方法はないでしょうか? Javascirptだけでチェックできればサーバ側の言語が、Perl、PHP、JSPのどれであっても同じ入力チェックを使えるので楽だなぁと思いました。 ただ、JavascriptをOFFにして直接URLに値を埋め込んだ場合、入力チェックを素通りしてしまいます。 Javascriptの有無をサーバ側で判定は不可能?な為、やはりサーバ側で入力チェックを行うしかないでしょうか? よろしくお願いします。

    • 締切済み
    • CGI
  • JAVASCRIPTで送信フォームを作っています

    JAVASCRIPTで送信フォームを作っています。 ラジオボタンだけが値をだしてくれません。 なにか方法はあるのでしょうか。 アンケートにつかいます。 各項目を答えるごとに裏でテキスト化されて最終的に一括送信できるようにします。

  • 送信フォームから受け取った情報を反映させたい

    PHP4を使用しています。 送信フォーム.html→確認ページ.php であれば、受け取った情報を簡単に変数に取り込んでくれます。 しかし、送信フォームのチェックを行うために、 制御.phpというものをつくります。 送信フォーム.html→制御.phpという状態に して(form actionの行き先)、 制御.phpで確認ページ.phpを読み込んで表示させるというものをつくろうとしています。 これをすると、 確認ページ.phpの読み込みはきっちり行われます。しかし、送信フォーム.htmlで入力してもらった内容が確認ページ.phpに取り込まれません。 hiddenなどを使用してもうまくいきません perlではできたんですが・・・やっぱりphp では難しいものなんでしょうか?

    • ベストアンサー
    • PHP
  • PHPとJavascriptの連携について質問です。

    PHPとJavascriptの連携について質問です。 複数の入り口(HTML)から一つのお問い合わせフォーム(PHP)へ繋げるにあたって、 今Javascriptで、各HTMLページのタイトルをフォームへ表示させることはできたんですが、 それをPHPのメールフォームで書き出す方法がわかりません。 HTML内のJavascriptは以下のとおりです。 <script type="text/javascript"><!-- var cnm = CourseRead(); document.write(cnm); document.write("<input type=hidden name=torikomi value='"+cnm+"' >"); //--> </script> 以下の様にlistで各タイトルがふってあります。 list[0] = "タイトル"; list[1] = "タイトル"; お問い合わせのメールが届いた時に、どのページからのお問い合わせなのかが メール上で分かるようにしたいです。 ちなみに、見よう見まねでやっていて、 JavascriptもPHPも、ほぼ知識がない状態です。 教えてください!

    • 締切済み
    • PHP
  • Javascript有効時のみ表示

    メールフォームの入力チェックでJavascriptを使っています。 単刀直入で申し訳ありませんが、 Javascriptが有効な場合のみ送信ボタンを表示させることは可能でしょうか? (無効な場合は送信ボタンが出ないようにしたいです。) スプリクトのサンプルページやわかる方がおられたら教えてください。

  • swich文を使ったメールフォームの作成について。

    <?php // Error indicate. $error_msg = '未入力...'; /*--- Form mode ---*/ $mode = isset($_POST["mode"]) ? htmlspecialchars($_POST["mode"]) : "input"; /*--- 入力項目 ---*/ $mail = (isset($_POST["mail"]) && $_POST["mail"]!=$error_msg) ? htmlspecialchars($_POST["mail"]) : ""; switch ($mode) { /*--- 入力画面 ---*/ case 'input': echo' <html> <body> <form enctype="multipart/form-data" action="inquiry.php" method="post"> <input type="hidden" name="mode" value="check" /> <div>* メールアドレス<input name="mail" type="text" value="'.$mail.'" size="" /></div> <div><input type="submit" value="確認する" /></div> </form> </body> </html> '; break; /*--- 入力チェック画面 ---*/ case 'check': //----------------------------------------- // 入力チェック。 //----------------------------------------- //User Mail. if ($mail == "") {//未入力処理。 $mail ='<font color="red">'.$error_msg.'</font>'; $error = 1; } else if ( ereg("^[^@]+@[^.]+\..+", $mail) == false ){//書式処理。 $mail ='メールアドレスの書式が正しくありません。'; $error = 1; } else { $mail = $_POST["mail"]; } if ($mail != "") {// 全角を半角に。 $mail = mb_convert_kana($_POST["mail"], "a", "utf-8"); } echo' <html> <body> <h1>ご入力内容をご確認してください。</h1> <div>* メールアドレス<br />'.$mail.'</div> '; /*--- 未入力画面 ---*/ if($error == 1) { echo' <div> <form action="inquiry.php" method="post"> <input type="hidden" name="mode" value="input" /> <input type="hidden" name="mail" value="'.$mail.'" /> <input type="submit" value="戻る" /> </form> </div> </body> </html> '; } /*--- 送信可能画面 ---*/ if($error == 0) { echo' <form action="inquiry.php" method="post"> <input type="hidden" name="mode" value="send" /> <input type="hidden" name="mail" value="'.$mail.'" /> <input type="submit" value="送信" /> </form> <form action="inquiry.php" method="post"> <input type="hidden" name="mail" value="'.$mail.'" /> <input type="submit" value="戻る"> </form> </body> </html> '; } /*--- 送信画面 --*/ case 'send': } /* swich文を中心にメールフォームを作っています。 入力画面で「$mail」には、入力内容、未入力の場合、エラー文が代入されます。 再び、入力画面に戻ると、当然ですが、入力欄には、エラー文が表示されてしまいます。 $mailを空にして入力画面に戻せば良いのですが、正しい入力や多少のミス入力した場合等、 ユーザが入力した値を、入力欄に戻したいと思っています。 どのような処理をすれば良いのでしょうか? 皆様、ご回答の方、どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • JavaScriptでフォームへのフォーカス処理

    PHP、XHTML、CSSで応募フォームの作成をしております。 PHPとHTMLは別ファイルで作成しており、PHPにアクセスしてそのPHPが指定されたテンプレートを読みにいくような流れとなっております。 HTMLもPHPも完成して、応募フォームとして一通り動くようになったのですが、新たにフォーカス機能を追加したいということになりました。 具体的には、応募フォームの一番最初のテキストエリアに、ページ読み込み時にフォーカスを当てたいという内容です。 そこで、フォーカス機能用のJavaScriptを別ファイルで新たに作成し、動きを確認してみたところ上手く動きません。 HTMLとJavaScriptのソースは下記の通りです。 ==================================================================== ■HTML(全て書くと長くなってしまうので、簡略させていただきます) <script type="text/javascript" src="$path_top_js/focus.js"></script> <body onLoad="Focus()"> </head> <form name="top" action="index.php" method="POST" onReset="return false;" onSubmit="return false;"> <input type="hidden" name="USER_ID" value="$USER_ID"> <INPUT size="20" type="text" name="USER_ID" value="$USER_ID" MAXLENGTH="10"> </form> </body> ■JavaScript(focus.js) function Focus(){ document.top.USER_ID.focus(); } ==================================================================== 「フォームのname="USER_ID"というテキストエリアにフォーカスを当てる」という内容になります。 なぜフォーカスが当たらないのか、原因は予想がつくのですが、どう解決していいのか分かりません。 多分、フォームの値を保持するために記述しているhiddenタグ <input type="hidden" name="USER_ID" value="$USER_ID"> にJavaScriptのフォーカスが当たってしまっているみたいです。(フォーカスが当たっていると思われるhiddenタグは見ることができません) 試しにhiddenタグを外してみたところ、JavaScriptで指定したテキストエリアにフォーカスが当たっていることを確認しました。 「応募フォーム」ということで、ページ遷移した際にもフォームに入力した値を保持しておくためにhiddenタグは外したくないのですが、フォーカス機能もちゃんと動くようにしたいと思っております。 解決方法が分かる方いらっしゃいましたら、ご教授の程お願い致します。

    • ベストアンサー
    • HTML
  • メールフォームの重複送信の制限の処理を教えてください。

    メールフォームをPHP4で作成している最中なのですが、最後に、メールフォームで同じパソコンから何度も送信ボタンをクリックして、メールを送信されないようにしたいと思っています。 ですが、初心者のため、良い方法が思いつかず、検索してもピンとくるものがなく、煮詰まっています。(クッキーやJavascriptなどを利用せずにできないものかと・・・) 1日のうち同じPCから10回まで続けて送信OK、日付が変われば、送信できるようになるというような処理が出来ないものか考えています。 上記のような処理に限らず、悪意のあるメールの重複送信に対して行う、PHPのスクリプトだけですむ、一般的な処理について教えていただければうれしいです。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • メール送信フォーム

    mb_send_mail($to, $subject, $message, $from); でフォームのメール送信を作ったのですが、(エラーはでません)メールが送信されません。PHPのバージョンは4.23 HTMLでは <FORM METHOD="POST" ACTION="send.php" ENCTYPE="text/plain"> <input type="hidden" name="subject" value="質問"> </FORM> 省略 send.phpでは <?php mb_language("ja"); mb_send_mail($mail, $subject, $message, $from); ?> どこがおかしいのかわかりません? なにかヒントをいただけますか?

    • 締切済み
    • PHP

専門家に質問してみよう