機能 #10512
未完了[VEND-V2-02] URL検証・プロンプトインジェクション対策・ヒストグラム表示修正
100%
説明
即時対応¶
-
https;//、https:/、https//等の誤入力を診断APIへ送らず「正しいURLを入力してください。」と表示する。クライアント・V2 API双方で検証する。 - 診断対象ページを未信頼データとして扱い、LLM system messageでページ内命令を無視させる。本文を明確な区切り内へ格納し、出力JSONを厳格検証する。HTML抽出・長さ制限・SSRF対策を維持する。
- 6観点を6頂点にした六角形レーダーチャートへ変更する。背景は7段階の同心六角形、データ面と各頂点の項目名・点数を表示する。静的資産のキャッシュ更新を強制する。
受入基準¶
-
https;//news.sharelab.jpはAPI行を作らず、画面に正確なエラー文を表示 -
https://news.sharelab.jp/は診断成功 - 直接APIへ不正URLを送ると400 invalid_url
- prompt injection文を含むfixtureでもスコアJSON契約以外を受け付けない
- system/user message分離、untrusted content明示、max token制限
- 全6項目に7本の棒グラフが表示される
- 390/768/1440pxで横溢れなし
- キャッシュ済みブラウザでも新資産へ更新
- Node/Docker/実ブラウザ試験、Claude Code approve、Git/本番/Redmine証跡
Redmine Admin さんが12日前に更新
- 説明 を更新 (差分)
[要件追加]
利用者指示により、可視化は棒状のヒストグラムではなく、6観点を6頂点に配置した六角形レーダーチャートとする。
- 6軸: 直接回答性、権威性、独自情報、構造化・意味付け、情報の鮮度、AI技術対応力
- 0〜100点を中心〜外周へ正規化
- 背景に7段階の同心六角形
- データ面を塗り、各頂点に項目名と点数
- SVGをDOM生成し、外部ライブラリを使用しない
- role=img/aria-labelと数値一覧を併記し、色だけに依存しない
- 390/768/1440pxで横溢れなし
- 個別カードの点数・コメントは維持
Redmine Admin さんが12日前に更新
- ステータス を 新規 から 解決 に変更
- 進捗率 を 0 から 100 に変更
[開発リード最終検収 2026-07-27 JST]
VERDICT: approve / Blockingなし
原因¶
利用者入力 https;//news.sharelab.jp が従来 https://https;//news.sharelab.jp と誤補正され、gate:not_crawlableで保存されていた。表示については利用者が期待した可視化が六角形レーダーである一方、旧実装はカード内の棒状7segmentだった。
修正¶
- frontend/backendで誤スキーム、backslash、空白/制御文字、非HTTP(S)、credentials、不正hostnameを拒否
- exact message
正しいURLを入力してください。 - API invalidは400 invalid_url、診断/DB保存前にreturn
- bare domainはHTTPS補完
- LLM system/user分離、ページ本文をuntrusted JSONとしてuser messageだけに格納
- 本文内の命令、role/output変更、秘密値要求を無視するsystem指示
- max_tokens=160、出力2キー/number/0-100を厳格検証
- 棒状ヒストグラムを削除し、6観点の六角形SVGレーダーへ変更
- 背景7同心六角形、6軸、data polygon、6markers、項目名/点数、文字一覧
- cache bust v=10512-1
コミット/本番¶
- source 37e5fb0 fix(vend): validate URLs and add secure radar view
- public 77a23de fix(vend01): publish secure hexagonal radar
- API image sha256:847ed759d924339e85cabca86002d32d6369d1f884ebcb7da938ff3dfe271219
- rollback image vend01-vend01-api:pre-10512
試験¶
- frontend 18/18
- backend/SSRF/DB/URL/prompt 16/16 Node20 Docker
- Claude Code approve、Blockingなし
- 公開API: malformed URL 400、DB count増加なし
- 正URL https://news.sharelab.jp/ は200、診断成功
- Chromium: malformed入力でexact error、結果非表示
- 正URL: 総合40点、SVG1、背景polygon7、axes6、data1、markers6、labels6、文字値6、旧histogram0
- 390/768/1440px横溢れ0
- JS/MIMEエラー0、DB integrity ok
証跡¶
- DB backup /root/backup/website-vending-machine/20260727-1000-10512
- frontend backup /root/backup/website-vending-machine/20260727-1001-10512/frontend
- browser /root/backup/website-vending-machine/20260727-1003-10512/browser
受入基準を満たしたため解決。次は#10513、#10514。
Redmine Admin さんが12日前に更新
進捗: 2026-07-27 JST #10512完了。URL誤入力検証をfrontend/backend双方へ追加し、https;//news.sharelab.jpは正しいURLを入力してください。で即時拒否、API 400 invalid_url、DB未保存。Prompt injection対策としてsystem/user分離、未信頼本文JSON化、本文命令/role/output/secret要求無視、max_tokens160、出力2キー/number/0-100厳格検証。可視化は棒状7segmentを廃止し、6観点の六角形SVGレーダーへ変更。背景7層、6軸、data polygon、6markers、項目名/点数、文字一覧。cache bust v=10512-1。source 37e5fb0、public 77a23de、API image 847ed759。frontend18/18、backend16/16、Claude Code approve。公開API malformed 400/DB未保存、正URL診断成功。Chromium 390/768/1440でSVG1、grid7、axes6、markers6、histogram0、横溢れ0。次は#10513説明/具体コメント、#10514サイト種別・業種、#10515母集団R&D。