使用 Zope2 验证 reCaptcha2
Validating reCaptcha2 with Zope2
使用 Zope 2.13.29 和 Python 2.7.15,我正在尝试使用从 DTML 文档调用的 Python 脚本来验证 Google 的 reCaptcha2。 DTML 文档包含表单,同一个 DTML 文档使用 dtml-if 语句来确定是否在用户单击提交后处理表单。在该 dtml-if 语句中有一个 dtml-in,它调用 python 脚本以验证 reCaptcha 和 return 成功值(True 或 False)。问题是我似乎无法获得成功的价值。
虽然我知道你们中的一些人可能倾向于谈论 RestrictedPython 以及我如何无法导入 Zope 使用的 python 模块,但那部分已经已搞定。一切正常,只是没有完成我需要它做的事情。
这是显示联系表的 dtml-doc,以及确定是否已单击提交,进而调用 python 脚本最终确定 returned 值来自 reCaptcha 的 Google 成功变量。
<dtml-if submit>
<dtml-with recaptcha-validate>
<dtml-if expr="'success' == True">
<dtml-sendmail mailhost="MailHost">
To: info@foo.com
From: &dtml.lower-emailaddr;
Subject: Web Request
&dtml-message;
Sincerely,
&dtml-realname;
&dtml-emailaddr;
&dtml-phone;
&dtml-location;
</dtml-sendmail>
<dtml-else>
<dtml-sendmail mailhost="MailHost">
To: info@foo.com
From: &dtml.lower-emailaddr;
Subject: SPAM: Web Request
&dtml-message;
Sincerely,
&dtml-realname;
&dtml-emailaddr;
&dtml-phone;
&dtml-location;
</dtml-sendmail>
</dtml-if>
</dtml-with>
<dtml-else submit>
<dtml-var "foo.sitefiles.doctype(_.None, _)">
<html>
<head>
<title>Contact Us</title>
<script src="https://www.foo.com/javascript/jquery/jquery-min.js" type="text/javascript"></script>
<script src="https://www.foo.com/javascript/parsley/parsley.min.js" type="text/javascript"></script>
<script src="https://www.foo.com/javascript/misc/placeholder.js" type="text/javascript"></script>
<script src="https://www.google.com/recaptcha/api.js"></script>
</head>
<body>
<form data-parsley-validate id="contact-form" method="post" action=<dtml-var URL0> novalidate="" parsley-validate="" parsley-focus="none" data-parsley-errors-messages-disabled data-parsley-excluded="input[name=g-recaptcha-response], input[id=recaptcha-token]">
<fieldset>
<label>NAME</label>
<input class="parsley-validated" type="text" name="realname" placeholder="Enter your name" value="" required="">
<label>E-MAIL</label>
<input class="parsley-validated" type="email" name="emailaddr" placeholder="Enter your e-mail" value="" required="" pattern="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$">
<label>PHONE NUMBER</label>
<input class="parsley-validated" type="text" name="phone" placeholder="Enter your contact phone number" value="" required="" pattern="^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$">
<label>LOCATION</label>
<input class="parsley-validated" type="text" name="location" placeholder="Enter your city, state" value="">
<label>MESSAGE</label>
<textarea class="parsley-validated" name="message" placeholder="Enter your message here" value="" required="" rows="8"></textarea>
<input id="myField" data-parsley-errors-container="#errorContainer" data-parsley-required="true" value="" type="text" style="display:none;">
<div id="contactrecaptcha">
<div id="recaptchatoken" class="g-recaptcha" data-sitekey="XXXXXXXXXX" data- callback="recaptchaCallback"></div>
</div>
<span id='errorContainer'></span>
</fieldset>
<input type="submit" name="submit" value="SUBMIT">
</form>
<script type="text/javascript">
$('#contact-form').parsley();
function recaptchaCallback() {
document.getElementById('myField').value = 'nonEmpty';
}
</script>
</body>
</html>
</dtml-if>
这是 python 脚本(名为 recaptcha-validate):
import urllib
import urllib2
import json
REQUEST = container.REQUEST
URIReCaptcha = 'https://www.google.com/recaptcha/api/siteverify'
secret = 'XXXXXXXXXXXXXXXXXXX'
recaptcha_response = context.REQUEST['g-recaptcha-response']
remoteip = REQUEST.HTTP_X_FORWARDED_FOR
params = urllib.urlencode({
'secret': secret,
'response': recaptcha_response,
'remoteip': remoteip,
})
#print params
from urllib2 import urlopen
req = urllib2.Request(URIReCaptcha, params)
response = urllib2.urlopen(req)
result = json.load(response)
success = result.get('success', None)
return{'success': success}
当脚本通过测试选项卡从 ZMI 运行 返回时,我希望结果为假,然后返回
{'success':错误}
但是,我似乎无法从 DTML-doc 调用成功变量。
应该提交表单,python 脚本应该是 运行 并验证 recaptcha,return 成功的值 (True/False) 然后是 dtml -if 应该决定如何继续处理表格。
我不确定,但我认为您应该尝试创建一个 dtml-method,而不是 dtml-doc。
https://zope.readthedocs.io/en/latest/zope2book/DTML.html#formatting-and-displaying-sequences
您还应该考虑使用 ZPT 而不是 DTML。
看第一条笔记:https://zope.readthedocs.io/en/latest/zope2book/DTML.html#basic-dtml
经过相当多的工作,并与许多不同的人交谈,Plone 论坛上一位非常友善的人向我指出了我做错了什么。我做得太难了,但已经很接近了。
这是 python 脚本(名为 recaptcha_validate):
import urllib
import urllib2
import json
REQUEST = container.REQUEST
URIReCaptcha = 'https://www.google.com/recaptcha/api/siteverify'
secret = 'XXXXXXXXXXX'
recaptcha_response = context.REQUEST['g-recaptcha-response']
remoteip = REQUEST.HTTP_X_FORWARDED_FOR
params = urllib.urlencode({
'secret': secret,
'response': recaptcha_response,
'remoteip': remoteip,
})
#print params
from urllib2 import urlopen
req = urllib2.Request(URIReCaptcha, params)
response = urllib2.urlopen(req)
result = json.load(response)
success = result.get('success', None)
return success
这里是 dtml-doc 的顶部,它检查提交是否被点击并选择如何处理表单:
<dtml-if submit>
<dtml-if recaptcha_validate>
<dtml-sendmail mailhost="MailHost">
To: info@foo.com
From: &dtml.lower-emailaddr;
Subject: Web Request
&dtml-message;
Sincerely,
&dtml-realname;
&dtml-emailaddr;
&dtml-phone;
&dtml-location;
</dtml-sendmail>
<dtml-else>
<dtml-sendmail mailhost="MailHost">
To: info@foo.com
From: &dtml.lower-emailaddr;
Subject: SPAM: Web Request
&dtml-message;
Sincerely,
&dtml-realname;
&dtml-emailaddr;
&dtml-phone;
&dtml-location;
</dtml-sendmail>
</dtml-if>
做一个简单的
<dtml-if recaptcha_validate>
运行 python 脚本并检查结果是否为真。在这种情况下不需要任何变量或表达式。真的就这么简单。
注意:使用
<dtml-sendmail>
标签,并且只想更改主题,我尝试用
包围主题:Web 请求行
<dtml-if recaptcha_validate>
声明。那是行不通的。你必须有两个完全独立的
<dtml-sendmail>
节才能正常工作。
使用 Zope 2.13.29 和 Python 2.7.15,我正在尝试使用从 DTML 文档调用的 Python 脚本来验证 Google 的 reCaptcha2。 DTML 文档包含表单,同一个 DTML 文档使用 dtml-if 语句来确定是否在用户单击提交后处理表单。在该 dtml-if 语句中有一个 dtml-in,它调用 python 脚本以验证 reCaptcha 和 return 成功值(True 或 False)。问题是我似乎无法获得成功的价值。
虽然我知道你们中的一些人可能倾向于谈论 RestrictedPython 以及我如何无法导入 Zope 使用的 python 模块,但那部分已经已搞定。一切正常,只是没有完成我需要它做的事情。
这是显示联系表的 dtml-doc,以及确定是否已单击提交,进而调用 python 脚本最终确定 returned 值来自 reCaptcha 的 Google 成功变量。
<dtml-if submit>
<dtml-with recaptcha-validate>
<dtml-if expr="'success' == True">
<dtml-sendmail mailhost="MailHost">
To: info@foo.com
From: &dtml.lower-emailaddr;
Subject: Web Request
&dtml-message;
Sincerely,
&dtml-realname;
&dtml-emailaddr;
&dtml-phone;
&dtml-location;
</dtml-sendmail>
<dtml-else>
<dtml-sendmail mailhost="MailHost">
To: info@foo.com
From: &dtml.lower-emailaddr;
Subject: SPAM: Web Request
&dtml-message;
Sincerely,
&dtml-realname;
&dtml-emailaddr;
&dtml-phone;
&dtml-location;
</dtml-sendmail>
</dtml-if>
</dtml-with>
<dtml-else submit>
<dtml-var "foo.sitefiles.doctype(_.None, _)">
<html>
<head>
<title>Contact Us</title>
<script src="https://www.foo.com/javascript/jquery/jquery-min.js" type="text/javascript"></script>
<script src="https://www.foo.com/javascript/parsley/parsley.min.js" type="text/javascript"></script>
<script src="https://www.foo.com/javascript/misc/placeholder.js" type="text/javascript"></script>
<script src="https://www.google.com/recaptcha/api.js"></script>
</head>
<body>
<form data-parsley-validate id="contact-form" method="post" action=<dtml-var URL0> novalidate="" parsley-validate="" parsley-focus="none" data-parsley-errors-messages-disabled data-parsley-excluded="input[name=g-recaptcha-response], input[id=recaptcha-token]">
<fieldset>
<label>NAME</label>
<input class="parsley-validated" type="text" name="realname" placeholder="Enter your name" value="" required="">
<label>E-MAIL</label>
<input class="parsley-validated" type="email" name="emailaddr" placeholder="Enter your e-mail" value="" required="" pattern="^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$">
<label>PHONE NUMBER</label>
<input class="parsley-validated" type="text" name="phone" placeholder="Enter your contact phone number" value="" required="" pattern="^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$">
<label>LOCATION</label>
<input class="parsley-validated" type="text" name="location" placeholder="Enter your city, state" value="">
<label>MESSAGE</label>
<textarea class="parsley-validated" name="message" placeholder="Enter your message here" value="" required="" rows="8"></textarea>
<input id="myField" data-parsley-errors-container="#errorContainer" data-parsley-required="true" value="" type="text" style="display:none;">
<div id="contactrecaptcha">
<div id="recaptchatoken" class="g-recaptcha" data-sitekey="XXXXXXXXXX" data- callback="recaptchaCallback"></div>
</div>
<span id='errorContainer'></span>
</fieldset>
<input type="submit" name="submit" value="SUBMIT">
</form>
<script type="text/javascript">
$('#contact-form').parsley();
function recaptchaCallback() {
document.getElementById('myField').value = 'nonEmpty';
}
</script>
</body>
</html>
</dtml-if>
这是 python 脚本(名为 recaptcha-validate):
import urllib
import urllib2
import json
REQUEST = container.REQUEST
URIReCaptcha = 'https://www.google.com/recaptcha/api/siteverify'
secret = 'XXXXXXXXXXXXXXXXXXX'
recaptcha_response = context.REQUEST['g-recaptcha-response']
remoteip = REQUEST.HTTP_X_FORWARDED_FOR
params = urllib.urlencode({
'secret': secret,
'response': recaptcha_response,
'remoteip': remoteip,
})
#print params
from urllib2 import urlopen
req = urllib2.Request(URIReCaptcha, params)
response = urllib2.urlopen(req)
result = json.load(response)
success = result.get('success', None)
return{'success': success}
当脚本通过测试选项卡从 ZMI 运行 返回时,我希望结果为假,然后返回
{'success':错误}
但是,我似乎无法从 DTML-doc 调用成功变量。
应该提交表单,python 脚本应该是 运行 并验证 recaptcha,return 成功的值 (True/False) 然后是 dtml -if 应该决定如何继续处理表格。
我不确定,但我认为您应该尝试创建一个 dtml-method,而不是 dtml-doc。
https://zope.readthedocs.io/en/latest/zope2book/DTML.html#formatting-and-displaying-sequences
您还应该考虑使用 ZPT 而不是 DTML。
看第一条笔记:https://zope.readthedocs.io/en/latest/zope2book/DTML.html#basic-dtml
经过相当多的工作,并与许多不同的人交谈,Plone 论坛上一位非常友善的人向我指出了我做错了什么。我做得太难了,但已经很接近了。
这是 python 脚本(名为 recaptcha_validate):
import urllib
import urllib2
import json
REQUEST = container.REQUEST
URIReCaptcha = 'https://www.google.com/recaptcha/api/siteverify'
secret = 'XXXXXXXXXXX'
recaptcha_response = context.REQUEST['g-recaptcha-response']
remoteip = REQUEST.HTTP_X_FORWARDED_FOR
params = urllib.urlencode({
'secret': secret,
'response': recaptcha_response,
'remoteip': remoteip,
})
#print params
from urllib2 import urlopen
req = urllib2.Request(URIReCaptcha, params)
response = urllib2.urlopen(req)
result = json.load(response)
success = result.get('success', None)
return success
这里是 dtml-doc 的顶部,它检查提交是否被点击并选择如何处理表单:
<dtml-if submit>
<dtml-if recaptcha_validate>
<dtml-sendmail mailhost="MailHost">
To: info@foo.com
From: &dtml.lower-emailaddr;
Subject: Web Request
&dtml-message;
Sincerely,
&dtml-realname;
&dtml-emailaddr;
&dtml-phone;
&dtml-location;
</dtml-sendmail>
<dtml-else>
<dtml-sendmail mailhost="MailHost">
To: info@foo.com
From: &dtml.lower-emailaddr;
Subject: SPAM: Web Request
&dtml-message;
Sincerely,
&dtml-realname;
&dtml-emailaddr;
&dtml-phone;
&dtml-location;
</dtml-sendmail>
</dtml-if>
做一个简单的
<dtml-if recaptcha_validate>
运行 python 脚本并检查结果是否为真。在这种情况下不需要任何变量或表达式。真的就这么简单。
注意:使用
<dtml-sendmail>
标签,并且只想更改主题,我尝试用
包围主题:Web 请求行<dtml-if recaptcha_validate>
声明。那是行不通的。你必须有两个完全独立的
<dtml-sendmail>
节才能正常工作。