【问题标题】:Is the implementation of my add to cart / remove from cart secure?我的添加到购物车/从购物车中删除的实施是否安全?
【发布时间】:2021-12-01 07:42:56
【问题描述】:

我正在构建一个电子商务网站,为了实现 add_to_cart 功能,我做了以下操作。

点击添加到购物车按钮调用我写的javascriptadd_to_cart函数:

<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”。我在这里所做的是否涉及任何安全问题?

【问题讨论】:

  • 导致副作用的事情应该通过 POST 请求完成,并使用 CSRF 令牌。
  • @WillemVanOnsem 是的,我也是这么想的。像这样做会有什么问题?感觉好像我在发出帖子请求而不发出帖子请求......

标签: python django ajax


【解决方案1】:

我觉得这很“hacky”。我在这里所做的是否涉及任何安全问题?

GET 请求应该有副作用。确实,正如HTTP specifications say [w3.org]

特别是,已经确定GET 和HEAD 方法不应具有采取行动而不是检索的意义。这些方法应该被认为是“安全的”

您应该使用 POST、PUT、PATCH 或 DELETE 来发出带有副作用的请求。

如果您发出 POST 请求,Django 将自动尝试验证 CSRF 令牌。这是为了防止可能导致恶意 JavaScript 文件的漏洞,该文件使用登录用户的凭据发出请求。 Django(旨在)通过使用 CSRF 令牌来防止这种情况。您可以按照in the AJAX section of the documentation 的说明将此类令牌添加到 POST 请求中:

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 decorator [Django-doc]的POST请求:

from django.views.decorators.http import require_POST

@require_POST
def add_to_cart(request, product_pk):
    # …

【讨论】:

    猜你喜欢
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多