我在reCAPTCHA v3应用程序中使用Google Angular 2来防止自动提交表单。我的应用程序在后台进行许多网络呼叫,因为用户'与UI互动。
从index.html
开始,我故意进行阻止调用以加载库(阻止Angular世界在加载recaptcha/api.js
之前进入):
<script src="https://www.google.com/recaptcha/api.js?render=reCAPTCHA_site_key"></script>
从Angular Service的构造函数中,我使用DOCUMENT DI token来引用grecaptcha
对象:
constructor(@Inject(DOCUMENT) private document: any) {
this.grecaptcha = this.document.grecaptcha;
}
加载应用程序后(使用lifecycle hooks),上述Angular服务调用grecaptcha.execute
以获取唯一token
(根据Frontend Integration指南) :
public executeCaptcha() {
this.grecaptcha.ready(() => {
this.grecaptcha
.execute(MyService.CAPTCHA_KEY, {
action: 'execute'
})
.then((token: string) => this.token = token);
});
}
token
是回调的参数,并存储为Angular服务的成员(this.token = token)
)。
此时,应用程序尚未对我的后端进行任何API调用,也未将用户验证为人员。
token
必须发送到我的后端服务器,后端必须verify the user's response API Request。
然后可以将API Response返回到浏览器(Angular app):
{
"success": true|false,
"challenge_ts": timestamp, // timestamp of the challenge load (ISO format yyyy-MM-dd'T'HH:mm:ssZZ)
"hostname": string, // the hostname of the site where the reCAPTCHA was solved
"error-codes": [...] // optional
}
问题
token
应用程序,并每次验证?
答案 0 :(得分:0)
如果您想确保安全,则每次用户通过表单发布数据时,都必须发送令牌(每次都是新令牌)。否则,如果用户发现您只是在他第一次单击发布时就在检查他,那么他就可以运行selenium或其他脚本程序,因为他的会话已经过验证。
请注意,您每次都需要向Google询问新令牌。首先,因为它们只允许您一次使用一个令牌,其次,令牌在到期之前具有很短的生存时间。这两个边界是为了防止我上面描述的漏洞。
当然,在安全性和性能之间总是要权衡取舍。我不建议您缓存验证数据,但是对于某些轻量级搜索,您可以考虑使用它,但是在发布数据,更新或删除数据时,我强烈建议您不要这样做。