我在这里问一个理论上也许是愚蠢的问题,但我真的想知道答案。现在我正在使用Django用Google reCaptcha编写一个网站,以防止填写表单中的垃圾邮件。我设置了一个js以避免跳过Google reCaptcha,这样每次提交都会显示消息“我不是机器人"。
我的问题是,如果在表单上提交已经证明不是垃圾邮件(不是机器人),那么为什么我必须在views.py上编写语法来验证Google reCaptcha,其密钥与网站密钥匹配?在什么情况下,垃圾邮件提交通过Google reCaptcha而不是后端验证?
如果您想参考我正在做的事情,我会附上我的代码,尽管这是一个纯粹的理论问题。非常感谢。
模板:
<form id="contact_form" class="form-horizontal" method="post" action="{% url 'contact' %}">
{% csrf_token %}
<div class="form-group">
<span id="name_err" style="color:red; bold: false; font-size:1vw; padding-left:1vw; display:none">Please enter your name</span>
<label class="control-label col-sm-2" for="name">Name:</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="name" name="name" placeholder="Enter name here">
</div>
</div>
<script src='https://www.google.com/recaptcha/api.js'></script>
<div style="padding-left: 11vw;" class="g-recaptcha" data-sitekey="xxx"></div><br>
<div style="padding-left: 11vw;" id="submit-div"><input type="submit" value="post" class="btn btn-primary"></div>
views.py
if request.method == 'POST':
contact_name = request.POST.get('name')
contact_email = request.POST.get('email')
contact_subject = request.POST.get('subject')
contact_message = request.POST.get('message')
recaptcha_response = request.POST.get('g-recaptcha-response')
url = 'https://www.google.com/recaptcha/api/siteverify'
values = {
'secret': settings.GOOGLE_RECAPTCHA_SECRET_KEY,
'response': recaptcha_response
}
data = urllib.parse.urlencode(values).encode()
req = urllib.request.Request(url, data=data)
response = urllib.request.urlopen(req)
result = json.loads(response.read().decode())
''' End reCAPTCHA validation '''
答案 0 :(得分:1)
我不完全确定您的要求但是,您确认该回复对您的网页有效,用户可能已从另一台服务器获得了reCaptcha响应,然后将其插入您的表单提交中。
recaptcha_response
可能是有效的回复,但不适用于您的网站,这就是您要检查的内容。我希望有所帮助。