防止JSON域名欺骗

3
这是一个场景。客户已经拥有一个电子商务网站,他们正在收集发货地址信息和信用卡数据。然而,他们注册了一个SaaS服务,使他们能够轻松地更改他们的信用卡表单,以便将全名和电子邮件(而非信用卡信息)收集到营销系统中进行其他用途。因此,他们从SaaS服务中复制了一个jQuery片段到他们的页面上,并向他们的表单和表单字段标签添加一些"data-"属性,以便SaaS服务知道要拦截什么数据,并在何处发布数据到哪个SaaS账户。
好的,但随后出现了安全问题。假设我们在该SaaS系统中有两个独立的客户。一个名叫Jack,拥有jack.com,其帐户ID为100001。另一个是Nancy,nancy.com,和100002。Jack可以将代码片段添加到他的表单中,并添加一些"data-"属性,但如果他在其中一个"data-"属性中设置他的帐户ID为100002而不是100001,则会出现安全问题。这意味着Nancy会突然在她的帐户中看到Jack的数据。不好!当然,解决方法是在Jack的SaaS帐户中设置一些设置,使他只接受来自jack.com的数据,而Nancy只接受来自nancy.com的数据。
但是,可能会出现潜在的漏洞。黑客只需在自己的服务器上创建一个欺骗页面,其中形成类似的JSON,并通过工作站上的/ etc / hosts文件更改使其看起来像是jack.com。因为SaaS服务认为信息来自jack.com,所以他可以向Jack的帐户中发送成千上万个虚假的营销表单信息。
在jQuery代码或SaaS服务使用的PHP代码中,有什么我可以做的来确保黑客无法进行欺骗,只有Jack的真实客户数据被发送? 已回答的问题 Q1. “您如何识别Jack和Nancy?通过域名吗?”
A1. Jack拥有他的域名jack.com。Nancy拥有她的域名nancy.com。两者都使用这个营销SaaS服务,但在注册SaaS服务之前,它们已经共同使用了一种电子商务表单。他们在SaaS文档中被告知,“只需在表单页面中放置scraper.js,并将这些数据标签添加到您的表单标记和HTML输入、文本区域和选择标记中,以便scraper.js可以暂时拦截这些表单提交,从该表单中获取营销数据(例如全名和电子邮件),然后让该表单按照您已经拥有的工作流程进行提交。数据属性将标识要使用哪个帐户,以及将此数据存储在SaaS服务中的哪个营销活动和子活动中。”然而,在scraper.js的jQuery中,它将传递JSON的location.href属性,以便知道使用了哪个域名 - jack.com还是nancy.com,在这种特定情况下。问题是 - location.href可以被黑客欺骗,他在工作站上设置了一个127.0.0.1的/ etc / hosts文件条目,运行相同的JSON代码的副本。

问题2:“如果您可以使用从SaaS.com到jack.com的回调机制,那该怎么办?因此,您的一个数据属性将指定回调函数以接收来自SaaS.com的数据,并且只在获得正确响应时保存数据?”

答案2:这真是一个有趣的想法。是的,所以我可以在jack.com上放置额外的PHP页面,发出“OK”。当SaaS.com从jack.com接收JSON数据后,它会向jack.com上的第二个PHP回调页面发送请求,并使用file_get_contents()确保不仅获取OK响应,还要匹配IP地址和SSL证书数据。如果两者不同,则最有可能请求是伪造的黑客请求,可以安全记录并拒绝交易。(我可以轻松进行IP地址验证,但不确定如何在PHP中验证相同的两个SSL证书,即使这是允许或可能的。)当然,IP地址可以被欺骗。

另一层安全性是,这个第二个PHP页面可以使用SaaS.com和jack.com之间的公钥/私钥交换通信检查,而不仅仅是发出“OK”。

问题3:“为什么要拦截付款信息并通过Javascript发送?”

