メール配送後のURL検査と隔離
送信元の認証、内容検査、配送後の処理をそれぞれの根拠で評価します。
説明
配送時に許可したURLでも、後から評価が変わる場合があります。クリック時の検査、サーバー上のメール隔離、既に作られたコピーへの対応は、それぞれ作用する場所と時点が異なります。
固定メールのURLを取り出し、時刻による判定と期限付き例外をSQLで確認します。サーバー上のコピーを隔離した後、別に保存されたコピーの状態も調べます。
送信元の認証、内容検査、配送後の処理をそれぞれの根拠で評価します。
1メール内のURLと配送済みコピーを開く
m7にはサーバーとオフライン保存の2コピーがあります。
from sp09 import *
from sp02 import showメール内のURLと配送済みコピーを開く
db=connect()
url='https://docs.example.test/report'
show(db,"SELECT * FROM copy ORDER BY id")
show(db,"SELECT * FROM verdict ORDER BY t")配送時0秒ではallow、60秒からblockです。評価がいつ更新されたかを含めて読みます。
2配送直後のクリックを評価する
10秒の判定を取得します。
print(click配送直後のクリックを評価する(db,10,'alice',url))allowです。この教材のクリック関数は時点に対応する評価を参照し、アクセス記録をDBへ残します。
3評価更新後のクリックを比較する
同じURLを70秒に評価します。
print(click評価更新後のクリックを比較する(db,70,'alice',url))
show(db,"SELECT t,user,result FROM access ORDER BY t")blockに変わりました。0秒の配送許可を、その後も安全である根拠として使い続けません。
4サーバーのコピーを隔離する
配送後の隔離をコピー台帳へ適用します。
db.execute("UPDATEサーバーのコピーを隔離する copy SET state='quarantine' WHERE mail='m7' AND location='server'")
show(db,"SELECT * FROM copy ORDER BY id")c1だけがquarantineになります。オフラインへ保存したc2のstateはsavedのままです。
5利用者と期限を限定した例外を追加する
理由付きの例外をaliceにだけ設定します。
db.execute("INSERT INTO exception VALUES (?,?,?,?)",('alice',url,90,'reviewed public sample'))
print(click利用者と期限を限定した例外を追加する(db,80,'alice',url))
print(click(db,80,'bob',url))aliceはallow_exception、bobはblockです。宛先全体や全利用者を一括して除外する条件ではありません。
6期限境界で例外が切れることを確認する
expiresより現在時刻が小さいときだけ例外を認めます。
print(click期限境界で例外が切れることを確認する(db,89,'alice',url))
print(click(db,90,'alice',url))89秒は例外、90秒はblockです。期限が過ぎた例外を残したまま有効扱いしません。
7クリック許可とメールの隔離を別々に確認する
最終の判定履歴とコピー状態を開きます。
showクリック許可とメールの隔離を別々に確認する(db,"SELECT t,user,result FROM access ORDER BY t,user")
show(db,"SELECT id,state FROM copy ORDER BY id")URLに例外を追加してもc1の隔離は解除されていません。URL判定とメールコピーへの措置は別の状態として確認します。
まとめ
配送時点とクリック時点の評価を分けます。
隔離の対象となるコピーを確認します。
例外には主体、対象、期限、理由を持たせます。
操作履歴と解説を振り返れます。
Python 3.15 / 公開試験鍵によるDKIM試料 / SQLite
from sp09 import *
from sp02 import show
db=connect()
url='https://docs.example.test/report'
show(db,"SELECT * FROM copy ORDER BY id")
show(db,"SELECT * FROM verdict ORDER BY t")id | mail | location | state c1 | m7 | server | inbox c2 | m7 | offline-export | saved t | url | result 0 | https://docs.example.test/report | allow 60 | https://docs.example.test/report | block
print(click(db,10,'alice',url))allow
print(click(db,70,'alice',url))
show(db,"SELECT t,user,result FROM access ORDER BY t")block t | user | result 10 | alice | allow 70 | alice | block
db.execute("UPDATE copy SET state='quarantine' WHERE mail='m7' AND location='server'")
show(db,"SELECT * FROM copy ORDER BY id")id | mail | location | state c1 | m7 | server | quarantine c2 | m7 | offline-export | saved
db.execute("INSERT INTO exception VALUES (?,?,?,?)",('alice',url,90,'reviewed public sample'))
print(click(db,80,'alice',url))
print(click(db,80,'bob',url))allow_exception block
print(click(db,89,'alice',url))
print(click(db,90,'alice',url))allow_exception block
show(db,"SELECT t,user,result FROM access ORDER BY t,user")
show(db,"SELECT id,state FROM copy ORDER BY id")t | user | result 10 | alice | allow 70 | alice | block 80 | alice | allow_exception 80 | bob | block 89 | alice | allow_exception 90 | alice | block id | state c1 | quarantine c2 | saved
演習完了