2016-07-02 75 views
1

在Django中,我們使用modelForms將數據保存到數據庫。Django modelForm和html模板 - 安全問題

模型類:

# 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或模型類將數據從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中的輸入字段相同?

任何人都可以看到輸入字段的名稱。這與DB中的列名相同。我認爲沒有人應該知道列,表或數據庫名稱。

+0

我不確定爲什麼你認爲這是一個安全風險。你能進一步解釋嗎? –

+0

@DanielRoseman \t 任何人都可以看到輸入字段的名稱。這與DB中的列名相同。我認爲沒有人應該知道列,表或數據庫名稱。 – User42

回答

1

這會不會構成安全風險? DB中的列名稱與 中的輸入字段相同?

我想,如果任何人都能夠查詢你的數據庫,他將能夠查看所有表和列名,因此隱藏表和列名稱不會給予任何的防守,這將給小不便(或不)。

然而,爲了避免暴露表名的情況下,以前端模型元內定義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' 
0

我發現在HTML另一種解決方案,以保持對列不同的名稱在DB和字段名。
db_column。

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

這樣一來,「名」將無處不在的代碼,但在表列名稱中使用將是「MYNAME」。