【问题标题】:Django modelForm and html template - securiy concernDjango modelForm 和 html 模板 - 安全问题
【发布时间】:2016-11-04 15:32:13
【问题描述】:

在 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 中使用与模型类中给出的相同的输入字段的名称/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 中的列名相同。我认为没有人应该知道列、表或数据库名称。

【问题讨论】:

  • 我不确定您为什么认为这是一个安全风险。你能进一步解释一下吗?
  • @DanielRoseman 任何人都可以看到输入字段的名称。这与 DB 中的列名相同。我认为没有人应该知道列、表或数据库名称。

标签: python html django django-forms


【解决方案1】:

这不会带来安全风险吗? DB 中的列名与 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'

【讨论】:

    【解决方案2】:

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

    name = models.CharField(max_length=128, db_column="myname")
    

    这样,'name' 将在任何地方的代码中使用,但在表中的列 name 将是 'myname'。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 2015-06-02
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多