独自実装のお問合せフォームは狙われる
AWSのSESを使ってサービスを構築していたら、スパムメールが大量に届くという苦情がきました。このままだとサービス停止するという内容です。
怖いですね。AWSから脅迫されているようですw
サービスが複数立ち上がっているので、それぞれソースコードを見てみると、うん、これは狙われるね、っていうコーディングでした。
FormタグのActionにURLが指定されていました。
なぜ、Actionが指定されているとだめなのか、この理由がわからない人は、要注意です。
スパム送信者の気持ちになる
スパムメールの送信者の気持ちになって考える必要があります。敵を知る、ですね。
AWS SESを使った構築においての注意点
※SESに限ったことではありません
AWS SES(Amazon Simple Email Service)を使ってメール送信サービスを構築する際には、特にフォームのセキュリティに注意が必要です。フォームタグのaction属性にURLが指定されている場合、スパムメールの問題が発生する背景には、いくつかの理由が考えられます。これを理解するためには、スパム送信者の視点から考えることが有効です。
スパム送信者の動機とターゲットの選び方
自動化とスケーリング
スパム送信者は、できるだけ多くのメールを短時間で送信しようとします。彼らは自動化されたツールを用いて、インターネット上で公開されているフォームを探索します。フォームのaction属性に外部のURL(スパム送信者がコントロールするサーバーのURLなど)が指定されていると、そのフォームを利用してスパムやフィッシング攻撃を仕掛けてきます。
脆弱性の悪用
一部のフォームは、送信されたデータの検証を十分に行っていない場合があります。スパム送信者はこれを利用して、スクリプトを埋め込むことでクロスサイトスクリプティング(XSS)攻撃を行ったり、SQLインジェクションを通じてデータベースに不正アクセスを試みたりします。
信用の悪用
合法的なサービスのフォームを模倣することで、ユーザーが信用して情報を入力することを狙います。この方法で、個人情報やクレジットカード情報などの重要なデータを不正に収集することが目的です。
解決策
検証とフィルタリング
フォームに入力されたデータはサーバーサイドで必ず検証し、不正な入力やスクリプトが含まれていないかチェックする必要があります。
CAPTCHAの利用
フォーム送信時にCAPTCHAを使用することで、自動化ツールによる悪意ある利用を阻止できます。
HTTPSの強制
フォームデータの送信はHTTPSを通じて行うことで、中間者攻撃によるデータの盗聴を防ぐことができます。
以上のように、フォームのaction属性に外部URLを設定することがスパムやフィッシングに悪用されることは十分考えられるため、これを防ぐための対策が重要です。
そもそもわからなかったら独自実装しない
wordpressのプラグインでお問い合わせフォームは、contact form 7 が有名です。こういう有名なのを使っていれば心配ない(というのは、作者がしっかり対応してくれる)。
スパム対策 jquery氏による
スパム対策として、jqueryを使って作ってみます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>フォーム送信例</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
<form id="myForm">
<input type="text" name="username" placeholder="ユーザー名">
<input type="password" name="password" placeholder="パスワード">
<button type="submit" id="submitButton">送信</button>
</form>
<script>
$(document).ready(function() {
$('#submitButton').click(function(event) {
event.preventDefault(); // 通常のフォーム送信をキャンセル
var form = $('#myForm');
form.attr('action', 'https://yourserver.com/submit'); // ここに正しいアクションを設定
form.submit(); // フォームをプログラム的に送信
});
});
</script>
</body>
</html>
解説
この例では、フォームのaction属性は初めに設定されていません。
ユーザーが「送信」ボタンをクリックすると、jQueryスクリプトがaction属性を動的に設定してからフォームを送信します。
event.preventDefault() を使用して、ボタンクリックによる通常のフォーム送信をキャンセルしています。これにより、JavaScriptが無効な場合にはフォームは送信されません。
この方法は、ページロード時にaction属性が明らかでないため、自動的なスクリプトによる悪意あるフォームの送信を防ぐのに役立ちます。