如何防止非支付网关向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
相关产品推荐
相关产品推荐

