gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:24:05 25 4
gpt4 key购买 nike

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

模型类:

# 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 模板中的表单保存到数据库,那么我必须在 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中的输入字段相同吗?

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

最佳答案

Will this not pose a security risk? name of columns in DB are same as input fields in html?

我想如果有人能够查询您的数据库,他将能够查看其中的所有表和列名称,因此隐藏表和列名称不会提供任何防御,它会带来一些不便(或不会) 。

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

# 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'

关于python - Django modelForm 和 html 模板 - 安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38158652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com