如何保护AWS API网关URL免受未经授权的访问?

时间:2017-12-06 10:11:38

标签: amazon-web-services amazon-s3 aws-lambda aws-api-gateway

我想在AWS S3中托管我的静态网站。但它包含“联系我们”页面,用于发送电子邮件。当用户单击提交按钮时,它会将请求发送到AWS API网关,API网关会触发lambda函数; lambda函数将邮件发送给Admin。

但它有一些问题。当我们在服务器上托管网站时,我们可以使用验证码来阻止提交请求自动化和欺诈活动。在这种情况下,任何人都可以滥用(通过在URL中传递查询字符串发送更多请求)我知道它的API网关URL。

所以我的问题是如何知道仅从我的网站请求提交请求并且有没有办法使用而不是使用Captcha ?。

3 个答案:

答案 0 :(得分:1)

使用API​​网关和Lambda验证reCAPTCHA

对于S3静态站点上无服务器SPA站点上的Contact Forms,我使用AngularJS和" angular-recaptcha" service(https://github.com/VividCortex/angular-recaptcha),尽管您可以使用任何方式获取和POST重新计算值。

在后端,您可以使用API​​网关调用Lambda函数来验证重新接收值并执行某些操作。使用NodeJS和Recaptcha2(https://www.npmjs.com/package/recaptcha2)来验证令牌。

file.y

使用把手和SES的示例模板电子邮件

作为奖励,以下是我重复使用html /文本模板发送电子邮件的一些代码:

  • 手柄将值注入模板SES以发送电子邮件。
  • 确保您已使用您的域名设置SES,并将Lambda许可给" ses:SendEmail"和" ses:SendEmailRaw"。
  • 在部署函数时添加环境变量,这使得代码可以重用,并将秘密保留在源代码之外。
  • 我强烈建议使用无服务器框架来部署无服务器应用程序。 https://serverless.com

为我服务:)

var reCAPTCHA = require('recaptcha2')

module.exports.sendemail = (event, context, callback) => {

    // parse the data that was sent from API Gateway
    var eventData = JSON.parse(event.body);

    // Prepare the recaptcha connection to Google
    var recaptcha = new reCAPTCHA({
      siteKey: process.env.RECAPTCHA_KEY,
      secretKey: process.env.RECAPTCHA_SECRET
    })

    // Validate the recaptcha value
    recaptcha.validate(eventData.recaptcha)
        .then(function(){
            // validated ok
            console.log("ReCaptcha Valid")


            ... DO STUFF HERE ...


        })
        .catch(function(errorCodes){

            // invalid recaptcha
            console.log("ReCaptcha Not Valid")

            // translate error codes to human readable text
            console.log(recaptcha.translateErrors(errorCodes));

            // send a fail message with cors headers back to the UI
            var response = {
                statusCode: 500,
                headers: {
                    "Access-Control-Allow-Origin" : "*",
                    "Access-Control-Allow-Credentials" : true
                },
                body: JSON.stringify({"message":"Error: Invalid Recaptcha"})
            }
            callback(null, response);
        });
};

编辑:修复语法错误

答案 1 :(得分:0)

您可以在http上使用Referer标头。它由浏览器设置。

答案 2 :(得分:0)

Googles reCAPTCHA看起来相当简单 -

https://developers.google.com/recaptcha/intro 闯入 -

  1. 使用验证码(https://developers.google.com/recaptcha/docs/display)验证用户
  2. 验证回复(https://developers.google.com/recaptcha/docs/verify
  3. 这可以通过API网关端点和lambda轻松实现(你的秘密将在lambda [也许作为env变量],站点密钥将进入s3静态站点)

    无论如何为什么不设计自己的验证机制(如果你真的想自己做东西:))?在让用户提交(或提交...)之前询问用户电话号码。然后调用API网关端点获取此编号并通过SNS发送otp。一旦用户验证此otp(另一个api网关呼叫),则仅发送管理员电子邮件(进行进一步处理)。你可以存储这个otp是一些带有验证布尔标志的rds。您不必担心这些API网关端点,因为它们实际上仅用于身份验证,并且可以通过云端自动扩展。