安全兜底:涉及钱时短信必须考虑防刷、限量和防重

这篇具有很好参考价值的文章主要介绍了安全兜底:涉及钱时短信必须考虑防刷、限量和防重。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开放平台资源的使用需要考虑防刷

短信验证码服务属于开放性服务,由用户侧触发,且因为是注册验证码所以不需要登录就可以使用,很容易被短信轰炸平台利用

@GetMapping("wrong")
public void wrong() {
    sendSMSCaptcha("13600000000");
}

private void sendSMSCaptcha(String mobile) {
  //调用短信通道
}

对于短信验证码这种开放接口,程序逻辑内需要有防刷逻辑。

1. 控制相同手机号的发送次数和发送频次: 

限制同一手机号每天的最大请求次数, 频率

2. 增加前置图形验证码: 

短信轰炸平台一般会收集很多免费短信接口,一个接口只会给一个用户发一次短信,所以控制相同手机号发送次数和间隔的方式不够有效, 即将弹出图形验证码作为前置

虚拟资产并不能凭空产生无限使用

虚拟资产虽然是平台方自己生产和控制,但如果生产出来可以立即使用就有立即变现。比如,因为平台 Bug 有大量用户领取高额优惠券,并立即下单使用。

在商家看来,这很可能只是一个用户支付的订单,并不会感知到用户使用平台方优惠券的情况;同时,因为平台和商家是事后结算的,所以会马上安排发货。而发货后基本就不可逆了,一夜之间造成了大量资金损失。

我们从代码层面模拟一个优惠券被刷的例子。

假设有一个 CouponCenter 类负责优惠券的产生和发放。如下是错误做法,只要调用方需要,就可以凭空产生无限的优惠券:

@Slf4j
public class CouponCenter {
    //用于统计发了多少优惠券
    AtomicInteger totalSent = new AtomicInteger(0);
    public void sendCoupon(Coupon coupon) {
        if (coupon != null)
            totalSent.incrementAndGet();
    }

    public int getTotalSentCoupon() {
        return totalSent.get();
    }

    //没有任何限制,来多少请求生成多少优惠券
    public Coupon generateCouponWrong(long userId, BigDecimal amount)              {
        return new Coupon(userId, amount);
    }
}

这样一来,使用 CouponCenter 的 generateCouponWrong 方法,想发多少优惠券就可以发多少:

@GetMapping("wrong")
public int wrong() {
    CouponCenter couponCenter = new CouponCenter();
    //发送10000个优惠券
    IntStream.rangeClosed(1, 10000).forEach(i -> {
        Coupon coupon = couponCenter.generateCouponWrong(1L, new BigDecimal("100"));
        couponCenter.sendCoupon(coupon);
    });
    return couponCenter.getTotalSentCoupon();
}

更合适的做法是,把优惠券看作一种资源,其生产不是凭空的,而是需要事先申请

接下来,我们按照这个思路改进一下程序。

首先,定义一个 CouponBatch 类,要产生优惠券必须先向运营申请优惠券批次,批次中包含了固定张数的优惠券、申请原因等信息:

//优惠券批次
@Data
public class CouponBatch {
    private long id;
    private AtomicInteger totalCount;
    private AtomicInteger remainCount;
    private BigDecimal amount;
    private String reason;
}

在业务需要发放优惠券的时候,先申请批次,然后再通过批次发放优惠券:

@GetMapping("right")
public int right() {
    CouponCenter couponCenter = new CouponCenter();
    //申请批次    
    CouponBatch couponBatch = couponCenter.generateCouponBatch();
    IntStream.rangeClosed(1, 10000).forEach(i -> {
        Coupon coupon = couponCenter.generateCouponRight(1L, couponBatch);
        //发放优惠券
        couponCenter.sendCoupon(coupon);
    });
    return couponCenter.getTotalSentCoupon();
}

可以看到,generateCouponBatch 方法申请批次时,设定了这个批次包含 100 张优惠券。在通过 generateCouponRight 方法发放优惠券时,每发一次都会从批次中扣除一张优惠券,发完了就没有了:

