会員登録すると
学習することができます。
会員登録する(無料)
学習することができます。
登録済みの方はこちら
ログイン
学ぶ目的
一番見落とされやすい穴
ログインしているかどうか(認証)は、AIもたいてい書いてくれます。見落とされやすいのは、そのデータをこの人が見てよいか(認可)です。
よくある形
注文の詳細ページを作らせると、AIはこう書くことがあります。
def show
@order = Order.find(params[:id])
end
ログインは必須にしてあっても、URLの /orders/101 を /orders/102 に変えれば他人の注文が見えます。IDを書き換えるだけなので、特別な道具も知識も要りません。
直し方
「自分の注文の中から探す」形にします。
def show
@order = current_user.orders.find(params[:id])
end
他人の注文IDを指定すると、見つからない(404)扱いになります。
なぜAIは間違えるのか
「注文は持ち主にしか見せない」というのは、コードではなく仕様です。AIは仕様を教えられなければ知りようがありません。管理者は全部見てよい、同じ会社の人なら見てよい、といった規則も同じです。
確かめ方
-
find(params[:id])のように、IDだけでデータを取っている箇所を探す - 「このデータは誰のものか」を、1つずつ自分で言えるか確かめる
- 言えないなら、それはAIではなく仕様の側の穴
AIに頼むときは、「ログイン中のユーザーが持つ注文だけを対象にして」と、持ち主の条件を書きます。
このレクチャーで学ぶこと
- 認証と認可の違い
- IDを書き換えるだけで他人のデータが見える形
- 持ち主の条件を仕様として伝える
質問
まだ質問は投稿されていません。
質問投稿
ログイン後に質問の投稿ができます。