URL入力の検証は url タグでなく http_url を使う(url は javascript: を通す)
Go
セキュリティ
バリデーション
go-playground/validator の url タグは URL 構文ベースの検証で、javascript:alert(1) や ftp://... など http(s) 以外のスキームも「妥当な URL」として通す。ユーザー入力の URL を後で <a href> 等に出力する場合、url 検証だけでは格納型 XSS(javascript: スキーム)を防げない。
判断基準
- 表示用に受け取る URL は http/https 限定にしたいことがほとんど。その場合は
http_urlタグを使う(http または https スキームと host を必須にする)。例:omitempty,http_url,max=100。 - クライアント側のスキーム検証(フォームの ^https?:// 等)だけに依存しない。API を直接叩けば回避されるため、サーバ側でも必須化する(多層防御)。
落とし穴
urlとhttp_urlは別物。urlは scheme を問わないため javascript:/data:/ftp: を許す。- エラーメッセージを独自に翻訳登録している場合、新しいタグ(http_url)の訳を追加しないと、そのフィールドだけ既定(英語)メッセージになる。
検証方法
javascript:alert(1) / ftp://example.com / スキーム無しの裸ドメインが弾かれ、http(s)://... が通り、空値(omitempty)が通ることをテストする。