A3. 绝对不是的。这个问题从来没有指定发送付款信息。相反,是要求提供全名和电子邮件等信息。是的,为了安全地发送数据,需要使用SSL通信。此外,我们还需要使用JSONP以解决CORS问题
A4. 不需要。请参阅答案A2。通过该机制,SaaS应用程序接收数据,但在发生以下两件事之前不信任它:
  1. 它回调到jack.com的第二个页面,并确保返回的响应具有与首次发送表单数据的IP地址相同的IP地址。

  2. 在第二个页面中进行公钥/私钥交换检查(黑客显然无法欺骗除非他们有服务器访问权限),以确保未发生IP欺骗。

问题5. 稍等片刻。A2和A4存在问题。最初发送请求的IP地址将来自用户的工作站,而不是服务器。因此,您无法通过这种方式验证IP。您将不得不使用另一种机制来验证某人是否在jack.com上完成了表单,并且它不是来自欺骗jack.com的黑客。

答案5. 您说得对。我忘记了这一点,可能因为我在处理另一个项目时有些分心。我需要再考虑一下这个问题。


1
你如何识别 Jack 和 Nancy?按域名吗? - cetver
1
Google Analytics经常遭受这种攻击,将垃圾链接放入您的引荐跟踪中。我不确定你能做什么。用户可以访问所有必需的代码来欺骗信息。 - ceejayoz
@Volomike 那不需要 jack.com 把所有内容都保存在数据库中以进行验证吗?如果是这样,为什么还要使用SaaS应用程序呢? - ceejayoz
@ceejayoz,我编辑了我的问题来回答你。答案是否定的。 - Volomike
2
如果你在谈论使用JavaScript集成,请求的IP地址始终来自最终用户,而不是某个PHP服务器。 - Sam Dufel
显示剩余8条评论
1个回答

1

简而言之:如果您使用纯客户端集成(仅使用javascript),则没有完全保护请求的方法。

意外/故意向错误的客户端发送数据

您可以通过使用非连续的随机UUID作为帐户ID来减轻这种情况。例如,如果帐户ID看起来像100001,则有人可能会尝试使用帐户ID 100002; 但是,如果帐户ID看起来像c3f80e491d44cd91664a0459a0777ed01,那么某人能够将数据发送到未知帐户的概率是极小的。

故意垃圾邮件/虚构提交

这是互联网上存储数据的任何表单都存在的问题;我不知道是否有任何方法可以在没有一些服务器端代码的帮助下解决这个问题。

您可以生成一次性令牌,以包含在json有效负载中 - 这可以是类似于经过HMAC安全验证的日期JWT令牌或使用共享密钥加密的设置消息,然后由SAAS服务器进行去重处理。

如果您要开始涉及服务器端编程,那么这个额外的协商过程就有点无关紧要了——更容易的方法是只需给电子商务网站一个API密钥,让他们在收到订单时发布客户信息。

哦,那么我们可以告诉开发人员不仅要在其页面上添加jQuery代码片段以及一些标签上的数据属性,而且jQuery还必须定位到我们提供的jack.com上的PHP脚本。然后,这将使用公钥/私钥加密算法对数据进行加密,并将其发送到SaaS.com,或者至少通过公钥/私钥哈希执行SSL HTTP POST,以便SaaS.com信任数据并防止黑客伪造数据(或MTM)。 - Volomike
1
@Volomike 有什么阻止别人多次运行jQuery调用的方法吗? - ceejayoz
啊,说得好。所以黑客创建了一些jQuery来向jack.com的PHP脚本发送大量请求。我想我们需要添加一个系统,在一天或一小时内仅允许每个IP地址发送有限数量的请求。我们可能还需要在表单中添加一个nonce,这将需要另一个PHP脚本。 - Volomike
1
@Volomike 是的。然后有人用僵尸网络来攻击。 - ceejayoz
一种技巧是定期更换API密钥,虽然这意味着需要编辑表单的HTML以便向新的API密钥注册。这会给黑客带来一些挫败感,并为安全性增加了一个层次。虽然这不是完美的,但对于黑客来说又是一个挫败的层面。 - Volomike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接