我正在構建一個 ecom 網站,為了實作 add_to_cart 功能,我完成了以下操作。
單擊添加到購物車按鈕呼叫add_to_cart我撰寫的 javascript函式:
<button type="button" onclick = "add_to_cart({{ product.pk }})">Add to Cart</button>
這是函式:
function add_to_cart(product_pk) {
let url = '/add-to-cart/' product_pk.toString()
$.ajax({
type: 'GET',
url: url,
processData: false,
contentType: false
})
}
這個網址看起來像這樣:
path('add-to-cart/<str:product_pk>', views.add_to_cart, name='add_to_cart')
最后我的觀點是這樣的:
def add_to_cart(request, product_pk):
cart = request.session['cart']
cart.append(product_pk)
request.session['cart'] = cart
context = {'length_of_cart': len(cart)}
return HttpResponse(content = dumps(context), content_type='application/json')
tldr:點擊按鈕,按鈕呼叫js,js向url發起get請求,url觸發view,view中的邏輯將產品加入購物車。
我覺得這很“hacky”。我在這里所做的事情是否涉及任何安全問題?
uj5u.com熱心網友回復:
我覺得這很“hacky”。我在這里所做的事情是否涉及任何安全問題?
GET 請求不應該有副作用。事實上,正如HTTP 規范所說的 [w3.org]:
特別是,約定已經建立,GET 和 HEAD 方法不應該具有采取除檢索以外的動作的意義。這些方法應該被認為是“安全的”。
您應該使用 POST、PUT、PATCH 或 DELETE 來發出具有副作用的請求。
如果您發出 POST 請求,Django 將自動嘗試驗證 CSRF 令牌。這是為了防止可能導致惡意 JavaScript 檔案使用登錄用戶的憑據發出請求的漏洞。Django(旨在)通過使用 CSRF 令牌來防止這種情況。您將此類令牌添加到 POST 請求中,如檔案的AJAX部分所述:
function getCookie(name) {
let cookieValue = null;
if (document.cookie && document.cookie !== '') {
const cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i ) {
const cookie = cookies[i].trim();
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length 1) === (name '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length 1));
break;
}
}
}
return cookieValue;
}
const csrftoken = getCookie('csrftoken');
function add_to_cart(product_pk) {
let url = '/add-to-cart/' product_pk.toString()
$.ajax({
type: 'POST',
url: url,
processData: false,
contentType: false,
headers: {'X-CSRFToken': csrftoken}
})
}
最后,我們應該使視圖只接受帶有@require_POST裝飾器 [Django-doc] 的POST 請求:
from django.views.decorators.http import require_POST
@require_POST
def add_to_cart(request, product_pk):
# …
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/314703.html
上一篇:顯示/隱藏密碼ASP.NET
