すべての記事

FourA Digest (2026年6月12日〜6月19日)

SingleにおいてUTF-8以外のページが文字化けせず読み取り可能なテキストを返すようになり、validateルールが成功判定に反映されるようになったほか、Wave 0のセキュリティ強化をリリースしました。

ハイライト

今週の2つの変更は、requestからの返却値に影響します。UTF-8以外のサイトでresponse bodyが文字化けしなくなり、validateで許容された200以外のresponseが、失敗ではなく成功としてカウントされるようになりました。また、customer APIにおけるいくつかのセキュリティ脆弱性を修正しました。

新機能・改善

SingleにおいてUTF-8以外のページが読み取り可能なテキストを返すように

ブルガリア語のフォーラム、中国のECサイト、日本語のニュース、あるいは windows-1251GBKBig5Shift_JIS などを返すサイトに対してSingleを呼び出すと、これまではresponse bodyが文字化けしたバイト列として返されていました。基盤となるHTTPレイヤーがUTF-8デコーダーをハードコードしていたため、キリル文字のページは промоции として届き、ユーザー側でオリジナルを復元する方法はありませんでした。

この問題はrequestレイヤーで修正されました。Singleは、ソースの文字コードを(Content-Type header、次に <meta charset>、その次に <meta http-equiv> を介して)検出し、bodyがJSONエンベロープに到達する前にUTF-8に変換します。なお、UTF-8やASCIIのページはそのまま処理されます。画像やPDFなどのバイナリコンテンツがデコードされることはありません。生のバイトデータが必要な場合は、returnBuffer: true を指定することで、引き続きオリジナルのバッファを取得できます。

デフォルトで有効です。設定フラグを切り替える必要はありません。以前から動作していたページはそのまま動作し、文字化けしていたページは読み取り可能なテキストを返すようになります。ブラウザを使用するユーザーもこれを意識する必要はありません。Chromiumがネイティブに文字コードをデコードするためです。

validate ルールが成功判定に反映されるように

requestに validate を設定した場合(例:validate.status.accept = [200, 403])、requestエンジンはすでにそのルールを尊重し、エラーなしでresponseを解決していました。しかし、アップストリームの判定分類器(outcome classifier)がこのルールを無視し、リテラルの200以外をすべて application_fail として分類していました。これには2つの影響がありました。許容された403がダッシュボード上で失敗として表示されること、そして成功のみが課金対象となるため、これらの配信されたresponseが課金対象外になっていたことです。

分類器は、validate で宣言された内容を尊重するようになりました。validate が設定されたrequestは、ステータスに関わらず、エンジンがエラーなしで解決した場合は常に成功としてカウントされます。validate のないrequestは以前と同じ挙動(200のみ成功)となるため、レガシーなパスは影響を受けません。

この修正は今後のデータにのみ適用されます。過去のデータは保存された判定結果を維持し、新しいrequestは正しく分類されます。そのため、有効であるとわかっているresponseに対して App Fail が表示されていた場合、これが原因です。

customer APIのセキュリティ強化

customer API全体のセキュリティレビューのWave 0をリリースしました:

  • CORShttps://foura.ai に制限されるようになりました。以前の設定では、認証情報を送信する際に任意のオリジンを反映させており、これは標準的なCSRFの構成でした。同一オリジンのブラウザ呼び出しや、サーバーサイドのAPI呼び出しは影響を受けません。
  • Activityタイムラインの背後にあるメトリクスルートは、以前はクエリに直接流し込まれる自由形式の outcome フィルターを受け入れていました。現在は、既知のoutcome値のみに許可リスト化されています。通常のアカウントから悪用されることはありませんが、修正すべき箇所でした。

どちらの変更もAPIのコントラクトを変更するものではありません。通常の利用において気づくことはないでしょう。しかし、問題を発見し、誰かが気づく前に修正したことは、公表する価値があります。

ActivityのラベルをOverviewと統一

細かい修正です。ダッシュボードのActivityテーブルでは、これまで Application_fail のような生の outcome 文字列が表示されていましたが、Overviewのチップ、ドーナツチャート、タイムラインではわかりやすいラベル(App Fail)が表示され、各outcomeが色分けされていました。同じデータに対して2つの表現が存在していた状態です。これらが同期され、両方とも同じラベルとカラーマップを参照するようになったため、どこで確認しても行のステータスが同じように表示されます。

数値データ

今週は、新しいレイテンシや成功率の数値はありません。今回の作業の大部分は正確性とセキュリティに関するものであり、適切な指標は「より速くする」ことではなく「誤りをなくす」ことだからです。来週のダイジェストでは、現在進行中のいくつかの機能からスループットデータをお届けできる予定です。