Django, как защитить скрытые поля ввода и предотвратить отправку форм, если значение изменилось?

avatar
boyenec
8 августа 2021 в 19:05
213
1
0

Я отображаю мало данных в скрытом вводе. Пользователь может проверить html-страницу и увидеть эти скрытые входные данные. Он также может изменить скрытые входные данные, которые представляют угрозу безопасности моего сайта. Например, у меня есть скрытый ввод, в котором адрес электронной почты пользователя и имя отображаются следующим образом

<input type="hidden" name="name" class="form-control" placeholder="Your Name" value="Jhone" required=""> 

Пользователь может проверить html и изменить значение, после чего мои формы отправляются с новым обновленным значением. есть ли способ остановить отправку форм, если значение изменилось. вот мой код:

#html шаблон

{% for i in currentuser_details %}
{%for y in user_profile%}
 <input type="hidden" name='userprofile' value="{{y.id}}">
{%endfor%}        
 <input type="hidden" name="name" class="form-control"  placeholder="Your Name"  value="{{i.first_name}}" required>
<input type="hidden" name="email" class="form-control" placeholder="Enter email"value="{{ i.email }}" required>
 {%endfor%}

#html скрытые входные данные рендеринга

    <input type="hidden" name="name" class="form-control" placeholder="Your Name" value="Jhone" required=""> 
 <input type="hidden" name="email" class="form-control" placeholder="Your Name" value="Jhone@gmail.com" required=""> 

   <input type="hidden" name='userprofile' value="1">
        
  <input type="hidden" name="parent" id="parent_id" value="95">

Больше всего импортируемых полей для меня профиль пользователя и родитель. Я хочу предотвратить отправку форм при изменении любого скрытого значения.

froms.py

class CommentFrom(forms.ModelForm):
      captcha = CaptchaField()
      
      class Meta:
          model = BlogComment
          fields = ['name','email','comment','parent','sno','blog','user','userprofile']

views.py

if request.method == "POST":
       if comment_form.is_valid():
                isinstance = comment_form.save(commit=False)
                
                if request.user.is_authenticated:
                   isinstance.user = request.user
                elif not request.user.is_authenticated:
                   User = get_user_model()
                   isinstance.user = User.objects.get(username='anonymous_user')
                
                isinstance.blog = blog
                isinstance.save()
                messages.add_message(request, messages.INFO, 'Your Comment Pending for admin approval')
                return redirect('blog:blog-detail',slug=blog.slug)
       else:
           messages.add_message(request, messages.INFO, "your comment didn't submitted. please submit again ")
                
    else:
          comment_form = CommentFrom()

набор запросов для user_profile и currentuser_details, которые используются в представлениях и передают контекст на мою html-страницу.

user_profile = UserProfile.objects.filter(user=request.user)

currentuser_details = UserManagement.objects.filter(username=request.user) user_profile = UserProfile.objects.filter(user=request.user)

Думаю, мне нужно добавить проверку в файл froms.py или views.py, но как это сделать для скрытых полей ввода и скрытых полей внешнего ключа, я не знаю.

Источник
John Doe
8 августа 2021 в 19:12
0

Я не знаю, можете ли вы напрямую запретить пользователю отправлять форму, если значение изменилось с помощью проверки, особенно на стороне клиента. Вы, вероятно, можете сделать это на стороне сервера, но я думаю, вы можете попробовать отключить проверку (хотя это не рекомендуется и не полностью работает)

boyenec
8 августа 2021 в 19:14
0

Джон Доу спасибо за ваш комментарий. Мне нужно добавить проверку в мой froms.py или views.py, но как я не знаю. Жду соответствующего ответа и надеюсь, что кто-нибудь может помочь мне по этой теме.

Ответы (1)

avatar
Amandeep Singh
8 августа 2021 в 19:40
1

Вы можете использовать request.session. Я имею в виду, что перед рендерингом страницы вы можете установить такие значения.

request.session['secret_data'] = {"key1": "value1", "key2": "value2"}

Затем можно создать функцию проверки, которая будет выполнять проверку отправленных данных формы и значений request.session['secret_data']. Если проверка окажется истинной, вы можете сохранить данные, иначе выведите любое сообщение, которое хотите.

def validate_hidden_values(request,**kwargs):
    original_data = request.session['secret_data']
    # Used **kwargs because i do not know what all the named variables you want to validate. You can get submitted data from **kwargs
    # run your validation checks
    # return True if all validation passes else return False at any point where validation fails

Не забудьте удалить ключ secret_data, используя request.session.pop('secret_data'), когда проверка True. Теперь удаление ключа secret_data при проверке False зависит от вашего варианта использования, и вы должны подумать об этом.

boyenec
8 августа 2021 в 19:47
0

Амандип Сингх Сони Спасибо за ваш ответ. Не могли бы вы взять любое из моих полей в качестве примера и показать мне, как его обрабатывать с помощью сеанса. Позвольте выбрать скрытые поля имени. Это помогает мне понять, как правильно реализовать ваш код.

Amandeep Singh
8 августа 2021 в 20:02
0

Пожалуйста, подумайте над этим. Добавьте код, как вы установите secret_data. secret_data — это не что иное, как словарь ваших исходных значений, которые вы хотите проверить. Прочтите о том, как вызывать пользовательские исключения. На данный момент детали размещенных вопросов очень широки. Пожалуйста, попробуйте сузить его.

boyenec
9 августа 2021 в 09:01
0

Амандип Сингх Сони, как передать сеанс в контексте и как отобразить его в моем HTML ???

Amandeep Singh
9 августа 2021 в 10:28
0

У вас уже есть объект запроса в контексте. В шаблоне django вы можете напрямую получить доступ к {{ request.session }}

boyenec
9 августа 2021 в 10:43
0

Amandeep Singh Sawhney В моем скрытом вводе я пытаюсь использовать <input type="hidden" name="name" value="{{request.session.key1}}" required>, но не работаю. В моем views.py я добавил `request.session['secret_data'] = {"key1": name}`