Outlookが期待していないリクエストを送信する
こんにちは。
今年もAdvent Calendarに参加します。MPPAです。
自分的には今年一番の職務上で出会ってはまった事象を、
今回の記事に書きたいと思います。
👊目次👺
- 事象紹介
- 実際に試す環境づくり(AWS Lambda)
- 事象再現
- さいごに
1.事象紹介:Outlookの謎通信
メールによくリンクが張ってありますが、これをOutlookでクリックして、
ブラウザで開くと以下のようなアクセスが行われていることがわかりました。
・メールのリンクをクリックする
・まずHEADリクエストがサーバーに送信される。← 期待してない
・続いてブラウザが開いてリンクにアクセスする。
赤字の部分が、サーバー側というかコーディングしている上では予期せぬ動きで、
作成時にデバッグ、単体テストを実施しているときは全く気づきませんでした。
今回はパスワードリセットのメールで、リンクをクリックするとパスワードが初期化されるというものでしたので、皆メールのリンクをクリックするはずです。
色々調べてみたのですが、このような仕様がOutlookにあるなんていうのはどこにも見当たらず。。。
ちなみに環境は
サーバー:GCP(Google Cloud) CroudRun関数
言語:Python
クライアント:Windows 11
メーラー:Outlook デスクトップアプリ(Classic)
です。OutlookのWebアプリや最新のOutlook(new)では事象は発生しないようです。
2.実際に試す環境づくり(AWS Lambda)
では、実際に環境を作成してきます。
用意するものは簡単です。
複雑なアプリケーションを作る必要はなく、受け口を作っておけばいいのです。
というわけで、AWS Lambdaを利用してHello Worldとでも返すコンテンツを作成します。
Lambdaで関数の作成を選んで、行きます。
ここ半年で猛烈に学習したPythonで「hello_lambda」を作成します。
コードはこんな感じにしておきましょう。
import json
def lambda_handler(event, context):
http_method = event["requestContext"]["http"]["method"]
request_path = event["requestContext"]["http"]["path"]
user_agent = ''
# Getならuser_agentを設定
if http_method == 'GET':
user_agent = event["requestContext"]["http"]["userAgent"]
# 除外
if request_path != "/hoge.html":
return {
'statusCode': 404,
}
print('http method -> ' + http_method)
print('request path -> ' + request_path)
print('user-agent -> ' + user_agent)
return {
'statusCode': 200,
"headers": {
"Content-Type": "text/json"
},
'body': json.dumps('Hello from Lambda!')
}
※元々GCPのCloud Run 関数で作ってたせいか、AWS Lambdaで思わぬ苦戦。
これならnode.jsで作ればよかったと執筆後猛後悔。
これならnode.jsで作ればよかったと執筆後猛後悔。
hoge.html以外は受け付けないようにしています。
情報はhttp method とuser-agentくらい出力しておきます。
これを公開してブラウザからアクセスしてみます。
無事にアクセスできました。
ログも確認してみます。
無事に表示されてます。
というか、ここではGETしかアクセスが無かった事を確認しました。
(当たり前ですが)
これで準備は完了です。
3.事象再現
では、実際にアクセスしてみます。
あらかじめ仕込んでおいたメールを開きます。
4.さいごに
なかなか、検証に時間がかかったものの、
内容的には「だから?」という内容に落ち着いてしまいました。
本当は、
Outlookのリンクをクリックすると20秒後に裏でリンクにアクセスされてしまう
というビッグなニュースをお伝えする予定でしたが、現状ではなぜか発生しなくなってしまいました。(検証前に実際に起きていた環境でも確認)
ですが、興味を持って、業務外に改めて自分で環境を作成できるし、検証を行うことこそ、
今後の技術向上につながると信じております。
ただ、このHEADリクエスト。
コンテンツを返さないだけでGETメソッドと同じようにサーバーは処理します。(すべきというほうが正しいか)
用途としては、
コンテンツを返さないだけでGETメソッドと同じようにサーバーは処理します。(すべきというほうが正しいか)
用途としては、
・リソースの存在確認
・リソースの最終更新日時の取得
・コンテンツネゴシエーション(Accept ヘッダーなど)
・リソースの変更の有無の確認(条件付きリクエスト)
があるらしいですが、古いOutlookが何を確認しようとしていたかは結局わからないままです。
それではまた。






コメント
コメントを投稿