保护公共API免受不必要的“提交”

时间:2020-06-05 04:45:39

标签: javascript api widget web-component

一段时间以来,我一直在摆弄这个问题,但到目前为止还没有一个令人满意的解决方案。

我们目前正在创建一个新的公共API,小部件将使用该API来获取信息,还将信息回传到系统中(例如联系表单)。由于这些小部件将作为Web组件实现,并且可以在任何页面上实现,因此我们无法控制这些小部件的交付方式。

我现在面临的问题是:如何保护API避免不必要的提交(除了常规表单验证),以便我们可以安静地确定它是来自该表单的提交还是合法的POST。 API?

我担心的是,这种情况下的所有内容都是可欺骗的(例如,获取表单令牌并将其作为标头提交,验证原始标头等),因为它很容易被欺骗,例如使用Postman。对于您的任何经验和向正确方向的提示,我都会感到非常高兴。

2 个答案:

答案 0 :(得分:1)

我认为您可以尝试:

  • 基于IP的速率限制
  • 一般插入的速率限制
  • 发送后要求验证电子邮件(如果您有此数据)
  • 保存发件人IP并检查旧数据,以了解是否有人滥用(监视提示,但这也许不是个坏主意)
  • 验证码可避免恶意发件人(但一点也不)

您是否实施了类似的措施?也许通过查看您拥有的东西,我们可以看到缺少的东西。

它也很复杂,因为它是公开的,并允许从任何系统访问。评估身份验证系统,并从小部件本身进行身份验证,并结合密钥限制,也许是个好主意。

答案 1 :(得分:0)

如果您具有未经身份验证的公共API,
您所能做的就是让黑客尽可能地难以访问。

换句话说:在门上放更多/复杂的锁... 但是可以捡到任何锁

使用URI的“锁定”代码

我们用来使WebComponent保持“安全”的方法,
是从长URI加载WebComponent:

(现代浏览器不再具有2048个字符的URI限制)

https://domain/p1/p2/customeElements/define/secure-api/HTMLElement/p7/p8/webcomponent.js

然后,组件代码解码 URI到

let p = [domain,p1,p2,"customElements","define","secure-api","HTMLElement",p7,p8]

执行JavaScript:

window[p[3]][p[4]](p[5],class extends window[p[6]]{ ...

更多锁

如果您进行了一些BtoA / AtoB和String.reverse()转换

https://domain/AH=V/CV=/==QYvRnY/aW5uZXJ/IVE1M/webcomponent.js

您吓倒了大多数潜在的黑客

更多锁

通过生成webcomponent.js 服务器端以使用/domain/部分,
较长的URI可以成为服务器和客户端之间的(唯一)握手

更复杂的锁

由于所有状态都在URI中,因此很容易应用地址 shifting 机制,
每个请求都可以是不同的URI(使PostMan无法使用,并且调试起来也很麻烦:-)

[并且我们应用了一些其他的技巧,在这里我不会解释]

这不会将黑客拒之门外,但会延迟足够长的时间,让大多数人放弃。

还有捕鼠器

在我们的代码/ URI编码中,我们还引用了唯一的“ mousetrap ” URI。
如果我们在该子目录中检测到404活动,则表明有人正在主动选择锁。
并且..我们可以交互式地将其引导/定向到更多的捕鼠器。

到目前为止,我们只有一次尝试。

一个电话(因为我们知道买家网域)足以让他们停下来。

[非常知名的] IT公司X的Hello IT经理,
如果,我们检测到您公司IP地址nn.nn.nn.nn的黑客攻击尝试,
根据法律,我们必须将此事报告给当局

HTH