沙箱技术是一种重要的计算机安全机制,主要用于隔离程序运行环境,以防止恶意代码或应用程序对系统和数据造成破坏。通过限制代码的访问权限和行为,沙箱为程序提供了一个受控且隔离的执行环境。
核心特点
- 隔离性沙箱运行的程序被限制在一个受控的环境中,无法直接访问主机系统的其他资源(如文件系统、网络、硬件等)。
- 限制权限沙箱会对程序的行为进行权限约束,例如限制文件读写、网络访问和系统调用。
- 可控性开发者或系统管理员可以自定义沙箱的环境设置,例如允许或禁止某些操作。
- 安全性沙箱能有效阻止恶意软件利用系统漏洞扩展攻击范围,即使代码有漏洞或恶意行为,其影响也局限于沙箱内。
应用场景
- Web 浏览器浏览器使用沙箱隔离网页内容和插件,防止恶意网站攻击用户的系统。例如,Google Chrome 为每个标签页和扩展运行一个独立的沙箱进程。
- 移动操作系统
- AndroidAndroid 使用应用沙箱(App Sandbox)隔离每个应用,限制它们对系统资源和其他应用数据的访问。
- iOSiOS 通过类似机制保护用户隐私和系统完整性。
- 虚拟化和容器化技术虚拟机(VM)和容器(如 Docker)使用沙箱技术隔离不同的工作负载,确保安全性和独立性。
- 安全测试在沙箱环境中运行未知或潜在危险的程序,用于恶意软件分析和漏洞挖掘。
- 在线服务云服务使用沙箱隔离用户进程,防止越权或资源滥用。
具体实现
@Data
@Component
@ConfigurationProperties("alipay")
public class ZhiFuBao {
private String appId;
private String appPrivateKey;
private String alipayPublicKey;
private String notifyUrl;
private String returnUrl;
private String signType;
private String charset;
private String gatewayUrl;
private String timeOut = "1m";
}
alipay:
# 应用ID,标识你的应用
appId: 应用id
# 应用私钥,用于签名请求
appPrivateKey: 私钥
# 应用公钥,用于验证支付宝的响应
alipayPublicKey: 公钥
notifyUrl: http:/127.0.0.1//pay/notify
# 页面跳转地址,支付完成后跳转到此URL
returnUrl: https://b.alipay.com/page/home
# 签名类型,通常为RSA2
signType: RSA2
# 字符编码,通常为utf-8
charset: utf-8
# 支付宝网关地址,用于发送请求
gatewayUrl: https://openapi-sandbox.dl.alipaydev.com/gateway.do
@Data
@Component
public class AlipayTemplate {
@Autowired
private ZhiFuBao zhiFuBao;
public String pay(Orders order) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient(
zhiFuBao.getGatewayUrl(),
zhiFuBao.getAppId(),
zhiFuBao.getAppPrivateKey(),
"json",
zhiFuBao.getCharset(),
zhiFuBao.getAlipayPublicKey(),
zhiFuBao.getSignType());
//2、创建一个支付请求,并设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(zhiFuBao.getReturnUrl());// 设置支付成功后的返回地址
alipayRequest.setNotifyUrl(zhiFuBao.getNotifyUrl());// 设置支付结果通知地址
String number = UUID.randomUUID().toString(); // 获取订单ID
Long interfaceInfoId = order.getId(); // 获取接口信息ID
BigDecimal money = order.getIndentMoney(); // 获取支付金额
Integer payType = order.getPayType(); // 获取支付方式
// 设置业务内容,包含必要的支付参数
alipayRequest.setBizContent(
"{" +
"\"out_trade_no\":\"" + number + "\"," +
"\"total_amount\":\"" + money + "\"," +
"\"subject\":\"" + interfaceInfoId + "\"," +
"\"body\":\"" + payType + "\"," +
"\"timeout_express\":\"" + zhiFuBao.getTimeOut() + "\"," +
"\"product_code\":\"FAST_INSTANT_TRADE_PAY\"" +
"}"
);
// 执行支付请求并获取支付宝的响应
String result = alipayClient.pageExecute(alipayRequest).getBody();
//会收到支付宝的响应,响应的是一个页面,只要浏览器显示这个页面,就会自动来到支付宝的收银台页面
System.out.println("支付宝的响应:" + result);
//返回支付宝响应的结果
return result;
}
}
@RestController
@RequestMapping("pay")
public class PayController {
@Resource
private AlipayTemplate alipayTemplate;
@Autowired
private OrdersService ordersService;
/**
* 获取支付订单
* @param id
* @return
* @throws AlipayApiException
*/
@GetMapping(value = "/{id}",produces = "text/html")
public String pay(@PathVariable("id") Long id) throws AlipayApiException {
Orders byId = ordersService.getById(id);
return alipayTemplate.pay(byId);
}
/**
* 确认是否支付成功
* @param request
* @return
* @throws Exception
*/
@PostMapping("/notify")
public String notify(HttpServletRequest request) throws Exception {
if (!"TRADE_SUCCESS".equals(request.getParameter("trade_status"))) {
return "false";
}
Map<String, String> map = new HashMap<>();
request.getParameterMap().keySet().forEach(key -> {
map.put(key, request.getParameter(key));
});
String outTradeNo = map.get("out_trade_no");
String gmtPayment = map.get("gmt_payment");
String tradeNo = map.get("trade_no");
//验证签名
if (Factory.Payment.Common().verifyNotify(map)){
LambdaQueryWrapper<Orders> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(Orders::getId, outTradeNo);
queryWrapper.eq(Orders::getStatus, 5);
ordersService.update(queryWrapper);
}
return "true";
}
}
这样就成功了
如果出现报错如:
控制台可以打印出来但是页面进不去
因为沙箱不是支付宝正式环境所以会出现这种问题
1.新建pay.html文件
2.把控制台打印出了的html代码粘到html里
3.然后在进行操作就好了