首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

支付寶企業金流接口 URL 參數篡改風險與防範指南

     編輯:關於ASP.NET

攻擊鏈路還原

  1. 用戶下單 → B2C 生成支付 URL(含金額、訂單號、MD5 簽名)
  2. 攻擊者攔截 URL → 修改 amount=100.00 → amount=0.01
  3. 重新計算 MD5(算法公開) → 構造惡意 URL → 跳轉支付寶
  4. 用戶支付 0.01 元 → 支付寶回調「支付成功」
  5. B2C 只驗證「成功」狀態 → 訂單標記「已付款」 → 發貨

核心漏洞:缺乏金額一致性驗證

支付寶只保證「該訂單已支付」,不保證「支付金額等於訂單金額」。

雙重防護方案

支付寶端(根治)

  • 參數加密傳輸:AES/RSA 加密敏感字段,密鑰由支付寶管理
  • 簽名算法升級:RSA2 (SHA256) 替代 MD5,私鑰不離支付寶
  • 金額鎖定:下單時預創建支付寶訂單,返回 trade_no,前端不可篡改金額

B2C 端(必須)

// 回調處理關鍵邏輯
public ActionResult AlipayNotify(AlipayNotifyModel model) {
    // 1. 驗證簽名(防篡改)
    if (!AlipayVerify.Verify(model)) return Content("fail");
    
    // 2. 核心:金額一致性檢查
    var order = _orderRepo.Get(model.out_trade_no);
    if (order == null) return Content("fail");
    
    if (Math.Abs(order.Amount - model.total_fee) > 0.01m) {
        Log.Warn($"金額不符: 訂單{order.Amount} vs 支付{model.total_fee}");
        AlertRiskControl(order.Id, model.total_fee);
        return Content("fail"); // 拒絕確認
    }
    
    // 3. 幂等性:防止重複處理
    if (order.Status == OrderStatus.Paid) return Content("success");
    
    order.MarkPaid(model.trade_no, model.gmt_payment);
    _orderRepo.Save(order);
    return Content("success");
}

檢查清單

  • ☐ 回調必驗金額(含幣種)
  • ☐ 簽名驗證使用官方 SDK 最新版
  • ☐ 訂單狀態機防重複確認
  • ☐ 異常金額觸發風控告警
  • ☐ 日誌留存滿足審計要求(≥6年)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved