1

現在、私のアプリケーションは送信時にパスワードを適切に保存していますが、ハッシュ化されておらず、プレーンテキストで保存されています。

私の見解:

def Registration(request):
    RegForm = RegistrationForm(request.POST or None)
    if request.method == 'POST':
        if RegForm.is_valid():
            clearUserName = RegForm.cleaned_data['userNm']   
            clearPassNoHash = RegForm.cleaned_data['userPass']
            clearPass = bcrypt.hashpw(clearPassNoHash.encode("utf-8"), bcrypt.gensalt(14) )
            RegForm.save()
            try:
                return HttpResponseRedirect('/Newuser/?userNm=' + clearUserName)
            except:
                raise ValidationError(('Invalid request'), code='300')    
    else:
        RegForm = RegistrationForm()

        return render(request, 'VA/reuse/register.html', {
            'RegForm': RegForm 
        })

class RegistrationForm(ModelForm):
    userPass = forms.CharField(widget=forms.PasswordInput, label='Password')
    class Meta:
        model = Client
        fields = ['userNm','userPass']

models.py

class Client(models.Model):
    userNm = models.EmailField(verbose_name="Email",max_length=50,unique=True) #userNm = <user's email>
    userPass = models.CharField(verbose_name="Password", max_length=50)   

問題は、値が の一部であるため、clearPassの値を送信しているように見えるビューにあります。私が間違っていることは何か分かりますか?パスをハッシュするためにこれを適切に実装するための助けをいただければ幸いです。clearPassNoHash.cleaned_data[]

ありがとう

4

3 に答える 3

1

変数に値を代入しているだけです。次のフォームに割り当てる必要があります。

    if RegForm.is_valid():
        clearUserName = RegForm.cleaned_data['userNm']   
        clearPassNoHash = RegForm.cleaned_data['userPass']
        RegForm.userPass = bcrypt.hashpw(clearPassNoHash.encode("utf-8"), bcrypt.gensalt(14) )
        RegForm.save()
于 2013-08-22T05:46:29.167 に答える
0

同様の問題に遭遇し、コミットする前に新しいユーザーをインスタンス化すると問題が解決することがわかりました。

def Registration(request):
    RegForm = RegistrationForm(request.POST or None)
    if request.method == 'POST':
        if RegForm.is_valid():
            new_user = RegForm.save(commit=False)
            new_user.userNm = RegForm.cleaned_data['userNm']   
            new_user.userPass = bcrypt.hashpw(
                RegForm.cleaned_data['userPass'].encode("utf-8"), 
                bcrypt.gensalt(14))
            new_user.save()
            try:
                return HttpResponseRedirect('/Newuser/?userNm=' + clearUserName)
            except:
                raise ValidationError(('Invalid request'), code='300')    
    else:
        RegForm = RegistrationForm()

        return render(request, 'VA/reuse/register.html', {
            'RegForm': RegForm 
        })
于 2018-01-02T23:10:18.890 に答える
0

同様の問題がありました。私の解決策は、models.py でメソッドを定義し、そのメソッドを呼び出して平文のパスワードをハッシュすることでした。これが私のコードです:

#models.py
def hash_password(password):
#since our user model is from AbstractBaseUser, we need to manually hash passwords
    hashed = make_password(password) #returns PBKDF2 hashed password
    return hashed

#views.py
#encrypt plain password            
form.instance.password = hash_password(clean['password'])

この (PBKDF2) ハッシュ アルゴリズムを使用する必要はありません。任意のアルゴリズム (たとえば、Bcrypt アルゴリズム) を使用できます。ハッシュ値を返す限り、問題はありません。使用できる 2 つ目の解決策は、組み込みのset_password ですが、個人的には使用したことがありません。

于 2013-08-22T06:10:30.583 に答える