[云原生]接口安全方案提供和实践

2023-03-30 20:11:16 来源: 腾讯云

为什么要保证接口安全

对于互联网来说,只要你系统的接口暴露在外网,就避免不了接口安全问题。 如果你的接口在外网裸奔,只要让黑客知道接口的地址和参数就可以调用,那简直就是灾难。


(资料图片仅供参考)

举个例子:你的网站用户注册的时候,需要填写手机号,发送手机验证码,如果这个发送验证码的接口没有经过特殊安全处理,那这个短信接口早就被人盗刷不知道浪费多少钱了。

那如何保证接口安全呢?

一般来说,暴露在外网的api接口需要做到防篡改防重放才能称之为安全的接口。

防篡改

我们知道http 是一种无状态的协议,服务端并不知道客户端发送的请求是否合法,也并不知道请求中的参数是否正确。

举个例子, 现在有个充值的接口,调用后可以给用户增加对应的余额。

http://localhost/api/user/recharge?user_id=1001&amount=10

如果非法用户通过抓包获取到接口参数后,修改user_id 或 amount的值就可以实现给任意账户添加余额的目的。

1,如何解决

采用https协议可以将传输的明文进行加密,但是黑客仍然可以截获传输的数据包,进一步伪造请求进行重放攻击。如果黑客使用特殊手段让请求方设备使用了伪造的证书进行通信,那么https加密的内容也会被解密。

一般的做法有2种:

采用https方式把接口的数据进行加密传输,即便是被黑客破解,黑客也花费大量的时间和精力去破解。接口后台对接口的请求参数进行验证,防止被黑客篡改;步骤1:客户端使用约定好的秘钥对传输的参数进行加密,得到签名值sign1,并且将签名值也放入请求的参数中,发送请求给服务端步骤2:服务端接收到客户端的请求,然后使用约定好的秘钥对请求的参数再次进行签名,得到签名值sign2。步骤3:服务端比对sign1和sign2的值,如果不一致,就认定为被篡改,非法请求。

防重放

防重放也叫防复用。简单来说就是我获取到这个请求的信息之后什么也不改,,直接拿着接口的参数去 重复请求这个充值的接口。此时我的请求是合法的, 因为所有参数都是跟合法请求一模一样的。重放攻击会造成两种后果:

针对插入数据库接口:重放攻击,会出现大量重复数据,甚至垃圾数据会把数据库撑爆。针对查询的接口:黑客一般是重点攻击慢查询接口,例如一个慢查询接口1s,只要黑客发起重放攻击,就必然造成系统被拖垮,数据库查询被阻塞死。

对于重放攻击一般有两种做法:

基于timestamp的方案

每次HTTP请求,都需要加上timestamp参数,然后把timestamp和其他参数一起进行数字签名。因为一次正常的HTTP请求,从发出到达服务器一般都不会超过60s,所以服务器收到HTTP请求之后,首先判断时间戳参数与当前时间比较,是否超过了60s,如果超过了则认为是非法请求。

一般情况下,黑客从抓包重放请求耗时远远超过了60s,所以此时请求中的timestamp参数已经失效了。 如果黑客修改timestamp参数为当前的时间戳,则sign1参数对应的数字签名就会失效,因为黑客不知道签名秘钥,没有办法生成新的数字签名。

但是这种方式的漏洞也是显而易见,如果在60s之内进行重放攻击,那就没办法了,所以这种方式不能保证请求仅一次有效。

老鸟们一般会采取下面这种方案,既可以解决接口重放问题,又可以解决一次请求有效的问题。

基于nonce + timestamp 的方案

nonce的意思是仅一次有效的随机字符串,要求每次请求时该参数要保证不同。实际使用用户信息+时间戳+随机数等信息做个哈希之后,作为nonce参数。

此时服务端的处理流程如下:

去 redis 中查找是否有 key 为 nonce:{nonce}的 string如果没有,则创建这个 key,把这个 key 失效的时间和验证 timestamp 失效的时间一致,比如是 60s。如果有,说明这个 key 在 60s 内已经被使用了,那么这个请求就可以判断为重放请求。

