説明
文字列の連結や書式設定でユーザー入力をXPath式へ含めると、条件を迂回されたり、意図しないXMLノードを取得されたりするおそれがあります。
想定される影響
- 認証や認可の検証を迂回される可能性があります。
- XMLデータから機密情報が漏えいするおそれがあります。
対処方法
- XPath式は固定してください。APIが対応していれば値を変数としてバインドし、対応していなければ固定パスでノードを選択してアプリケーション内で値を比較してください。
- 入力の形式と長さを許可リストで検証し、返すノードへのアクセス権限も確認してください。
例
goxpath、XML文書 doc、リクエスト r が用意されたコードの抜粋です。
変更前
go
expr := "//user[@id='" + r.FormValue("id") + "']"
goxpath.MustExec(expr, doc)
変更後
go
expr := "/root/user"
goxpath.MustExec(expr, doc)
解説:
- 変更前: 入力がXPathの構文へ直接入り、条件を変更できる可能性があります。
- 変更後: 固定パスを検索するだけで、変数バインディングやIDの絞り込みは実装していません。必要なユーザー選択と権限検証を別途実装してから結果を返してください。