【发布时间】:2017-01-08 16:12:18
【问题描述】:
这是场景。客户已经有一个电子商务网站,他们正在其中收集送货地址信息和信用卡数据。但是,他们注册了一项 SaaS 服务,使他们能够轻松更改他们的信用卡表格同时收集全名和电子邮件(不是信用卡信息)到营销系统中用于其他目的。因此,他们从 SaaS 服务将 jQuery sn-p 粘贴到他们的页面中,并在他们的表单和表单字段标签中添加一些“数据”属性,以便 SaaS 服务知道要拦截什么以及将数据发布到哪个 SaaS 帐户的位置.
好的,但随后出现安全问题。假设我们在那个 SaaS 系统中有两个不同的客户。一个叫 Jack,拥有 jack.com,他的帐户 ID 是 100001。另一个是 Nancy、nancy.com 和 100002。Jack 可以将 sn-p 添加到他的表单中并添加一些“data-”属性,但随后搞砸了,将其中一个数据属性中的帐户 ID 设置为 100002 而不是 100001。这意味着南希会突然在她的帐户中看到杰克的数据。不好!当然,解决方法是在 Jack 的 SaaS 帐户中进行一些设置,以便他只接受来自 jack.com 的数据,而 Nancy 只接受来自 nancy.com 的数据。
但随后发生了潜在的漏洞利用。黑客所要做的就是在他自己的服务器上创建一个欺骗页面,在其中形成类似的 JSON,并通过他工作站上的 /etc/hosts 文件更改,使他看起来像是 jack.com。然后,他可以将成千上万的虚假营销表格信息发送到 Jack 的帐户中,因为 SaaS 服务认为这些信息来自 jack.com。
我可以在 jQuery 代码或 SaaS 服务使用的 PHP 代码中做些什么来确保黑客无法进行这样的欺骗,并且只发送 Jack 的真实客户数据?
已回答的问题
第一季度。 “你如何识别 Jack 和 Nancy?按域?”
A1。 Jack 拥有自己的域名 jack.com。 Nancy 拥有她的域 nancy.com。每个人都使用这种营销 SaaS 服务,但每个人也都选择了他们在注册 SaaS 服务之前已经拥有的电子商务表格。他们在 SaaS 文档中被告知,“只需将 scraper.js 放到您的表单页面中,并将这些数据标签添加到您的表单标签和 html 输入、textarea 和选择标签中,以便 scraper.js 可以暂时拦截这些表单提交,从该表单中收集营销数据(比如说全名和电子邮件),然后让该表单在您已有的工作流程中提交。数据属性将识别要使用的帐户以及营销这些数据应存储在 SaaS 服务中的活动和子活动。”然而,在 scraper.js 的 jQuery 中,它将在 JSON 中传递 location.href 属性,以便它知道使用了哪个域——在这个特定的实例中是 jack.com 或 nancy.com。问题是 - location.href 可以被黑客欺骗,他在他的工作站上为 jack.com 设置了一个 127.0.0.1 的 /etc/hosts 文件条目并运行相同 JSON 代码的副本。
第二季度。 “如果您可以使用从 SaaS.com 到 jack.com 的回调机制会怎样?因此,您的数据属性之一将指定回调函数以从 SaaS.com 接收数据,然后仅在正确时保存数据回应?”
A2。现在这是一个有趣的观点。是的,所以我想在 jack.com 上放置一个额外的 PHP 页面,它会发出“OK”。当 SaaS.com 收到来自 jack.com 的 JSON 数据发布时,它会使用 file_get_contents() 向 jack.com 上的第二个 PHP 回调页面发送请求,以确保它不仅获得 OK 响应,而且还获得 IP 匹配地址和 SSL 证书数据。如果两者不同,则该请求很可能是伪造的黑客请求,并且可以安全记录并拒绝交易。 (我可以轻松地进行 IP 地址验证,但不确定如何在 PHP 中验证相同的两个 SSL 证书,如果允许或可能的话。)当然,IP 地址可以被欺骗。
另一个安全层是第二个 PHP 页面可以使用 SaaS.com 和 jack.com 之间的公钥/私钥交换通信检查,而不是简单地发出“OK”。
第三季度。 “为什么要拦截付款信息并通过 Javascript 发送出去?”
A3。绝对不。从未在此问题中指定发送付款信息。而是说全名和电子邮件之类的东西。是的,为了安全地发送数据,还需要使用 SSL 通信。而且,我们必须使用JSONP to get around the CORS problem。
第四季度。 “那不需要 jack.com 将所有内容都保存在数据库中以供验证吗?如果是这样,为什么还要麻烦 SaaS 应用程序?”
A4。没有。一点也不。查看答案 A2。使用该机制,SaaS 应用程序接收数据,但在发生 2 件事之前不信任它:
-
它将 jack.com 回调到第二个页面,并确保它返回的响应与最初发送表单数据的 IP 地址具有相同的 IP 地址。
李> -
它会在第二页中进行公钥/私钥交换检查(除非他们具有服务器访问权限,否则黑客显然无法进行欺骗),以确保没有发生 IP 欺骗。
李>
Q5。等一下。 A2 和 A4 有问题。初始发送请求的 IP 地址将来自用户的工作站,而不是服务器。因此,您无法以这种方式验证 IP。您必须使用另一种机制来验证是否有人在 jack.com 上填写了表单,并且该表单不是来自欺骗 jack.com 的黑客。
A5。你是绝对正确的。我猜是因为我在另一个项目上稍微分心了。我得再考虑一下。
【问题讨论】:
-
你如何识别杰克和南希?按域?
-
@cetver 我编辑了问题以反映该答案。
-
您可以向 SaaS 发送额外的数据属性吗? SaaS 提供回调(用户请求 -> 您的回调 -> 根据回调返回值保存数据)?您可以对 SaaS 中保存的文档执行 CRUD 操作吗?
-
Google Analytics 经常以这种方式受到攻击,将垃圾链接放入您的推荐跟踪中。我不确定你能做些什么。用户可以访问欺骗内容所需的所有代码。
-
如果您在谈论使用 javascript 集成,请求的 IP 地址将始终来自最终用户,而不是某个 PHP 服务器。
标签: php jquery security hash public-key