Django:没有csrf令牌的ajax样式的表单提交

时间:2013-08-15 00:35:43

标签: django

我是django的新手。假设我有一个表单,我想在ajax中向服务器提交一个文件。

我注意到当我没有在post语句中指定csrf标记时服务器出现HTTP 403错误(正确的行为),但不知何故该文件仍然可以上传到服务器......

以下是我的示例代码:

models.py(包括模型和表单):

from django.db import models
from django.forms import ModelForm

# Create your models here.
class Dummy(models.Model):
    myfile = models.FileField(upload_to='temp')

class DummyForm(ModelForm):
    class Meta:
        model = Dummy
        fields = ['myfile',]

views.py:

# Create your views here.
class TestFormView(View):
def get(self, request):
    form = DummyForm()

    context = { 'form' : form }
    print form
    return render(request, 'testform.html', context)

def post(self, request):
    print request.FILES
    form = DummyForm(request.POST, request.FILES)
    print form.is_valid()
    print form.errors
    print form.is_bound
    if form.is_valid():
        form.save()

    print Dummy.objects.all().count()
    return render(request, 'testform.html')

testform.html:

<form id="myForm" action="testform/" method="post" enctype="multipart/form-data">
{% csrf_token %}
 <input id="id_myfile" type="file" size="60" name="myfile">
 <input type="submit" value="Ajax File Upload">
</form>

<div id="progress">
    <div id="bar"></div>
    <div id="percent">0%</div >
</div>
<br/>

<div id="message"></div>

<script>
$(document).ready(function()
{

var options = {
beforeSend: function()
{
    $("#progress").show();
    //clear everything
    $("#bar").width('0%');
    $("#message").html("");
    $("#percent").html("0%");
},
uploadProgress: function(event, position, total, percentComplete)
{
    $("#bar").width(percentComplete+'%');
    $("#percent").html(percentComplete+'%');

},
success: function()
{
    $("#bar").width('100%');
    $("#percent").html('100%');

    alert("done!");

},
complete: function(response)
{
    $("#message").html("<font color='green'>"+response.responseText+"</font>");
},
error: function()
{
    $("#message").html("<font color='red'> ERROR: unable to upload files</font>");

}

};

 $("#myForm").ajaxForm(options);

 $("#myForm").submit(function(event) {
    event.preventDefault();

    var $form = $(this);
    var url = $form.attr('action');

    $.post("testform/", { myfile: $('#myfile').val()});

    return false;

 });

});

</script>

当然,如果我将csrf令牌放在$ post函数中,我会得到HTTP 200。

我担心的是,这是否会造成安全漏洞,因为看起来任何人都可以将文件上传到服务器?

谢谢!

0 个答案:

没有答案