java 安全 笔记

Java安全编码指南的笔记 阅读详情

java  安全

1.类加载器 Classloader

每个java程序最少有三个类加载器,引导类加载器、扩展类加载器、系统类加载器(应用类加载器)

引导类加载器没有Classloader,String.class.getClassloader()为null,是虚拟机的一部分。负责加载系统类,通常从rt.jar中加载。

扩展类加载器从jre/lib/ext目录中加载标准的的扩展。

系统类加载器 加载classpath环境变量中的类

除了引导类加载器以外,每个类加载器都有一个父类加载器,加载时先用父加载器加载,当父加载器加载失败时,再加载。

通过Classloader.defineClass可以将字节码加载为Class


2.字节码校验

当类加载器将新加载的java平台类的字节码传递给虚拟机时,这写字节码首先要接受校验器(verifier)的校验。校验器负责检查那些无法执行的明显有破坏性的操作。

出系统类外,所有的类都要校验。可以使用非正式的-noverify选项来关闭校验。


3.安全管理器与访问权限

一旦某个类被某个类加载器或者默认的类加载机制加载到虚拟机中,并由校验器检查过之后,java平台的第三种安全机制就会启动。这个机制就是安全管理器。安全管理器是控制某个操作是否允许执行的类,安全管理器负责检查的操作包括

当前线程是否能创建一个新的类加载器

当前线程是否能够中止虚拟机的运行

某个类是否能够访问另一个类的成员

当前线程是否能够访问本地文件

当前线程是否能够打开到达外部主机的socket连接

某个类是否能够启动打印操作

某个类是否能访问系统剪切板

某个类是否能访问AWT事件队列

当前线程是否可被信任以打开一个顶层窗口等


在运行java应用程序时,默认的设置是不安装安全管理器,这样所有的操作都被允许。

Python爬虫实战:5分钟搞定政府网站公开数据抓取(附完整代码) 本文详细介绍了如何使用Python爬虫快速抓取政府网站公开数据,包括环境配置、网站结构分析、请求头构建、数据处理与存储等关键步骤。通过实战案例和完整代码,帮助开发者高效获取结构化数据,适用于数据分析、市场研究等场景。 阅读详情

相关推荐

【学习路线】 游戏客户端开发入门到进阶

游戏开发是一个交叉性极强的技术领域,对开发者提出了高维度的要求。作为初学者,不要急于求成,打牢基础、注重原理、勤于实践,你的成长将会非常快速而稳健。希望这份学习路线与书单能为你指明方向,迈出职业开发者的第一步。

hhw_hhw的博客 2128

java安全--字节码校验

1.先来了解下字节码校验在类加载流程中的位置        当类加载器将新加载的Java平台类的字节码传递到虚拟机时,这些字节码首先要接受校验器的校验。校验器负责检查那些无法执行的明显有破坏性的操作。除了系统类之外,其他类都要被校验。2.字节码校验器主要做的事情变量要在使用之前进行初始化方法调用与对象引用类型之前要匹配访问私有数据和方法的规则没有被违背对本地变量的访问落在运行时堆栈内运行时堆栈没有...

shareing 6790

Agent 操作系统:未来的 Harness 平台

在大模型技术爆发的当下,自主智能体(Agent)已经成为AI原生应用的核心载体,但当前Agent开发面临着碎片化严重、运维难度高、规模化落地难三大核心痛点,就像1970年代没有通用操作系统的裸机编程时代,开发者需要重复造轮子解决底层基础设施问题。本文将深度解析Agent操作系统(Agent OS)作为AI原生时代的底层基础设施的核心定位,以及下一代Harness平台如何将Agent OS与成熟的DevOps、CI/CD、可观测性、成本管理能力深度融合,成为AI原生应用全生命周期管理的统一平台。

软件工程实践的博客 278

Java安全防御学习笔记V1.0

Java安全防御学习笔记V1.0http://www.docin.com/p-766808938.html 转载于:https://www.cnblogs.com/hackchecker/p/3553604.html

weixin_30655219的博客 124

Unity VR 零基础开发之 Pico4 MR

2、弹出弹窗后,点击Android选项,然后再点击Switch Platform按钮切换成安卓平台。3、切换完成后Android选项后面会显示unity图标。

十画的博客 5104

QT | QT打包生成单个EXE文件

1.以release方式运行程序 2.在release文件夹中找到.exe文件 如果没有找到exe,可能是因为在项目中勾选了shadow build,你可以在构建目录中找到exe 3.将exe放在一个新建的文件夹中,因为待会儿会生成很多dll文件 4.点击电脑左下角搜索QT,打开Qt 5.8 for Desktop (MinGQW 5.3.0 32bit) 5.进入刚刚新建的文件夹,输入wi...

⊳ideal world⊲~ヽ(゚︺゚)Hi 1238

小迪安全v2023学习笔记(六十六讲)—— Java安全&SQL注入&SSTI&SPEL&XXE

