首页 > 解决方案 > 将连接帐户的 Stripe 费用 ID 和帐户 ID 公开给客户端是否安全?

问题描述

我正在对后端进行 ajax 调用,我想知道将charge idand暴露connected account id给客户端是否安全?

我在浏览器端没有任何密钥或任何东西。

谢谢!

一旦点击退款按钮,我就会调用它:

$.ajax({
            type: "POST",
            data: {amount: pennies.toFixed(0), charge: chargeId, account: accountId},
            url: "/refund",
            success: function(data){
          //f.e. set to modal
          $('#refund_dialog').modal('hide')
            $('#refund_dialog').on('hidden.bs.modal', function () {
                    alert(JSON.stringify(data));
                  })

        },
        error: function(err) {
            $('#refund_dialog').modal('hide')

            $('#refund_dialog').on('hidden.bs.modal', function () {
                    alert(err.responseText);
                  })
    });

标签: javascriptnode.jsajaxstripe-payments

解决方案


不安全

如果黑客决定创建一个程序,通过输入随机帐户 ID、收费 ID 和退款 ID 来发出数百万次退款请求,会发生什么?

结果可能是要求数以千计的退款......

相反,您应该将所有这些数据(帐户 ID、费用 ID 和退款 ID)存储到正在处理(或转发)事务的服务器上的数据库中的一个表中。

这三段数据应使用使用某些 UUID 生成器(例如 OpenSSL)生成的密钥进行存储,以确保不会生成冲突的 ID。

UUIUD 应该是数据库中数据的键。

退款按钮应该简单地通过 AJAX 发送相同的 UUID,此时服务器将使用 UUID 查找必要的数据,然后通过 Stripe 发送相关数据。


它不安全的另一个原因

通过将帐户 ID 返回给用户,如果他们的网络浏览器已被恶意扩展程序/附加组件/插件/等破坏,那么现在黑客可以获取用户的帐户 ID,从而为他们提供关键的他们可以用来伪造其他请求等的信息。

永远不要假设发送给客户端的数据会被可靠地接收或返回。

仅当数据要显示给客户时才应将数据发送给客户(例如,上面有他们的帐户 ID 的页面)。

同时,发送到客户端的数据绝不应该用作任何服务器端操作的输入,因为这允许伪造请求,可能让黑客访问您的后端系统。

另一种方式不安全

如果黑客熟悉您的后端系统(Stripe 或其他),那么他们可以确定您的 API 密钥,如果他们能够通过向远程转发网络请求和从远程转发网络请求来对您的服务器执行中间人类型的攻击地点。这可以让您网站的不同部分完全不连接到任何 Stripe 交互,成为一个网关,允许他们发送特制请求(使用随机帐户 ID、费用 ID、金额),然后在数据加密后查看数据使用您的 API 密钥,并能够解码该数据以获得您的秘密 API 密钥。

相反,通过使用 UUID,黑客无法将拼图的两个部分连接在一起,从而使其免受 MITM 攻击。


推荐阅读