kmuto’s blog

はてな社でMackerel CREをやっています。料理と旅行といろんなIT技術

サイトコンテンツとかシナリオとかをもやもやしていた

もやもや脳内ダンプ。

  • サイトコンテンツの意図しない改変を関知したり、ページレンダリング成功有無を知りたい、あるいはサインインから始まって何か特定のサービスが動いているかを見たい、といったことに対してどういう手法があるのだろう
  • 開発向けにはSeleniumやPlaywrightを用いたVRT、E2Eテストは普通に使われているが、本番運用しているサイトのサービスに対して適用しようとすると、コンテンツは最早モックやプレースホルダではないので、変化有無検知が難しいのではないか
  • 人間だったら判断できるものと、機械だったら判断できるものがある
    • (注意深い)人間は、新旧のページを見比べたときに、動的に変化するであろう箇所の変化は無視して、大きな崩れ、加工されたであろう異常なコンテンツを判別できる。(箇所がある程度大きければ)レンダリングされていないことを操作中に判別できる
      • 学習によって高速化するが常時稼働不可能・パフォーマンスは変動
    • 機械はDOMやスクリプトの改ざんを判別できる。ページに動的なものが存在しなければ1px単位・1文字単位で差分判別できる。時間を計測できる。ルールに基づいて高速。ステータスコードを記録できる
      • 動的表示要素のvisibleを消せば偽陽性を減らせるだろう(本当に消して/無視してよい箇所かはともかく。どっちにしろどこを消すかは人間が指示する)
      • 生成系で何かできるんだろうか。学習が難しいか
  • シンプルにはステータスコードを見る、レスポンスに特定文字列を含むか、程度で済むこともある
  • 特定ページの改変・改ざん検知やページロード・レンダリング検知ではなく、操作で進んでいくものだとすると? シナリオと呼ばれる類い
    • ログイン操作、決済操作など
    • リクエスト、ステータスコード、レスポンスをうまく並べてつなげていけば、APIレベルのシナリオ検証はまぁできるだろう
    • ただAPIシナリオなら現状のE2Eテストでも対処できそうだし、そうでないから困るんだろう
    • APIのE2Eテストしていませんでした、であればワンチャンあるのかな
    • エラーだけでなく応答時間などのパフォーマンスを見たいこともある
  • New RelicのSynthetic MonitorにあるStep Monitor機能。URLを開いた後、Elementのクリック/ダブルクリック/ホバー、ドロップダウン選択、テキスト入力、モーダルクローズ、クレデンシャル提供、テキストやElementのアサーションから選んでシナリオを作っていき、各操作の成功・失敗、要した時間を返してくれる
    • Elementの同定はXPath。Developer Toolsなどで別途調べる
  • DatadogのSytneticモニタリング。APIテスト、ブラウザ(モバイルも)テスト。ブラウザテストではページ画面を見ながら入力やクリックのターゲットを選択できる
  • ブラウザレンダリングレベルのことを実行するにはリソースが高価そう
    • ローカルで完結する仕組みのほうがいいのか
    • ローカル完結の場合、設定をフレンドリーにするのは難しそう
  • ZabbixのWebシナリオ監視はAPIシナリオ監視っぽいかな
  • Cloudwatch SyntheticsはCanaryを使う形
  • セキュリティ会社のソリューションを見てみる……トレンドマイクロにはそれっぽいのがないな。ほかも攻撃検出と、悪意改ざん防止だな、まぁそうね
  • 認証がある場合はどうするか
    • アクセスクレデンシャルをどう持つのか。テストにはadminレベルのものが必要だったりする?
      • SaaSではこういうのはできる限り持ちたくない… ローカルで持つ何かを引き出す仕組み、あるいはローカルで完結させる
    • SSO前提サービスだったときはどうするか。人間用と機械用を分ける手はあるが人間体験の検査ができない
    • ヘッダ次第で認証を飛ばせる裏口を作るのはいかにも怖さがある。認証の検査ができないという問題もある

オチはない。昔Playwrightでシュッとできるかなと思ったのに対して考えるほどにむずくてそのまま思考をやめちゃっていたな、というところから始まっている。

ダンプしてから思ったけど、レンダリングとシナリオ結果の2つの話(改ざんも入れると3つだな)が混ざっているのでまずそれは分離したほうがいいだろう。