本文介绍了Java安全中的SQL注入、SSTI注入、SPEL注入和XXE注入等漏洞类型。重点讲解了Java环境下SQL注入的几种常见场景:JDBC语句拼接、预编译错误使用、JdbcTemplate以及正则过滤不当等问题,并提供了相应的防护建议。同时详细说明了MyBatis框架中因使用${}语法导致的SQL注入风险,特别是like模糊查询场景下的安全隐患。文中还包含两个Java安全实验环境(Hello-Java-Sec和JavaSec)的搭建教程,指导读者配置MySQL5.7数据库和运行测试项目。通过实际案例

uli0n的博客 1428

流程图详解Transformer最核心的多头注意力机制,QKV流向清晰明了

本文详细讲解了Transformer模型中的多头注意力机制(Multi-head Attention)。通过类比多人评估同一事物的不同视角,说明多头机制能综合多个注意力权重获得更有效的输出。文章逐步推导了多头注意力的计算过程:将输入矩阵X(4×512维)分别与8组Q、K、V权重矩阵相乘,得到8组head(每组4×64维),拼接后经Wo矩阵变换恢复为4×512维输出。整个过程涉及37个待训练参数矩阵(1个Wo、8组Wq/Wk/Wv)。该机制通过并行计算多个注意力头,能更全面捕捉输入特征间的复杂关系。

人工智能研究所的博客 259

小迪安全v2023学习笔记(六十八讲)—— Java安全&原生反序列化&SpringBoot攻防

本文主要介绍了Java安全中的原生反序列化漏洞原理及利用方法。重点分析了Java原生序列化类函数(如SnakeYaml、XMLDecoder、ObjectInputStream.readObject)的特征和检测方式,并演示了如何通过工具(ysoserial、Yakit)生成利用链进行攻击。同时针对SpringBoot框架,讲解了heapdump内存提取敏感信息的攻防技巧。文中提供了详细的靶场演示案例,包括readObject、XMLDecoder、SnakeYAML等多种反序列化漏洞的利用方式,并指出不同

uli0n的博客 1649

华为OD技术面八股文_C++_02

汇总华为OD面试C++方面计数八股文真题,提供详细解答。

qq_45776114的博客 766

ChatGPT充值,银行卡被拒绝,图文教程

ChatGPT充值,银行卡被拒绝

weixin_46713695的博客 2万+

小迪安全v2023学习笔记(六十七讲)—— Java安全&JNDI注入&五大不安全组件&RCE&不出网

本文摘要了小迪安全第67天课程内容,重点分析了Java安全中的五大类RCE执行函数(Runtime、ProcessBuilder、ProcessImpl、Groovy、LoadJsExec)及其利用方式,并详细讲解了JNDI注入在RMI和LDAP服务中的应用原理及版本限制问题。同时介绍了不安全组件(如Log4j)的黑盒/白盒测试思路,强调通过参数可控性审计漏洞。课程提供了相关源码资源和实战靶场演示,帮助学员掌握Java安全攻防技术。

uli0n的博客 1676

学Simulink——基于风力发电系统的建模与仿真场景:基于自适应控制的风力发电系统输出功率调节

本文详细介绍了使用Simulink搭建风力发电系统自适应控制模型的完整流程。首先阐述了风速波动对电网的影响及自适应控制的优势,然后逐步指导创建Simulink项目、搭建系统结构(包括风速源、风轮机、发电机等模块),重点讲解了模型参考自适应控制器(MRAC)的设计步骤和参数设置方法。通过仿真分析验证了系统在风速变化时仍能保持输出功率稳定,展示了自适应控制的响应速度和鲁棒性。最后提出了引入深度学习预测、多变量控制等优化方向,为新能源领域工程师提供了实用的建模与仿真指导。

amy_mhd的博客 220

《Java并发编程实战》笔记——线程安全性

《Java并发编程实战》笔记 基础知识 线程安全性 如果当多个线程访问同一个可变的状态参量时没有使用合适的同步,那么程序就会出现错误。 有三种方式可以修复这个问题: 不在线程之间共享该变状态变量 将状态变量修改为不可变的变量 在访问状态变量时使用同步 当设计线程安全的类时,良好的面向对象技术、不可修改性,以及明晰的不变性规范都能起到一定的帮助作用。 编写并发程序应用时,一种正确的编程方法:首先使代码正确运行,然后再提高代码的速度。即便如此,最好也只是当性能测试结果和应用需求告诉你必须提高性能,以及测量结

fromscratchx的博客 251

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

《Effective Java》读书笔记,移动安全入门

equals()方法实现了等价关系。 自反性。对于任何非null的引用值x,x.equals(x)必须返回true.(对象必须等于其自身) 对称性。对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true。(警惕子类父类不同的equals实现时) 传递性。对于任何非null的引用只x、y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.equeals(z)也必须返回true。(优先使用组合

m0_66264938的博客 223

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java安全入门笔记(持续更新)

这段代码在没有确定传入的参数是什么的时候,它的功能是未知的。这就是说在编译完成时,它的功能并没完全固定,它的功能会随着不同的情况产生不定的变化。之前陆陆续续学过一点Java安全,笔记一直都没没有系统的写过,现在重新深入学一下之前的知识,会把笔记持续更新过来。现在,已经大致了解了Java的类加载过程,继续来看看Java是通过什么东西来实现类加载的。Java 中类加载是通过类加载器实现的,在Java中类加载器可以分为4种。线程共享,是各个线程共享的内存区域,它用于存储已被虚拟机加载的。

why811的博客 282

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【Java面试笔记:安全】32.如何写出安全的Java代码?

编写安全的Java代码需要从设计到实现的每个环节都遵循安全最佳实践。安全的Java代码需要: - 最小权限原则(如数据库账户只读)。 - 深度防御(多层防护机制)。 - 持续更新依赖和补丁(如修复Log4j漏洞)。 - 团队安全培训(提升安全意识)。 通过工具自动化(如CI/CD集成安全检查)和严格代码审查,可显著降低安全风险。

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 1027

java 线程的安全问题,java笔记

线程安全的本质体现在两个方面,A变量安全:多线程同时运行一段代码B线程同步:一个线程还没执行完,另一个线程又进来接着执行。看个简单的例子。Java代码public class ThreadSafe implements java.lang.Runnable {int num = 1;public void run() {for (int i = 0; i < 3; i++) {num = n...

weixin_29958449的博客 83

Java学习笔记:安全编程详解

Java学习笔记:安全编程详解

weixin_46619605的博客 852

JAVA线程安全学习笔记之线程安全

问题: 线程安全,线程同步。为什么发生线程安全,线程同步问题。如何解决? 核心思想: 上锁。 代码从哪里上锁?----可能会发生线程安全的地方进行上锁。 通俗的讲就是我们更改数据的地方。那 是锁方法,锁类,锁代码块 ? 锁:分布式锁、公平锁,非公平锁、重入锁、悲观锁、乐观锁。 锁的机制: 在同一个JVM中,多个线程需要竞争锁资源。多个线程同时抢同一把锁,谁拿到锁资源,谁执行相关代码。 如果没有获取成功,中间需要经历锁升级过程,如果一直没有获取到锁就一直阻塞等待。 加锁的缺点:可能影响到程序的执

shiXiaoChenblog的博客 222

Java Security安全系列文档翻译笔记————数字签名、keystore、证书

讲述Java关于证书、密钥、Keystore,已经如何获取CA的证书,什么是自签名。

zhjali123的专栏 1832

Java并发编程实战读书笔记——第二章线程安全性

645132

MADE_哒哒 488

笔记_Java提升安全性

应用程序可能容易受到两类安全性威胁的攻击: 动态 和 静态。 动态威胁: 是那些同未经授权进入系统有关的威胁,或那些与跨越网络传输的数据的完整性、隐私和机密性有关的威胁。这些威胁同应用程序的功能代码没有多大关系;使用加密、加密术和认证技术来消除这些威胁。 静态威胁: 相比之下,静态威胁却同应用程序的功能代码有关;它们同进入系统的授权用户所做的事情有关。未知用户闯入系统是动态威胁的一个示例;授权用户以未授权方式操作系统内的代码或数据是静态威胁的示例。 应用程序开发人员并不能完全控制动态威胁;但开发人员

weixin_42547014的博客 582

JAVA安全漫谈1-8笔记

classloader就是java的类加载器,告诉虚拟机如何加载这个类。默认情况下根据类名来加载类,类名必须是完整路径{}括号里的是初始化块,这里面的代码在创建java对象时执行,而且在构造器之前执行!其实初始化块就是构造器的补充,初始化快是不能接收任何参数的,定义的一些所有对象共有的属性、方法等内容时就可以用初始化块了初始化!好处是可以提高初始化块的复用,提高整个应用的可维护性。

wfz2333的博客 1497

Java多线程实现以及线程安全笔记

Java虚拟机允许应用程序并发地运行多个线程。 以下为多线程的实现常用的2种方法 (1)继承Thread类,重写run()方法      Thread本质上也是实现了Runnable接口的一个实例,代表一个线程的实例。启用线程的唯一方法就是通过Thread类的start()方法。调用start()方法后并不是立即执行多线程代码,而是使得该线程变为可运行态(Running),什么时候运行是由操...

weixin_39791537的博客 221

蹊源的Java笔记—线程并发与线程安全

溪源的Java笔记之线程并发与线程安全 前言 上期博客我们对线程与线程池相关知识进行了总结,实际上我们在使用线程的过程中有不得不提的问题就是线程并发与线程安全,我们在为了提升系统性能的时候,采用多线程的方式,就有可能会造成数据不安全,本篇文章溪源将带领大家了解一下线程并发与线程安全相关的知识。 线程与线程池可参考我的博客:溪源的Java笔记之线程与线程池 正文 线程并发 线程并发,指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行

蹊源的奇思妙想的博客 2471
上一篇: OSI七层网络模型与TCP/IP四层网络模型
下一篇: 常用模式术语
GeoJava
博客等级 码龄19年 3粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值