这种方案nonce和timestamp参数都作为签名的一部分传到后端,基于timestamp方案可以让黑客只能在60s内进行重放攻击,加上nonce随机数以后可以保证接口只能被调用一次,可以很好的解决重放攻击问题。

代码实现

接下来以SpringBoot项目为例看看如何实现接口的防篡改和防重放功能。

1、构建请求头对象

@Data@Builderpublic class RequestHeader {   private String sign ;   private Long timestamp ;   private String nonce;}

2、工具类从HttpServletRequest获取请求参数

@Slf4j@UtilityClasspublic class HttpDataUtil {    /**     * post请求处理:获取 Body 参数,转换为SortedMap     *     * @param request     */    public  SortedMap getBodyParams(final HttpServletRequest request) throws IOException {        byte[] requestBody = StreamUtils.copyToByteArray(request.getInputStream());        String body = new String(requestBody);        return JsonUtil.json2Object(body, SortedMap.class);    }​​    /**     * get请求处理:将URL请求参数转换成SortedMap     */    public static SortedMap getUrlParams(HttpServletRequest request) {        String param = "";        SortedMap result = new TreeMap<>();​        if (StringUtils.isEmpty(request.getQueryString())) {            return result;        }​        try {            param = URLDecoder.decode(request.getQueryString(), "utf-8");        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        }​        String[] params = param.split("&");        for (String s : params) {            String[] array=s.split("=");            result.put(array[0], array[1]);        }        return result;    }}

这里的参数放入SortedMap中对其进行字典排序,前端构建签名时同样需要对参数进行字典排序。

3、签名验证工具类

@Slf4j@UtilityClasspublic class SignUtil {    /**     * 验证签名     * 验证算法:把timestamp + JsonUtil.object2Json(SortedMap)合成字符串,然后MD5     */    @SneakyThrows    public  boolean verifySign(SortedMap map, RequestHeader requestHeader) {        String params = requestHeader.getNonce() + requestHeader.getTimestamp() + JsonUtil.object2Json(map);        return verifySign(params, requestHeader);    }​    /**     * 验证签名     */    public boolean verifySign(String params, RequestHeader requestHeader) {        log.debug("客户端签名: {}", requestHeader.getSign());        if (StringUtils.isEmpty(params)) {            return false;        }        log.info("客户端上传内容: {}", params);        String paramsSign = DigestUtils.md5DigestAsHex(params.getBytes()).toUpperCase();        log.info("客户端上传内容加密后的签名结果: {}", paramsSign);        return requestHeader.getSign().equals(paramsSign);    }}

4、HttpServletRequest包装类