public Coupon generateCouponRight(long userId, CouponBatch couponBatch) {
    if (couponBatch.getRemainCount().decrementAndGet() >= 0) {
        return new Coupon(userId, couponBatch.getAmount());
    } else {
        log.info("优惠券批次 {} 剩余优惠券不足", couponBatch.getId());
        return null;
    }
}


public CouponBatch generateCouponBatch() {
    CouponBatch couponBatch = new CouponBatch();
    couponBatch.setAmount(new BigDecimal("100"));
    couponBatch.setId(1L);
    couponBatch.setTotalCount(new AtomicInteger(100));
    couponBatch.setRemainCount(couponBatch.getTotalCount());
    couponBatch.setReason("XXX活动");
    return couponBatch;
}

这样改进后的程序,一个批次最多只能发放 100 张优惠券:在通过 generateCouponRight 方法发放优惠券时,每发一次都会从批次中扣除一张优惠券,发完了就没有了

钱的进出一定要和订单挂钩并且实现幂等

涉及钱的进出,需要做好以下两点。

第一,任何资金操作都需要在平台侧生成业务属性的订单,可以是优惠券发放订单,可以是返现订单,也可以是借款订单,一定是先有订单再去做资金操作。

第二,一定要做好防重,也就是实现幂等处理,并且幂等处理必须是全链路的。这里的全链路是指,从前到后都需要有相同的业务订单号来贯穿,实现最终的支付防重。

关于这两点,你可以参考下面的代码示例:

//错误:每次使用UUID作为订单号
@GetMapping("wrong")
public void wrong(@RequestParam("orderId") String orderId) {
    PayChannel.pay(UUID.randomUUID().toString(), "123", new BigDecimal("100"));
}

//正确:使用相同的业务订单号
@GetMapping("right")
public void right(@RequestParam("orderId") String orderId) {
    PayChannel.pay(orderId, "123", new BigDecimal("100"));
}
//三方支付通道
public class PayChannel {
    public static void pay(String orderId, String account, BigDecimal amount) {
        ...
    }
}

对于支付操作,我们一定是调用三方支付公司的接口或银行接口进行处理的。一般而言,这些接口都会有商户订单号的概念,对于相同的商户订单号,无法进行重复的资金处理,所以三方公司的接口可以实现唯一订单号的幂等处理。

但是,业务系统在实现资金操作时容易犯的错是,没有自始至终地使用一个订单号作为商户订单号,透传给三方支付接口。出现这个问题的原因是,比较大的互联网公司一般会把支付独立一个部门。支付部门可能会针对支付做聚合操作,内部会维护一个支付订单号,然后使用支付订单号和三方支付接口交互。最终虽然商品订单是一个,但支付订单是多个,相同的商品订单因为产生多个支付订单导致多次支付。

如果说,支付出现了重复扣款,我们可以给用户进行退款操作,但给用户付款的操作一旦出现重复付款,就很难把钱追回来了,所以更要小心。

这,就是全链路的意义,从一开始就需要先有业务订单产生,然后使用相同的业务订单号一直贯穿到最后的资金通路,才能真正避免重复资金操作。

重点回顾

第一,使用开放的、面向用户的平台资源要考虑防刷,主要包括正常使用流程识别、人机识别、单人限量和全局限量等手段。

第二,虚拟资产不能凭空产生,一定是先有发放计划、申请批次,然后通过批次来生产资产。这样才能达到限量、有审计、能追溯的目的。

第三,真实钱的进出操作要额外小心,做好防重处理。不能凭空去操作用户的账户,每次操作以真实的订单作为依据,通过业务订单号实现全链路的幂等控制。如果程序逻辑涉及有价值的资源或是真实的钱,我们必须有敬畏之心。程序上线后,人是有休息时间的,但程序是一直运行着的,如果产生安全漏洞,就很可能在一夜之间爆发,被大量人利用导致大量的金钱损失。文章来源地址https://www.toymoban.com/news/detail-802755.html

到了这里,关于安全兜底:涉及钱时短信必须考虑防刷、限量和防重的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 接口安全验证及防刷处理方案

    暴露在外网的api接口需要做到 防篡改 和 防重放 才能保证接口安全。 比如:短信验证接口,支付接口,请求时长超过1S以上的 防篡改 我们知道http 是一种无状态的协议,服务端并不知道客户端发送的请求是否合法,也并不知道请求中的参数是否正确。 举个例子, 现在有个充

    2024年01月16日
    浏览(38)
  • 未充分考虑物联网设备的安全需求

    1.1 安全漏洞与安全隐患的识别和发现 为了充分考虑到物联网设备的安全需求,我们需要首先了解和发现其可能面临的安全漏洞及隐患。这些安全漏洞可能包括: - 密码泄露:物联网设备通常需要设置复杂且独特的密码来确保数据安全和防止黑客攻击。 - 恶意代码:物联网设

    2024年02月03日
    浏览(39)
  • 网络安全涉及到的知识积累(5)

    1.bp里的raw、params、headers、hex几个格式分别表示什么? Raw:web请求的raw格式,包含请求地址、http协议版本、主机头、浏 览器信息、Accept可接受的内容类型、字符集、编码方式、cookie等。我们可以手工去修改这些信息,对服务器端进行渗透测试。 params:客户端请求的参数信息

    2024年02月11日
    浏览(35)
  • 选择安全数据交换系统时 要考虑哪些因素?

    安全数据交换系统是一种专门设计用于在不同的网络环境(如内部不同网络,内部网络和外部网络)之间安全传输数据的解决方案。它通常包括一系列的技术和流程,旨在确保数据在传输过程中的完整性、机密性和可用性。 安全数据交换系统可以解决以下问题: 1、数据安全

    2024年01月16日
    浏览(42)
  • WEB安全测试通常要考虑的测试点

    1、问题:没有被验证的输入 测试方法: 数据类型(字符串,整型,实数,等) 允许的字符集 最小和最大的长度 是否允许空输入 参数是否是必须的 重复是否允许 数值范围 特定的值(枚举型) 特定的模式(正则表达式) 2、问题:有问题的访问控制 测试方法: 主要用于需

    2024年02月15日
    浏览(47)
  • 云平台与基础架构中需要考虑哪些安全风险

    云计算平台能为组织带来特殊收益,并具备多种卓越能力,包括性能和可伸缩性 (Scalability)、消除了硬件依赖、帮助组织将工作重点聚焦于业务运营需求,以及可计量服务 (Measured Service)一 所有特性都可能比组织运营自有数据中心的总体成本和投资更低。然 而,基于同样的因

    2024年02月01日
    浏览(43)
  • 无缝安全的云迁移:需要考虑的首要事项

    毫无疑问,未来就在云中:它不仅可以为组织节省资金,还可以为他们提供更敏捷、更灵活的基础架构。但是,低估云迁移带来的安全问题总是错误的。随着云变得越来越先进,网络犯罪分子也在增加。将安全性构建到云基础架构中对于可持续增长至关重要。 安全性和合规性

    2024年02月13日
    浏览(46)
  • CTF逆向涉及的各种加密算法与网络安全

    在CTF竞赛中,逆向工程是一项常见的技能,旨在分析和破解各种加密算法以达到解决问题的目的。逆向工程涉及的加密算法种类繁多,下面将介绍几种常见的加密算法,并提供相应的源代码示例。 替换密码(Substitution Cipher) 替换密码是一种简单的加密算法,它通过替换明文

    2024年02月08日
    浏览(44)
  • 出于网络安全考虑,印度启用本土操作系统”玛雅“取代Windows

    据《印度教徒报》报道,印度将放弃微软系统,选择新的操作系统和端点检测与保护系统。 备受期待的 \\\"玛雅操作系统 \\\"将很快用于印度国防部的数字领域,而新的端点检测和保护系统 \\\"Chakravyuh \\\"也将一起面世。 不过,印度国防部尚未证实此事,也未发布官方消息。 由于微软

    2024年02月13日
    浏览(44)
  • 在前端开发中需要考虑的常见web安全问题和攻击原理以及防范措施

    随着互联网的发展,Web应用程序越来越普及,但是Web安全问题也随之增加。前端开发者作为Web应用程序的构建者之一,需要了解和掌握Web安全的基本知识和解决方案。本文将介绍前端开发者必须知道的Web安全问题和防范措施。 一、XSS攻击 XSS攻击指的是跨站脚本攻击,是一种

    2024年01月20日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包