Django modelForm和html模板 - 安全关注

时间:2016-07-02 09:34:48

标签: python html django django-forms

在Django中,我们使用modelForms将数据保存到DB。

模特课:

# myapp/models.py
from django.db import models

class MyModel(models.Model):
    title = models.CharField(max_length=100)

的ModelForm:

# myapp/forms.py
from django import forms
from .models import MyModel

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel

现在,如果我想使用此ModelForm或Model类将数据从html模板中的表单保存到DB,那么我必须在html中具有与模型类中给出的相同的输入字段的名称/ ID。

<tr><th><label for="id_title">Title:</label></th>
<td><input id="id_title" name="title" maxlength="100" type="text" /></td></tr>

这不会带来安全风险吗? DB中列的名称与html中的输入字段相同?

任何人都可以看到输入字段的名称。这与DB中的列名相同。我想没有人应该知道列,表或数据库名称。

2 个答案:

答案 0 :(得分:1)

  

这不会带来安全风险吗? DB中列的名称与   输入字段在html?

我想如果有人能够查询你的数据库,他就能查看其中的所有表和列名,因此隐藏表和列名称不会给出任何防御,这会给小的不便(或不会) 。

但是要避免将表名暴露给模型元中的前端定义db-table名称属性的情况:

# myapp/models.py
from django.db import models

class MyModel(models.Model):
    title = models.CharField(max_length=100)

    class Meta:
        db_table='some_other_name'

为了隐藏列名,您可以在创建表单实例时添加prefix parameter以隐藏实际模型字段名称(表列):

MyModelForm(prefix='name_prefix')

此外,您可以在表单定义中指定前缀:

class MyModelForm(forms.ModelForm):
    prefix = 'person'
    class Meta:
        model = MyModel

然而,这仍然只是前缀,因此要完全隐藏名称,您必须定义MyModelForm.__init__方法并相应地更新每个field.widget.attrs['name']

class MyModelForm(forms.ModelForm):
    class Meta:
        model = MyModel
        fields = ['field_a',]

def __init__(self, *args, **kwargs):
    super(MyModelForm, self).__init__(*args, **kwargs)
    self.fields['field_a'].widget.attrs['name'] = 'custom_name'

答案 1 :(得分:0)

我找到了另一种解决方案,可以在数据库和字段名称中为列保留不同的名称 db_column。

$scope.removeRow = function (index) {
if (index === -1) {
alert("Something gone wrong");
}else{
$scope.budgetdetails.splice(index,1);
}

这样,&#39; name&#39;将在代码中的任何地方使用,但在表格列名称中将是&#39; myname&#39;。