坏人可以针对电话验证或双因素认证流量,人为地提高短信流量。某些运营商有意或无意地允许这种情况发生,欺诈者利用这种膨胀的流量来赚钱。这可能会导致你的Twilio流量高于预期。
我们用于发送一次性密码的Verify API包括全面的欺诈缓解机制。然而,没有任何供应商方的解决方案可以保证100%有效地对付复杂的攻击者,这就是为什么我们鼓励客户参与防止攻击。
幸运的是,Twilio的Lookup API可以检测运营商,我们可以利用这一点在发送短信验证之前过滤掉已知的不良行为者。
下面是一个快速的阻止列表的例子片段:
const accountSid = process.env.TWILIO_ACCOUNT_SID;
const authToken = process.env.TWILIO_AUTH_TOKEN;
const client = require("twilio")(accountSid, authToken);
// hard coded for demo purposes only
const block = ["12301", "12302"];
client.lookups
.phoneNumbers("+15108675310")
.fetch({type: ["carrier"]})
.then((resp) => {
const mccmnc = resp.carrier.mobile_country_code + resp.carrier.mobile_network_code
if (block.includes(mccmnc)) {
// block or add additional checks
console.log("blocked!");
} else {
// proceed with sending one time passcode
console.log("allowed!");
}
});
这篇文章的其余部分将介绍用Twilio Lookup API构建这个解决方案。
如何在代码中定义一个运营商。MCC和MNC
移动国家代码(MCC)和移动网络代码(MNC)的组合是全球唯一的,用于识别世界各地的运营商。注意:MCC和MNC不适用于座机号码。
如果有的话,这个数据会在运营商查询响应中返回:
{
"caller_name": null,
"carrier": {
"error_code": null,
"mobile_country_code": "310",
"mobile_network_code": "456",
"name": "verizon",
"type": "mobile"
},
"country_code": "US",
"national_format": "(510) 867-5310",
"phone_number": "+15108675310",
"add_ons": null,
"url": "https://lookups.twilio.com/v1/PhoneNumbers/+15108675310"
}
攻击者通常会使用相同的前缀向一系列连续的号码发送请求,所以要注意来自相同前缀的未经检查的验证流量。如果你选择封锁前缀,值得在一段时间后解除封锁,以便重新允许合法流量。
你可以在这个网站上找到所有MCC-MNCs的列表:https://www.mcc-mnc.com/,以及移动电话前缀的列表。
建立运营商检测列表的先决条件
要与本帖一起编码,你需要:
第1步:注册或登录你的Twilio账户
第2步: 安装Node JSnodejs.org/en/download
第3步:安装Twilio CLI(了解更多)
npm install -g twilio-cli
第4步:安装Serverless CLI插件
twilio plugins:install @twilio-labs/plugin-serverless@1.9.0
第5步:用你的Twilio账户凭证登录CLI
twilio login
下载Lookup启动模板
使用CLI,从Twilio代码交易所克隆国际电话输入模板。
twilio serverless:init lookup-block-list --template=international-telephone-input && cd lookup-block-list
打开.env文件,确保你的Twilio账户凭证(ACCOUNT_SID 和AUTH_TOKEN)已经被填入,你可以在Twilio控制台找到你的凭证。你可以通过运行来启动该应用。
twilio serverless:start
在浏览器中打开http://localhost:3000/index.html;你应该能够输入你的电话号码,并看到它是E.164格式。

该应用程序已经做了一件非常方便的事情,即接受国际格式的号码并将其转换为标准的E.164格式。然后,Lookup API会验证该号码是否有效。如果你尝试只输入12345 或任何其他无效的电话号码,你会得到一个错误。
在你的注册表上添加一个阻止列表
在生产环境中避免硬编码这些值。我们建议从外部存储中加载列表,如配置文件或数据库,以便在不改变代码本身的情况下更容易更新列表。
要添加一个块状列表,打开functions/lookup.js 文件,在const client = ... 之后添加以下一行。
const block = ["12301", "12302"];
这个列表是使用移动国家代码(MCC)和移动网络代码(MNC)来识别运营商,Lookup API也使用这些代码。我们的列表是虚构的,但你可以通过这个网站确定MCC-MNC的组合。为了通过不同的MCC+MNCs对你的验证进行细分,开始跟踪这些细节,这样你就可以围绕哪些运营商可以更多或更少的信任有更多的见解。
如果你看一下函数的其余部分,你可能会注意到,我们实际上没有使用来自Lookup API的响应。为了利用响应并获取返回的运营商,请将以response.setStatusCode(200); 开始的5行代码块替换为:
const mccmnc = resp.carrier.mobile_country_code + resp.carrier.mobile_network_code
if (block.includes(mccmnc)) {
response.setStatusCode(401);
response.setBody({
success: false,
error: "Carrier not allowed.",
});
return callback(null, response);
} else {
response.setStatusCode(200);
response.setBody({
success: true,
});
return callback(null, response);
}
最后,到assets/index.html ,更新第73行,以报告该函数的错误信息:
error.innerHTML = json.error;
确保项目运行在twilio serverless:start ,前往http://localhost:3000/index.html,并进行测试!然后尝试将你的手机号码MCC-MNC组合添加到阻止列表中,看看错误信息 "不允许运营商"。
封锁运营商的替代方法
封锁整个运营商确实有阻断合法流量的风险,所以你可以使用查询API响应来检测风险较大的号码,并添加reCAPTCHAs等保护措施来防止机器人。
你也可以用这篇博文中描述的类似方法阻止或允许来自某些国家的验证。
你也可以使用WhatsApp渠道而不是短信来发送验证码(即将进入Verify API)。
如果你怀疑你的账户有欺诈行为,该怎么做?
如果您在Authy或Verify API上面临信息滥用,您可以发送电子邮件至 fraud@twilio.com。请在您的信息中包括以下细节。
Account SID:
Product Type (Authy or Verify):
Date/time Range:
To/Recipient Country:
Workspace SID:
Description of Activity: