【问题标题】:Passing Sensitive Data传递敏感数据
【发布时间】:2020-11-10 07:34:27
【问题描述】:

Teachers 可以访问其Students 类的列表。在此页面上(每个 Student 一页),如果学生完成该课程,Teachers 可以将复选框标记为 completed。这是通过 ajax 完成的。我通过将当前的Students id 设为复选框上的值来传递它。这不好,因为恶意的Teacher 可以检查页面并更改复选框元素中的Students id(因此他们可以在Student 111 的页面上并将复选框中的字段更改为 112 并标记其他Students 类已完成。

我怎样才能阻止他们这样做?我知道我可以在 POST 或使用令牌中获取当前用户数据,但正在更改复选框的 Student 不是当前用户,当前用户是 Teacher,他正在更改他的 @987654336 之一@。网址是这样的:/website/teacher/student111/classes/

def post_form_api(request):
    data = {}

    if request.method == "POST":
        class_id = request.POST.get("class_id")
        student_id = request.POST.get("student_id")

        student_class_data_entry = get_object_or_404(StudentClassData, student_id=student_id, class_id=class_id)

        form = StudentClassDataForm(request.POST, instance=student_class_data_entry)
        
        [.. other logic .]

        if form.is_valid():
            form.save()
            data = {'result' : True}

        if request.is_ajax():
            return JsonResponse(data)
        else:
            return HttpResponseBadRequest()

value 表示哪些学生课程已更改)

<form>
    {% csrf_token %}
    <td class='class_complete' student_id='{{ student.student.id }}' name='completed' value='{{ class.id }}'>{{ item.completed }}</td>
</form>
$(".class_complete").click(function(e){
    var csrfToken = $("input[name='csrfmiddlewaretoken']");
    class_id = $(this).attr('value');
    student_id = $(this).attr('student_id');

    var checked = $('#'+e.target.id).is(":checked");

    $.ajax({ url: "/api/post_form/",
        type: "POST",
        dataType: "json",
        data: {'completed':checked, 'student_id':student_id, 'class_id':class_id, 'csrfmiddlewaretoken':csrfToken.val()},
        cache: false
    }).done(function(data) {
        if (data.result === true){
        }
        else {
        }
    });
});

谢谢。

【问题讨论】:

  • 如果您的意思是检查 (ctrl-shift-i) 功能,this 可能会帮助您。
  • 感谢您的帮助,但我会尝试寻找另一种方法来传递数据,而不是阻止用户检查页面。再次感谢

标签: django ajax


【解决方案1】:

有很多方法可以做到这一点。一种方法是使表单字段成为“secret_key”、“student_name”和“student_id”的哈希值。然后它会显示为不透明的东西,例如:

<td class='class_complete' user_hash='wkfjr8fjsf8je8jfkokjl' name='completed' value='1235'>completed</td>

在后端,您可以解密哈希并确保 student_id 与 'student_name' 匹配

【讨论】:

  • 谢谢。这听起来像我所追求的。我有一个谷歌,似乎没有一个明确的方法可以用 Django 做到这一点。这将需要一些研究。在我开始之前,您是否介意告诉我是否应该考虑对数据库中的student_id 进行散列处理,或者在我的views.py 中对其进行散列处理并将其与我未散列的数据库student_id 进行比较。谢谢。
  • 您可以在视图中对其进行哈希处理。它不那么敏感(如密码)应该在数据库中加密。
猜你喜欢
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
相关资源
最近更新 更多