1

フォームを作成していて、変更してはならないいくつかの非表示の値をバインドして渡しているとしましょう。私の質問は、悪意のあるユーザーがこの非表示の値を変更したかどうかをテストするにはどうすればよいですか? フォーム内のバインドされたデータと初期の違いが正確に何であるかはわかりません。

Django のforms.pyにはchanged_dataというプロパティがありますが、役立つかどうかはわかりません。

デモンストレーション用のコード:

フォーム.py

class ConfirmForm(forms.Form):
    client_id = forms.CharField(widget=forms.HiddenInput())
    identifier = forms.CharField(widget=forms.HiddenInput())

    def clean(self):
        # Maybe here the validation process of cliend_id and identifier like:
        clean_client_id = self.cleaned_data.get('client_id')
        clean_identifier = self.cleaned_data.get('identifier')
        if last_client_id == clean_client_id and 
           last_identifier == clean_identifier:
            return self.cleaned_data
        else:
            raise forms.ValidationError("False data.")

ビュー.py

def form_confirm_handler(request):
    if request.method == 'POST':
        form = ConfirmForm(request.POST)
        if form.is_valid():
            #Do something...
            return redirect('home:index')

    #The following values are not fixed. Are generated variables!
    bound_data = {'client_id':'123456','identifier':'wuiy5895'}
    form = ConfirmForm(bound_data)
    return render(request, 'client/theform.html', {'form':form})

html テンプレート

<form action="{% url 'client:confirm' %}" method="post">
    <p>Do you really want to proceed?</p>
    {% csrf_token %}
    {{ form.client_id }}
    {{ form.identifier }}
    <button id="submit" type="submit" name="submit" class="btn" value="accept">Accept</button>
    <button id="cancel" type="submit" name="cancel" class="btn btn-primary" value="cancel">Cancel</button>
</form>

前もって感謝します!

4

3 に答える 3

5

この問題に対する 4 つの (簡単な) 解決策を見つけました。

Django の最も有効なソリューションは次のとおりです。

class TheFormName():
    client_id = forms.CharField(show_hidden_initial=True, widget=forms.HiddenInput())
    identifier = forms.CharField(show_hidden_initial=True, widget=forms.HiddenInput())

def clean(self):
    if self.has_changed():
        raise forms.ValidationError('Fields are not valid.')

    return self.cleaned_data

2 番目の解決策は、 を使用しchanged_dataて何が変更されたかを確認することです。

def clean(self):
    for field_name in self.changed_data:
        # loop through the fields which have changed
        print "field {} has changed. New value {}".format(field_name, cleaned_data['field_name']

has_changed()私の場合はこれに変換されますが、メソッドとまったく同じです:

def clean(self):
    if len(self.changed_data) > 0:
        raise forms.ValidationError('Fields are not valid.')

    return self.cleaned_data

ハックのように見える別の解決策は次のとおりです。

self.cleaned_data['cliend_id'] == self.instance.cliend_id
self.cleaned_data['identifier'] == self.instance.identifier

そして、もう少し複雑な最終的な解決策は、clean()メソッド内 (およびビュー外) でセッションを使用することです。Django Docsの例:

from django.contrib.sessions.backends.db import SessionStore
import datetime
s = SessionStore()
s['last_login'] = datetime.datetime(2005, 8, 20, 13, 35, 10)
s.save()
s.session_key
>>> '2b1189a188b44ad18c35e113ac6ceead'

s = SessionStore(session_key='2b1189a188b44ad18c35e113ac6ceead')
s['last_login']

この投稿も役に立ちますIn Django 1.4, do Form.has_changed() and Form.changed_data, which are undocumented, work as expected? @LarsVegas 提供

于 2013-04-13T13:10:09.817 に答える