Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django modelForm和html模板-安全问题_Python_Html_Django_Django Forms - Fatal编程技术网

Python Django modelForm和html模板-安全问题

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

在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 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中的列名相同。我认为没有人应该知道列、表或数据库名称。