Outlookが期待していないリクエストを送信する

 

こんにちは。
今年もAdvent Calendarに参加します。MPPAです。

自分的には今年一番の職務上で出会ってはまった事象を、
今回の記事に書きたいと思います。

👊目次👺

  1. 事象紹介
  2. 実際に試す環境づくり(AWS Lambda)
  3. 事象再現
  4. さいごに

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で作ればよかったと執筆後猛後悔。

hoge.html以外は受け付けないようにしています。
情報はhttp method とuser-agentくらい出力しておきます。

これを公開してブラウザからアクセスしてみます。

無事にアクセスできました。
ログも確認してみます。


無事に表示されてます。
というか、ここではGETしかアクセスが無かった事を確認しました。
(当たり前ですが)
これで準備は完了です。

3.事象再現

では、実際にアクセスしてみます。
あらかじめ仕込んでおいたメールを開きます。


メールのリンクをクリックして、アクセスしてみます。


ログを確認します。


HEADリクエストがある事が確認できました。

4.さいごに

なかなか、検証に時間がかかったものの、
内容的には「だから?」という内容に落ち着いてしまいました。

本当は、

 Outlookのリンクをクリックすると20秒後に裏でリンクにアクセスされてしまう

というビッグなニュースをお伝えする予定でしたが、現状ではなぜか発生しなくなってしまいました。(検証前に実際に起きていた環境でも確認)

ですが、興味を持って、業務外に改めて自分で環境を作成できるし、検証を行うことこそ、
今後の技術向上につながると信じております。

ただ、このHEADリクエスト。
コンテンツを返さないだけでGETメソッドと同じようにサーバーは処理します。(すべきというほうが正しいか)
用途としては、
 ・リソースの存在確認
 ・リソースの最終更新日時の取得
 ・コンテンツネゴシエーション(Accept ヘッダーなど)
 ・リソースの変更の有無の確認(条件付きリクエスト)
があるらしいですが、古いOutlookが何を確認しようとしていたかは結局わからないままです。

それではまた。

コメント

このブログの人気の投稿

ProxmoxでLet's Encryptを使用した証明書セットアップをやってみた

AIと共に「考える」エンジニアに!

ルーティングって何で必要で、何してるの?を React Routerで理解する