public class SignRequestWrapper extends HttpServletRequestWrapper {    //用于将流保存下来    private byte[] requestBody = null;​    public SignRequestWrapper(HttpServletRequest request) throws IOException {        super(request);        requestBody = StreamUtils.copyToByteArray(request.getInputStream());    }​    @Override    public ServletInputStream getInputStream() throws IOException {        final ByteArrayInputStream bais = new ByteArrayInputStream(requestBody);​        return new ServletInputStream() {            @Override            public boolean isFinished() {                return false;            }​            @Override            public boolean isReady() {                return false;            }​            @Override            public void setReadListener(ReadListener readListener) {​            }​            @Override            public int read() throws IOException {                return bais.read();            }        };​    }​    @Override    public BufferedReader getReader() throws IOException {        return new BufferedReader(new InputStreamReader(getInputStream()));    }}

防篡改和防重放我们会通过SpringBoot Filter来实现,而编写的filter过滤器需要读取request数据流,但是request数据流只能读取一次,需要自己实现HttpServletRequestWrapper对数据流包装,目的是将request流保存下来。

5、创建过滤器实现安全校验

@Configurationpublic class SignFilterConfiguration {    @Value("${sign.maxTime}")    private String signMaxTime;​    //filter中的初始化参数    private Map initParametersMap =  new HashMap<>();​    @Bean    public FilterRegistrationBean contextFilterRegistrationBean() {        initParametersMap.put("signMaxTime",signMaxTime);        FilterRegistrationBean registration = new FilterRegistrationBean();        registration.setFilter(signFilter());        registration.setInitParameters(initParametersMap);        registration.addUrlPatterns("/sign/*");        registration.setName("SignFilter");        // 设置过滤器被调用的顺序        registration.setOrder(1);        return registration;    }​    @Bean    public Filter signFilter() {        return new SignFilter();    }}
@Slf4jpublic class SignFilter implements Filter {    @Resource    private RedisUtil redisUtil;​    //从fitler配置中获取sign过期时间    private Long signMaxTime;​    private static final String NONCE_KEY = "x-nonce-";​    @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {        HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;​        log.info("过滤URL:{}", httpRequest.getRequestURI());​        HttpServletRequestWrapper requestWrapper = new SignRequestWrapper(httpRequest);        //构建请求头        RequestHeader requestHeader = RequestHeader.builder()                .nonce(httpRequest.getHeader("x-Nonce"))                .timestamp(Long.parseLong(httpRequest.getHeader("X-Time")))                .sign(httpRequest.getHeader("X-Sign"))                .build();​        //验证请求头是否存在        if(StringUtils.isEmpty(requestHeader.getSign()) || ObjectUtils.isEmpty(requestHeader.getTimestamp()) || StringUtils.isEmpty(requestHeader.getNonce())){            responseFail(httpResponse, ReturnCode.ILLEGAL_HEADER);            return;        }​        /*         * 1.重放验证         * 判断timestamp时间戳与当前时间是否操过60s(过期时间根据业务情况设置),如果超过了就提示签名过期。         */        long now = System.currentTimeMillis() / 1000;​        if (now - requestHeader.getTimestamp() > signMaxTime) {            responseFail(httpResponse,ReturnCode.REPLAY_ERROR);            return;        }​        //2. 判断nonce        boolean nonceExists = redisUtil.hasKey(NONCE_KEY + requestHeader.getNonce());        if(nonceExists){            //请求重复            responseFail(httpResponse,ReturnCode.REPLAY_ERROR);            return;        }else {            redisUtil.set(NONCE_KEY+requestHeader.getNonce(), requestHeader.getNonce(), signMaxTime);        }​​        boolean accept;        SortedMap paramMap;        switch (httpRequest.getMethod()){            case "GET":                paramMap = HttpDataUtil.getUrlParams(requestWrapper);                accept = SignUtil.verifySign(paramMap, requestHeader);                break;            case "POST":                paramMap = HttpDataUtil.getBodyParams(requestWrapper);                accept = SignUtil.verifySign(paramMap, requestHeader);                break;            default:                accept = true;                break;        }        if (accept) {            filterChain.doFilter(requestWrapper, servletResponse);        } else {            responseFail(httpResponse,ReturnCode.ARGUMENT_ERROR);            return;        }​    }​    private void responseFail(HttpServletResponse httpResponse, ReturnCode returnCode)  {        ResultData resultData = ResultData.fail(returnCode.getCode(), returnCode.getMessage());        WebUtils.writeJson(httpResponse,resultData);    }​    @Override    public void init(FilterConfig filterConfig) throws ServletException {        String signTime = filterConfig.getInitParameter("signMaxTime");        signMaxTime = Long.parseLong(signTime);    }}

6、Redis工具类

@Componentpublic class RedisUtil {    @Resource    private RedisTemplate redisTemplate;​    /**     * 判断key是否存在     * @param key 键     * @return true 存在 false不存在     */    public boolean hasKey(String key) {        try {            return Boolean.TRUE.equals(redisTemplate.hasKey(key));        } catch (Exception e) {            e.printStackTrace();            return false;        }    }​​    /**     * 普通缓存放入并设置时间     * @param key   键     * @param value 值     * @param time  时间(秒) time要大于0 如果time小于等于0 将设置无限期     * @return true成功 false 失败     */    public boolean set(String key, Object value, long time) {        try {            if (time > 0) {                redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);            } else {                set(key, value);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }​    /**     * 普通缓存放入     * @param key   键     * @param value 值     * @return true成功 false失败     */    public boolean set(String key, Object value) {        try {            redisTemplate.opsForValue().set(key, value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }​}

标签:

上一篇 :

下一篇 :

[云原生]接口安全方案提供和实践

对于互联网来说,只要你系统的接口暴露在外网,就避免不了接口安全问题。如果你的接口在外网裸奔,只要...

03-30 20:11:16

当前视讯!2023徽州大峡谷免门票时间+对象+预约电话

2023徽州大峡谷免门票政策一览:面向所有人免门票:4月每周三,即:4月5日(清明节)、4月12日、4月19日...

03-30 19:11:18

新冠患者医保报销政策调整后,哪些新冠口服药还可以用医保支付

可以继续使用医保报销的新冠口服药,皆全部是国产药物。

03-30 18:30:59

全球焦点!Win11电脑桌面开机后屏幕一直闪怎么回事?

Win11电脑桌面开机后屏幕一直闪怎么回事?有用户的电脑开机之后出现了屏幕一直闪烁的情况,导致影响了自...

03-30 17:46:24

合肥首个涉林案件 “碳中和”生态修复基地揭牌

