コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

異なる環境間で現在時間を受け渡して判定するときに気をつけること

端末時間とサーバー時間に関して色々思うことがあったので、考えをアウトプットするだけの雑記です。

今回考えるシチュエーション

異なる環境から時間情報を受け渡すということを考える。登場人物としては「送信元」と「送信先」があるが、例としては以下のようなシチュエーション。

気をつけること

タイムゾーン

いわずもがな 2019-8-1 10:00:00 という形式で時間情報を渡すとタイムゾーンが欠落するため、正確な時間の受け渡しは行えない。もし行う場合はエポック秒(1533085200)や、小数点を表現する場合はISO 8601フォーマット(2018-08-01T10:00:00+09:00)を使う

未来時間

ゲームなどだとエンドユーザーが端末時間をずらしたりして不正行為を働こうとすることがある。その対策のために、送信元がリクエストに乗せた時間を送信元で検証することがある。そのような場合、「送信元の現在時間から10分前の時間までの範囲に収まっていなければそのリクエストは不正リクエスト扱いとする」のような実装をすることがある。

その場合は以下のような実装になると思う(例はRails

# 現在時間を取得
now_time = Time.zone.now
# 10分前を定義
limit_time = now_time - 10.minitue
# リクエスト時間を取得
request_time = param['time'].in_time_zone

if limit_time <= request_time && request_time <= now_time
  p "ただしいリクエスト時間です"
else
  p "不正な時間です"
end

このような形で問題なさそうだが、実際のリクエスト時間は送信元の時計がちょっと進んでたりするので、 未来時間 で来ることがある。 1秒程度の未来時間は受けての時計のズレでも発生するので、ものすごく時間に厳しい要件でなければ時間のゆらぎを加味しておいたほうがいい場面もある。 以下は(安直だが)考慮した例。

future_time = now_time + 1.seconds
if limit_time <= request_time && (request_time <= future_time)
  p "ただしいリクエスト時間です"
else
  p "不正な時間です"
end

関連リンク