You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何防止非支付网关向ASP.NET回调页面提交支付响应数据

针对First Atlantic Commerce支付回调的安全防护方案

以下方案均适配C# ASP.NET .NET Framework 4.0环境:

1. 优先校验FAC官方返回的数字签名(核心防护)

FAC的3dsecureAuthorize回调会默认返回签名字段,是官方使用你提前配置的商户密钥,对所有返回参数按指定规则加密生成的,这是防伪造的最核心手段:

  • 首先对照FAC官方开发文档确认签名生成规则,一般为:提取所有非签名返回参数、按字典序排序、拼接为字符串后追加商户密钥,再用SHA1/MD5算法加密
  • 在Success.aspx处理业务逻辑前,先按照上述规则重新计算签名,和回调返回的签名字段做一致性对比,不一致直接拒绝请求
    示例代码:
/// <summary>
/// 校验FAC回调签名
/// </summary>
/// <param name="formParams">回调POST的所有表单参数</param>
/// <param name="merchantSecret">你在FAC后台配置的商户密钥</param>
public bool VerifyFACSignature(NameValueCollection formParams, string merchantSecret)
{
    // 过滤掉签名字段,按规则排序剩余参数
    var validParams = formParams.AllKeys
        .Where(key => !string.Equals(key, "signature", StringComparison.OrdinalIgnoreCase))
        .OrderBy(key => key)
        .ToList();
    // 拼接待加密字符串
    string rawSignStr = string.Join("", validParams.Select(key => formParams[key])) + merchantSecret;
    // 按FAC指定算法生成签名,.NET Framework 4.0可直接用FormsAuthentication工具类
    string computedSign = FormsAuthentication.HashPasswordForStoringInConfigFile(rawSignStr, "SHA1");
    // 对比签名,忽略大小写
    return string.Equals(computedSign, formParams["signature"], StringComparison.OrdinalIgnoreCase);
}

2. 配置回调IP白名单

  • 从FAC官方获取所有回调服务器的IP段,在服务器防火墙、IIS站点配置中,单独给Success.aspx页面加访问限制,仅允许FAC的IP段发起请求
  • 也可以在Success.aspx的Page_Load逻辑中加入IP校验逻辑,示例:
// 替换为FAC官方提供的真实回调IP列表
private readonly List<string> AllowedFACCbackIPs = new List<string> { "192.xxx.xxx.xxx", "45.xxx.xxx.xxx" };
protected void Page_Load(object sender, EventArgs e)
{
    // 仅允许POST请求
    if(Request.HttpMethod != "POST")
    {
        Response.StatusCode = 405;
        Response.End();
        return;
    }
    // 校验请求IP
    string clientIP = Request.UserHostAddress;
    if (!AllowedFACCbackIPs.Contains(clientIP))
    {
        Response.StatusCode = 403;
        Response.End();
        return;
    }
    // 后续先执行签名校验,再处理业务
}

3. 本地交易数据预校验+幂等控制

  • 你调用3dsecureAuthorize方法发起支付请求时,务必在本地数据库存储该笔交易的订单号、交易金额、交易状态(标记为待支付)、请求时间
  • 收到回调时,首先查询本地订单:订单不存在、状态不是待支付、回调返回的金额/订单号和本地存储不一致时,直接拒绝处理
  • 完成签名校验后,主动调用FAC官方提供的交易查询接口,二次确认该笔交易的真实状态,确认支付成功后再更新本地订单状态,避免极端场景下的伪造请求

4. 额外防护配置

  • 禁止Success.aspx响应GET请求,仅开放POST方法
  • 不要在前端任何公开代码、日志中暴露Success.aspx的完整路径
  • 回调处理逻辑加入请求频率限制,避免恶意遍历攻击

内容的提问来源于stack exchange,提问作者Vijeeshkumar vofox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 01:36:06