 3月28日,合肥市涉林案件“碳中和”生态修复基地在庐阳区三十岗乡揭牌。据了解,该基地为全市首个涉林...

03-30 16:51:57

旧物巧利用 创意无止限

为了增强幼儿环保意识,倡导低碳环保的生活理念,培养幼儿养成节约资源的好习惯,3月30日,延吉市新蕾幼...

03-30 16:05:38

讯息:千万别办灵活就业养老保险原因是这样!

千万别办灵活就业养老保险原因是这样!下面跟随社保君一起来看看吧!一、千万别办灵活就业养老保险原因...

03-30 15:12:08

【昌业音响原创】六款法国珊瑚礁Atoll CD功放拆解测评!(IN200,IN300)|环球最资讯

从前面的内部图中可知,100系列以下的功放机型大致是共用一个电路,只再用料上有所区别对待;接下来介绍...

03-30 13:56:48

中国品牌乘用车市场份额升至49.9%(新数据 新看点) 当前头条

即将过去的3月份是“全国消费促进月”,各地拼起了“特色经济”,带动消费复苏、市场回暖。我们一起去看...

03-30 13:09:26

世界即时看!Fortinet解读《2023年全球云安全报告》关键洞察

当今企业正通过扩大运营范围以探寻创新业务模式,持续推行混合办公策略等举措加速推进数字化转型。然而...

03-30 11:54:32

世界新动态:沪深两市成交额突破5000亿元

3月30日上午,截至目前,沪深两市成交额突破5000亿元,其中沪市成交额2065亿元,深市成交额2965亿元。

03-30 11:05:48

电影《爱很美味》释人物预告 霸道总裁王菊情场甜蜜职场碰壁 天天即时看

影片由同名口碑剧集原班人马打造,陈正道、许肇任导演,沈洋、易帅婕编剧,“美味三姐妹”李纯、张含韵...

03-30 10:38:07

2月银行间外汇市场回顾:人民币汇率市场预期平稳

中国外汇交易中心(以下简称“交易中心”)近日发布的数据显示,2月份,人民币对美元即期汇率承压走贬,...

03-30 10:15:58

港股概念追踪 | “强心剂”注入!重卡市场销量止住颓势 机构:行业拐点已现(附概念股)

据央视财经报道,自2021年5月份开始,重卡市场的销量连续21个月呈现下降态势,而今年2月份的增长,给沉...

03-30 09:16:49

如何使用玉米淀粉来增稠炖菜_父亲送儿子18岁礼物什么最好 全球短讯

你需要的东西股票(替代水,如果需要)玉米淀粉中号搅拌碗搅拌勺拂用少许玉米淀粉勾芡。做炖菜时,许多...

03-30 08:17:25

德意志银行:下调特斯拉Q1业绩预期交付量预期降至41.6万辆|世界观点

德意志银行:下调特斯拉Q1业绩预期交付量预期降至41 6万辆:德意志银行将特斯拉第一季度的交付量预期下...

03-30 02:58:30

[年报]掌握核心科技奠定高质量发展基础 贝泰妮2022年度业绩再创历史新高

党的二十大报告将“实现高水平科技自立自强,进入创新型国家前列”纳入2035年我国发展的总体目标。在云...

03-29 23:24:09

110平灰色简约三居室,抱枕点亮了稳重空间的时尚温馨气质

这是一套整体灰色调主体的装修案例,在灰色简约的空间基础下,通过软装加入鲜艳活泼的点缀,点亮了稳重...

03-29 21:55:43

药品说明书“字小如蚁”、老人难看清,谁来督着改? 当前快讯

2,089打开药品说明书,一行行如蚁般的小字密密麻麻。“让人看得有点头晕。”这是江苏省连云港市人民检察...

03-29 20:43:10

【天天聚看点】2023年郑州清明节演唱会音乐会时间+门票

2023郑州清明节演唱会音乐会➤扬布拉德2023巡演郑州站演出时间:04月05日20:30-04月05日22:00艺人:扬布...

03-29 19:18:20

焦点报道:大宗交易:仕净科技成交1102万元,折价10.80%(03-29)

2023年3月29日,仕净科技发生1笔大宗交易,总成交29万股,成交金额1102万元,成交价38 00元,折价10 80%。

03-29 18:21:52

南京浦口税务助力专精特新企业

南京浦口税务助力专精特新企业---专精特新“小巨人”企业作为中小企业群体的“领跑者”,创新能力强、成...

03-29 17:55:59

灵感中国 数字东坡|“神秘蜀韵 百部川扬”全球短视频征集大赛启动 “灵感中国”从东坡出发!

灵感中国,从东坡出发!3月29日下午在成都举办的灵感中国数字东坡新视听论坛上,备受网络视听行业关注的...

03-29 17:06:32

万物云2022年营收301亿元 董事长谈行业“四大反思”

在3月28日召开的业绩发布会上,万物云(02602 HK)董事长朱保全形容2022年是全行业的“反思年”,反思单...

03-29 16:19:30

保险观察|中国太保:2022年“期末考”喜忧参半

解读新商业的财经新媒体,报道资本市场,解读上市公司,追踪财经热点,专栏入驻开放平台

03-29 15:14:08

时隔6年阿根廷重返世界第一-信息

北京时间3月28日,据阿根廷媒体的报道,阿根廷会在国际足联即将更新的最新一版世界排名中升至世界第一的...

03-29 14:23:33

华润置地:2022年核心盈利270亿元

截至2022年底,华润置地总有息负债率40 2%,净有息负债率38 8%;三道红线指标稳居绿档;平均债务期限拉长至5 4年

03-29 12:58:52

天天观热点:白百合花的寓意及象征_白百合花

1、她们的气质接近,代表作品中的人物经历也一样,米莱和黄小仙一样,都是被“姐妹淘”给坑了,所以更让...

03-29 11:51:11

重庆-敦煌-库尔勒航班首航

当日,重庆-敦煌-库尔勒往返航线首次正式通航。该航线由华夏航空公司执飞,每周二、四、六执飞,为重庆...

03-29 11:03:29

热推荐:郏县;特色产业带动双赢

3月23日,在郏县茨芭镇茨芭村连片温室大棚内,一朵朵壮硕的羊肚菌长势喜人,李春华和10余名村民正在熟练...

03-29 10:42:10

3月29日09时新疆铁门关疫情最新状况今天及铁门关疫情最新消息实时数据 天天快播报

一、铁门关最新疫情消息-数据概览:1、新增本土:0;2、新增无症状:0;3、现有确诊:0;4、累计确诊:0...

03-29 09:56:10

国乒选拔赛太难打 陈梦“高幸组合”皆无缘4强

陈梦和上一站混双冠军林高远 陈幸同皆无缘4强,而几位晋级争冠之列的主力,小组赛也打得磕磕绊绊。两位...

03-29 09:00:24

当前快讯:概念动态|海通发展新增“新股与次新股”概念

同花顺F10数据显示,2023年3月29日海通发展(603162)新增“新股与次新股”概念。    入选理由是:...

03-29 06:56:30

全球微资讯!饲料中的豆粕是什么东西_豆粕是什么东西

1、豆粕应用于花卉业,是一种很好的有机肥料,但需要充分发酵后才能使用,至于其他用途和豆粕的知识,请...

03-29 04:49:51

朴灿烈女友金熙秀是谁他们怎么分手的_朴灿烈女友金熙秀

1、据路过大多数的大腿的爆料,我们可以总结出以下几点:1 金熙秀和秀晶是好朋友。2、(参考吧里09年的...

03-28 23:56:03

世界银行首次在香港发行巨灾债券 发行总额约27.5亿港元

3月28日,香港特区政府和保险业监管局(保监局)宣布,世界银行首次在香港以巨灾债券形式发行总额为3 5亿...

03-28 21:57:46

王楚钦逆转梁俨苧,林高远击败袁励岑,林诗栋大胜向鹏

第二局比赛成了双方争夺的重点,袁励岑也体现出了自身进攻的特点,不过11:13没有拿下关键分,这样就大比...

03-28 20:41:17

闽都文化研究院志愿者走进文武砂街道开展义务植树活动

福州新闻网3月28日讯(记者谢敏通讯员刘祖新文 摄)3月28日,闽都文化研究院(福州文学院)组织青年作...

03-28 19:23:46

Mysteel日报:今日螺纹期现价格小幅上涨-前沿热点

今日螺纹钢HRB400E20mm现货价格为4267元 吨,较上一交易日上涨6元 吨。05合约收4136元 吨,较上一交...

03-28 18:23:21

北航沙河校区附近租房_北航沙河校区_今日讯

1、北京航空航天大学沙河校区位于北京市昌平沙河高教园区,距学院路校区约26公里,占地面积97万平方米,...

03-28 17:41:36

全球微资讯!南京高淳多点发力推进国家安全教育走新更走心

法治日报全媒体记者罗莎莎通讯员葛继龙孙祥花韦俊在第八个全民国家安全教育日到来之际,为了贯彻总体国...

03-28 16:51:14

今日陕西以多云天气为主 局地有分散性阵雨_焦点信息

三秦都市报-三秦网讯(记者陶颖)3月28日,记者从陕西省气象局获悉,昨日全省晴间多云,最高气温15~25...

03-28 16:05:55

这群年轻人 在综艺节目中“种地”具体详细内容是什么_环球新视野

这群年轻人在综艺节目中“种地”今天的热度非常高,现在也是在热搜榜上了,那么具体的这群年轻人在综艺...

03-28 14:49:00

全球资讯:大基金新动作 光刻胶龙头中招 重要股东+北上资金联手卖出这些股

【大基金新动作光刻胶龙头中招重要股东+北上资金联手卖出这些股】除大基金外,3月以来,多家上市公司重...

03-28 13:09:07

山杏无性系93号 全球观焦点

1、山杏无性系93号是蔷薇科杏属的一种植物。2、原产地是内蒙古自治区。本文到此分享完毕,希望对大家有...

03-28 11:50:53

当前视点!电投能源:公司2022年年报预约披露时间为4月26日

电投能源(002128)03月28日在投资者关系平台上答复了投资者关心的问题。

03-28 10:54:58

天天视点!为民营经济“保驾护航” 引导民营经济“量”“质”双升

近期,中国多地相继出台发展民营经济的具体措施,通过实实在在的政策提振民营经济的发展信心,想方设法...

03-28 09:40:28

英搏尔:3月27日融券卖出金额19.63万元,占当日流出金额的0.63% 环球焦点

同花顺数据中心显示,英搏尔3月27日获融资买入396 16万元,占当日买入金额的16 26%,当前融资余额2 5...

03-28 08:49:08

科技部启动“人工智能驱动的科学研究”专项部署工作_每日热点

为贯彻落实国家《新一代人工智能发展规划》,科技部会同自然科学基金委近期启动“人工智能驱动的科学研...

03-28 06:40:22

3月27日基金净值:富国收益增强债券A最新净值1.417,涨0.14%-当前速递

3月27日,富国收益增强债券A最新单位净值为1 417元,累计净值为1 612元,较前一交易日上涨0 14%。历...

03-28 02:35:15

当前视讯!2023徽州大峡谷免门票时间+对象+预约电话
新冠患者医保报销政策调整后,哪些新冠口服药还可以用医保支付
全球焦点!Win11电脑桌面开机后屏幕一直闪怎么回事?
合肥首个涉林案件 “碳中和”生态修复基地揭牌
旧物巧利用 创意无止限
讯息:千万别办灵活就业养老保险原因是这样!
【昌业音响原创】六款法国珊瑚礁Atoll CD功放拆解测评!(IN200,IN300)|环球最资讯
中国品牌乘用车市场份额升至49.9%(新数据 新看点) 当前头条
世界即时看!Fortinet解读《2023年全球云安全报告》关键洞察
世界新动态:沪深两市成交额突破5000亿元
电影《爱很美味》释人物预告 霸道总裁王菊情场甜蜜职场碰壁 天天即时看
2月银行间外汇市场回顾:人民币汇率市场预期平稳
港股概念追踪 | “强心剂”注入!重卡市场销量止住颓势 机构:行业拐点已现(附概念股)
如何使用玉米淀粉来增稠炖菜_父亲送儿子18岁礼物什么最好 全球短讯
德意志银行:下调特斯拉Q1业绩预期交付量预期降至41.6万辆|世界观点
[年报]掌握核心科技奠定高质量发展基础 贝泰妮2022年度业绩再创历史新高
110平灰色简约三居室,抱枕点亮了稳重空间的时尚温馨气质
药品说明书“字小如蚁”、老人难看清,谁来督着改? 当前快讯
【天天聚看点】2023年郑州清明节演唱会音乐会时间+门票
焦点报道:大宗交易:仕净科技成交1102万元,折价10.80%(03-29)
南京浦口税务助力专精特新企业
灵感中国 数字东坡|“神秘蜀韵 百部川扬”全球短视频征集大赛启动 “灵感中国”从东坡出发!
万物云2022年营收301亿元 董事长谈行业“四大反思”
保险观察|中国太保:2022年“期末考”喜忧参半
时隔6年阿根廷重返世界第一-信息
华润置地:2022年核心盈利270亿元
天天观热点:白百合花的寓意及象征_白百合花
重庆-敦煌-库尔勒航班首航
热推荐:郏县;特色产业带动双赢
3月29日09时新疆铁门关疫情最新状况今天及铁门关疫情最新消息实时数据 天天快播报
国乒选拔赛太难打 陈梦“高幸组合”皆无缘4强
当前快讯:概念动态|海通发展新增“新股与次新股”概念
全球微资讯!饲料中的豆粕是什么东西_豆粕是什么东西
朴灿烈女友金熙秀是谁他们怎么分手的_朴灿烈女友金熙秀
世界银行首次在香港发行巨灾债券 发行总额约27.5亿港元
王楚钦逆转梁俨苧,林高远击败袁励岑,林诗栋大胜向鹏
闽都文化研究院志愿者走进文武砂街道开展义务植树活动
Mysteel日报:今日螺纹期现价格小幅上涨-前沿热点
北航沙河校区附近租房_北航沙河校区_今日讯
全球微资讯!南京高淳多点发力推进国家安全教育走新更走心
今日陕西以多云天气为主 局地有分散性阵雨_焦点信息
这群年轻人 在综艺节目中“种地”具体详细内容是什么_环球新视野
全球资讯:大基金新动作 光刻胶龙头中招 重要股东+北上资金联手卖出这些股
山杏无性系93号 全球观焦点
当前视点!电投能源:公司2022年年报预约披露时间为4月26日
天天视点!为民营经济“保驾护航” 引导民营经济“量”“质”双升
英搏尔:3月27日融券卖出金额19.63万元,占当日流出金额的0.63% 环球焦点
科技部启动“人工智能驱动的科学研究”专项部署工作_每日热点
3月27日基金净值:富国收益增强债券A最新净值1.417,涨0.14%-当前速递
打好“发展六仗”·身在郴州 办事无忧:高效政务服务 赋能高质量发展
X 广告
行业动态
X 广告

Copyright ©  2015-2022 人人植物网版权所有  备案号:粤ICP备18023326号-36   联系邮箱:8557298@qq.com