0

Rails を使用したアジャイル Web 開発に取り組んでいます

パート E3 では、次のメソッドを置き換えるように指示されています。

def destroy
  @cart = Cart.find(params[:id])
  @cart.destroy

def destroy
  @cart = current_cart
  @cart.destroy  

どこ

def current_cart
  Cart.find(session[:cart_id])
rescue ActiveRecord::RecordNotFound
  cart = Cart.create
  session[:cart_id] = cart.id
  cart
end

私の質問は、最初の方法よりも 2 番目の方法を使用する利点は何ですか? 2番目が失敗する状況は見当たりませんか? これは、次からメソッドを呼び出しています。

<%= button_to 'Delete Cart', method: :destroy %>

カートビュー内から。暗黙的に常に正しいcart_idを渡しませんか?? それとも、たとえば別のビューからカートを削除しようとしている場合など、将来の使用のために破棄するためのこの変更ですか? この後者の説明が正しい場合、ID を常に :session ハッシュに格納する必要がありますか?

ご協力いただきありがとうございます。

4

2 に答える 2

2

手始めに、悪意を持って URL やpassing &cart_id=ID_TO_CART_I_DONT_OWN. https://www.owasp.org/index.php/Top_10_2010-A4を参照してください。

また、セッションからカートを取得することで、データベース ルックアップを節約することもできます [ただし、Rails はデフォルトで db キャッシュを備えているため、非常に優れています]。失敗の可能性についてですが、「カートを削除」ボタンを押した時点でレコードが存在しなくなっていたらどうなりますか? Cart.find(params[:id])処理していない例外が発生すると、2 番目のメソッドは例外を処理し、静かに失敗します。これは必ずしも良いことではありません。

于 2013-01-18T13:22:32.947 に答える
0

のようなリアルタイム アプリケーションを扱っているためShopping Cart、2 人以上のユーザーが同時にアプリケーションにアクセスして同じ製品を購入する可能性が高くなります。はparams[:id]各ユーザーに固有ですが、どのユーザーもハッキングで悪意を持って他のユーザーに入ることができ、これは重大な欠点を引き起こします。

そのため、アプリケーションには各ユーザーのセッションがあり、そのユーザーのリクエスト間で保持される少量のデータを保存できます。各ユーザーのセッションを管理することで一貫性が維持され、優れたリソース管理があります。これにより、大混乱が生じることはありません。

于 2013-01-18T13:23:02.580 に答える