質問: 現在、静的ページにお問い合わせフォームを導入(埋め込み)しようと考えています。 事前の計画ではPHPで自作することを考えていたのですが、XSSやCSRFといったセキュリティの問題に自分の知識では対応できそうになかったので、今回は「MicroEngine Mailform」を利用することにしました。 しかし、実際にライブラリの中身を確認してみると、MicroEngine Mailformでは付属のindex.phpを基軸として入力・確認・送信が行われているようで、埋め込むというよりも静的ページから遷移させて単体で動作させることを前提としているようでした。 そこで、 1、MicroEngine Mailformの推奨通り、静的ページではお問い合わせフォームへのリンクのみとし、遷移先でindex.phpを動かす。 ー>今回の目標は静的ページへの埋め込みなので、なんとか静的ページで入力させるようにしたい。 2、MicroEngine Mailformのテンプレート入力ページを対象の静的ページにすり替える。 ー>index.htmlがライブラリの奥深くに配置されることによってサイト構造が難しくなる。 3、別のフォームを導入する ー>自分が調べた限りではMicroEngine Mailformがセキュリティ面で一番しっかりしているようなので、できれば変更したくない。 と色々と考えた結果、最終的に「静的ページにMicroEngine Mailformをiframeで埋め込むという方法しかないのでは...?」と考えるようになりました。 ただ「セキュリティ面を考えてライブラリを導入したのにiframeで埋め込んだために別の問題が出てくるのでは本末転倒」ということで今回の質問内容が思い浮かび、teratailで質問させていただきました。 当方の知識不足で招いた問題ですが、ご回答いただけますと幸いです。
回答: iframeを使うことによる重大な問題はないと思いますが、さりとて、iframeを使う方法が良いかといえば、あまり良いとは言えません。 #### ユーザーを騙すことになる ウェブの入力画面がどのドメインで動いているかは重要です。入力した内容がどのサイトに送られるかという指標になるからです。iframeを使うと、見た目上は、アドレスバーと異なるドメインにユーザー入力が送られるので良くありません。 この問題を緩和するには、画面上のどこかに、「この入力フォームはMicroEngine Mailform を用いており、お客様の入力内容もMicroEngine Mailformに送信されます」と注意書きを書いておくとよいでしょう。 #### 脆弱性の原因になる可能性 入力フォームを罠サイトのiframeの中に入れることによる攻撃があります。代表的なものがクリックジャッキングです。クリックジャッキングについては以下を参照ください。 IPAテクニカルウォッチ 知らぬ間にプライバシー情報の非公開設定を公開設定に変更されてしまうなどの『クリックジャッキング』に関するレポート それでは、ご質問の入力フォームがクリックジャッキング脆弱かというと、そうとは限りません。要は「ユーザーの知らないうちに『クリックさせられていた』場合にどこまで悪いことが起こるか?」が問題となり、ログインのないサイトであれば、重大なことまでは発生しないことが多いです。 問題が起きそうな例を一つ紹介します。世論調査をネットで実施するフォームを作成したとします。クリックジャッキングを使うと、罠のサイトを見た利用者が、意図とは違う候補を選んでしまうということができます。攻撃者が自分で世論調査操作サイトに入力した場合と異なり、一般の方がクリックしているわけですから、不正操作を見抜くことが極めて困難になります。 難しいですか? 多分難しいですよね。なので、上記のようなことは理解できなくても、以下のレスポンスヘッダを常に送信することが推奨されています。 ``` X-Frame-Options: sameorigin ``` これを送信すると、この画面は、**異なるドメイン(オリジン)のページのiframeに入れることができなくなります**。 一方、GoogleフォームやYoutubeの動画はiframeに入れることができますが、こちらは敢えてX-Frame-Optionsを生成せず、iframeに入ることを許容しているわけです。これらはGoogleが提供するものなので、クリックジャッキング等のリスクは熟知した上で、問題ないと判断している、あるいは問題ないように実装しているのでしょう。 結論としては、iframeを使うことによるリスクは通常は大きくないが、クリックジャッキング等の問題があり、それが判断できないのであれば、iframeを使わない(X-Frame-Optionsを使う)ことが望ましい、ということになります。 MicroEngine MailformはX-Frame-Optionsを出しておらず、だからiframeに入れることができるわけですが、仮にMicroEngine Mailformを使う場合でも、推奨通り以下の使い方をすることをおすすめします。 > > 1、MicroEngine Mailformの推奨通り、静的ページではお問い合わせフォームへのリンクのみとし、遷移先でindex.phpを動かす。 > > >