Python Django modelForm和html模板-安全问题
在Django中,我们使用modelForms将数据保存到DB 模型类:Python Django modelForm和html模板-安全问题,python,html,django,django-forms,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) 模型形式: # myapp/forms.py from django import forms from .models import MyModel class MyModel
# myapp/models.py
from django.db import models
class MyModel(models.Model):
title = models.CharField(max_length=100)
模型形式:
# myapp/forms.py
from django import forms
from .models import MyModel
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
现在,若我想使用这个ModelForm或Model类将数据从html模板中的表单保存到DB,那个么我必须在html中具有和Model类中给定的相同的输入字段的名称/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中的列名相同。我认为没有人应该知道列、表或数据库名称
这不会带来安全风险吗?DB中的列名称与相同
html中的输入字段
我想,如果有人能够查询您的数据库,他将能够查看数据库中的所有表和列名,因此隐藏表和列名不会提供任何防御,它会给您带来一些不便(或者不会)
但是,为了避免将表名公开给前端,请在模型元中定义名称属性:
# 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'
对于隐藏列名,可以在创建表单实例时添加以隐藏真实模型字段名(表列):
MyModelForm(prefix='name_prefix')
此外,还可以在表单定义中指定前缀:
class MyModelForm(forms.ModelForm):
prefix = 'person'
class Meta:
model = MyModel
但是,这仍然是唯一的前缀,所以要完全隐藏名称,您必须定义MyModelForm.\uuuu init\uuuu
方法,并相应地更新每个方法:
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'
我找到了另一个解决方案,在DB中为列保留不同的名称,在html中为字段保留不同的名称。
db_列
name = models.CharField(max_length=128, db_column="myname")
这样,“name”将在任何地方的代码中使用,但在表中,列名将是“myname”。我不知道为什么您会认为这是一种安全风险。你能进一步解释吗?@DanielRoseman任何人都能看到输入字段的名称。这与DB中的列名相同。我认为没有人应该知道列、表或数据库名称。