当前位置: 首页 > news >正文

API成批分配漏洞介绍与解决方案

一、API成批分配漏洞介绍

批量分配:在API的业务对象或数据结构中,通常存在多个属性,攻击者通过篡改属性值的方式,达到攻击目的。比如通过设置user.is_admin和user.is_manager的值提升用户权限等级;假设某API的默认接口调用参数为{"user_name":"user","is_admin":0},而恶意攻击者修改请求参数,提交值为{"user_name":"attacker","is_admin":1},通过修改参数is_admin的值来提升为管理员权限。

应用程序中潜藏的安全漏洞是一种非常大的隐患,攻击者会通过某一个安全漏洞窃取站点内的用户隐私等重要信息。在扫描应用程序时,我们需要对多项内容进行配置。那么,AppScan扫描应用程序需要URL吗?是需要的。在新版的AppScan还可以扫除API成批分配的问题,我们需要AppScan扫出API成批分配问题解决方案来解决。

APPScan 10.0.7新增的扫描功能 HCL AppScan® Enterprise 中的新增功能 (hcltechsw.com),增加了批量分配API的规则。

AppScan扫描应用程序需要URL吗

AppScan扫描应用程序是否需要URL,那么我们就要看AppScan是如何扫描应用程序的。

1.启动扫描位置


图1:主界面

这里我们使用的是AppScan 10.0.8版本,启动软件后,单击主界面中【web应用程序】便可启动扫描进程。

2.配置扫描 


图2:配置界面

在配置界面中第一项便是要求填写【URL和服务器】,在图2中【从该URL开始扫描】位置输入目标URL即可。 

3.完全扫描模式下输入URL 


图3:完全扫描

当我们启动【完全扫描】模式时,在【探索】位置我们可以对【URL和服务器】进行配置,配置方式和【扫描web应用程序】的配置方式一致。

4.web API 

AppScan主界面中除了【web应用程序】和【完全配置】外,还有【web API】,web API的配置是不需要的填写URL的。


图4:扫描web API

web API虽然无需填写URL,但需要填写客户机和描述文件。

漏洞条件:

1、接口类型为application/json ,参数传值、form表单等类型暂未受影响。

2、请求json参数不是接收参数的javabean及其父类中的任意属性。

3、接口HTTP状态码为200

请求json参数不是接收参数的javabean及其父类中的任意属性。

意思就是:我javaben里面没有这个参数,你却传递过来了,例如我只需要pageNum和pageSize 你还传了role:admin 那么这样就有可能导致致特权升级、数据篡改、绕过安全机制。

二、AppScan扫出API成批分配问题

可利用性

利用通常需要了解业务逻辑、对象关系和 API 结构。 在 API 中利用批量分配更容易,因为按照设计,它们公开了应用程序的底层实现以及属性名称。

安全弱点

现代框架鼓励开发人员使用自动将客户端输入绑定到代码变量和内部对象的函数。 攻击者可以使用这种方法来更新或覆盖开发人员从未打算公开的敏感对象的属性。

影响

利用该漏洞可能会导致权限升级、数据篡改、绕过安全机制等。                       

API 是否容易受到攻击

现代应用程序中的对象可能包含许多属性。 其中一些属性应由客户端直接更新(例如,user.first_name 或 user.address),而另一些则不应该(例如,user.is_vip 标志)。

如果 API 端点自动将客户端参数转换为内部对象属性,而不考虑这些属性的敏感性和暴露级别,则该端点容易受到攻击。 这可能允许攻击者更新他们不应访问的对象属性。

敏感属性的示例

权限相关属性:user.is_admin、user.is_vip 只能由管理员设置。
与流程相关的属性:user.cash 只能在付款验证后在内部设置。
内部属性:article.created_time 只能由应用程序内部设置。

攻击场景示例

场景#1

乘车共享应用程序为用户提供了编辑其个人资料的基本信息的选项。 在此过程中,API 调用将使用以下合法 JSON 对象发送到 PUT /api/v1/users/me:

{“user_name” : “inons”,“age” : 24}

请求 GET /api/v1/users/me 包含一个额外的credit_balance 属性:

{"user_name" : "inons",  "age":24,  "credit_balance" : 10} 

攻击者使用以下有效负载重放第一个请求:

{“user_name” : “攻击者”,“age” : 60,“credit_balance” : 99999} 

由于端点容易受到大规模分配的影响,攻击者无需付费即可获得积分。 

场景#2

视频共享门户允许用户上传和下载不同格式的内容。 探索 API 的攻击者发现端点 GET /api/v1/videos/{video_id}/meta_data 返回带有视频属性的 JSON 对象。 其中一个属性是“mp4_conversion_params”:“-v codec h264”,这表示应用程序使用 shell 命令来转换视频。

攻击者还发现端点 POST /api/v1/videos/new 容易受到批量分配的影响,并允许客户端设置视频对象的任何属性。 攻击者设置恶意值如下:“mp4_conversion_params”:“-v codec h264 && format C:/”。 一旦攻击者将视频下载为 MP4,该值将导致 shell 命令注入。

攻击者利用批量分配漏洞

当来自客户端的手动修改不可变内部对象属性的请求不受 API 端点限制时,就会出现 API 批量分配漏洞。

攻击者可以利用此漏洞,通过构建 HTTP 请求来升级用户权限、绕过安全机制或使用任何其他方法使 API 端点以非设计的方式工作。

注意:批量分配和过多数据暴露在 OWASP API Sec 2019 中是一个单独的风险类别,现在已合并到名为“损坏对象属性级别授权”的新风险类别中。

如何预防 

如果可能,请避免使用自动将客户端输入绑定到代码变量或内部对象的函数。

仅将应由客户端更新的属性列入白名单。

使用内置功能将客户端不应访问的属性列入黑名单。

如果适用,请显式定义并强制执行输入数据有效负载的架构。

增加反序列化配置。

三、成批分配漏洞解决方案

方案1:增加反序列化配置方案

1、反序列化所使用的框架的配置

jackson

如果SpringBoot使用的默认jackson做的序列化,可以考虑对jackson配置来解决传冗余参的问题。

可以直接在配置文件中增加配置

spring:jackson:serialization:# 某些类对象无法序列化的时候,是否报错fail_on_empty_beans: truedeserialization:# json对象中有不存在的属性时候,是否报错fail_on_unknown_properties: true

或自建配置类

@Configuration
public class JacksonConverters {@Beanpublic HttpMessageConverters JacksonHttpMessageConverters() {MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();ObjectMapper objectMapper = new ObjectMapper();//省略其他配置开始//反序列化的时候如果多了其他属性,抛出异常objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);//省略其他配置结束}}
fastjson

如果SpringBoot使用的是fastjson做的序列化,在2.0.42版本中增加了解决方案,可以考虑对fastjson配置来解决传冗余参的问题。

/*** @author admin*/
@Configuration
public class Fastjson2Config {/*** 使用fastJson解析*/@Beanpublic HttpMessageConverters fastJsonHttpMessageConverters() {FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();FastJsonConfig config = new FastJsonConfig();/** API成批分配利用问题(反序列化的时候如果多了其他属性)修复方法:* 第一:json反序列化组件设置,如:fastjson与jackson* 第二:签名验证** fastjson 2.0.42增加了ErrorOnUnknownProperties修复API成批分配利用问题,反序列化的时候如果多了其他属性,抛出异常* https://github.com/alibaba/fastjson2/issues/1944** JSONObject jsonObject = JSONObject.of("id", 123, "name", "xxx");* String str = jsonObject.toJSONString();* assertEquals(jsonObject.getIntValue("id"), JSON.parseObject(str, Bean.class).id);* assertThrows(JSONException.class, () -> JSON.parseObject(str, Bean.class, JSONReader.Feature.ErrorOnUnknownProperties));* assertEquals(jsonObject.getIntValue("id"), jsonObject.toJavaObject(Bean.class).id);* assertThrows(JSONException.class, () -> jsonObject.toJavaObject(Bean.class, JSONReader.Feature.ErrorOnUnknownProperties));** jackson中可以加入* spring:*   jackson:*     deserialization:*       fail-on-unknown-properties: true* 或* //反序列化的时候如果多了其他属性,抛出异常* objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, true);** 统一异常捕获或者返回处增加非200状态码**/config.setDateFormat("yyyy-MM-dd HH:mm:ss");config.setReaderFeatures(JSONReader.Feature.ErrorOnUnknownProperties);config.setWriterFeatures(JSONWriter.Feature.WriteMapNullValue, JSONWriter.Feature.PrettyFormat);converter.setDefaultCharset(StandardCharsets.UTF_8);List<MediaType> supportedMediaTypes = new ArrayList<>();supportedMediaTypes.add(MediaType.APPLICATION_JSON);converter.setFastJsonConfig(config);converter.setSupportedMediaTypes(supportedMediaTypes);return new HttpMessageConverters(converter);}}

2、统一异常捕获或者返回处增加非200状态码 

 /*** 捕获反序列化异常HttpMessageNotReadableException,增加500状态码返回* @param request   请求* @param exception 异常对象* @return 响应*/
@ExceptionHandler(value = HttpMessageNotReadableException.class)
public ResponseEntity<Map<String, Object>> methodHttpMessageNotReadableExceptionHandler(HttpServletRequest request, HttpMessageNotReadableException exception) {//按需重新封装需要返回的错误信息WebRequest webRequest = new ServletWebRequest(request);Map<String, Object> body = errorAttributes.getErrorAttributes(webRequest, ErrorAttributeOptions.defaults());body.put(DATA, "convert exception message to JSON");body.put(STATUS, HttpStatus.INTERNAL_SERVER_ERROR.value());body.put(MESSAGE, HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase());body.put(SUCCESS,false);return new ResponseEntity<>(body, HttpStatus.INTERNAL_SERVER_ERROR);
}

或者在其他异常拦截方法上增加状态码注解

 @ResponseStatus()

方案二:接口使用参数签名机制

如HMac, HMac Springboot, 微信支付参数签名

#前端请求

请求 URL: http://localhost/cars/query

请求方法: POST

HTTP状态码:200

playload:{"color":"red","company":"ltl","seats":"2-2"} #正常请求

Header:sign:ErOVBda4VMFdX9aixigRslAjY0rhT7lLxy

#后端controller

@PostMapping(value = "/query")
public BaseResponse query(@RequestBody Car car) {String signFront = request.header("sign");String signBackend = SignUtils.handler(car);if(!signBackend.equals(signFront)) {throws new ServiceErrorException("签名异常");       }}

Jackson类库解决方案 

Solution - Jackson @JsonView
We can create JSON view like below:

public class View {public static class Editable {}public static class Viewable extends Editable {}public static class Internal extends Viewable {}}

Then annotate our mode class:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Model implements Serializable {@JsonView(View.Editable.class)protected String editableField;@JsonView(View.Viewable.class)protected String viewableField; @JsonView(View.Internal.class)protected String internalField;}

 At last, we annotate out jax-rs resource with @JsonView annotation. 

@GET
@Produces(MediaType.APPLICATION_JSON )
@JsonView(View.Viewable.class)
public Iterable<Model> search() {}
@GET
@Path("{id}")
@Produces(MediaType.APPLICATION_JSON )
@JsonView(View.Viewable.class)
public Model getModel(@PathParam("id") final String id) {}
@POST
@Consumes({MediaType.APPLICATION_JSON})
public Response add(@JsonView(View.Editable.class) final Model model) {}

Spring MVC provides data binder that we can specify what fields are not allowed.

禁用字段:

@InitBinder 
public void initBinder(WebDataBinder binder) {binder.setDisallowedFields(DISALLOWED_FIELDS);
}

允许字段:

@Controller
public class UserController {@InitBinderpublic void initBinder(WebDataBinder binder, WebRequest request) {binder.setAllowedFields(["userid", "password", "email"]);}...}

四、总结

以上便是,AppScan扫描应用程序需要URL吗,AppScan扫出API成批分配问题解决方案的内容。AppScan扫描应用程序是需要URL的,同时AppScan完全扫描也是需要URL的,在新版的软件中,只有web API模式是无需URL的。新版的AppScan可以扫出API成批分配的问题,对于此类问题,我们只需要执行反序列化配置方案便可拦截API成批分配的问题。更多有关AppScan使用技巧,尽在AppScan中文网站!

相关文章:

API成批分配漏洞介绍与解决方案

一、API成批分配漏洞介绍 批量分配&#xff1a;在API的业务对象或数据结构中&#xff0c;通常存在多个属性&#xff0c;攻击者通过篡改属性值的方式&#xff0c;达到攻击目的。比如通过设置user.is_admin和user.is_manager的值提升用户权限等级&#xff1b;假设某API的默认接口…...

跨网文件摆渡系统:安全、可控的数字传输桥梁

在企业高度信息化的时代&#xff0c;数据的流通与共享已经成为企业、组织乃至个人之间不可或缺的沟通方式。然而&#xff0c;在数据流通的过程中&#xff0c;我们经常会遇到各种难题和挑战&#xff0c;尤其是当涉及到不同网络环境之间的文件传输。这不仅需要保证文件的安全性&a…...

线程池的原理和基本使用~

线程池的基本原理&#xff1a; 无论是之前在JavaSE基础中&#xff0c;我们学习过的常量池&#xff0c;还是在操作数据库时&#xff0c;我们学习过数据库连接池&#xff0c;以及接下来要学习的线程池&#xff0c;均是一种池化思想&#xff0c;其目的就是为了提高资源的利用率&a…...

PyTorch2.0环境搭建

一、安装python并配置环境变量 1、打开python官网&#xff0c;下载并安装 Welcome to Python.org 下载 寻找版本&#xff1a;推荐使用3.9版本&#xff0c;或其他表中显示为安全&#xff08;security&#xff09;的版本 安装&#xff1a;&#xff08;略&#xff09; 2、配置环…...

figma 基础使用 —— 常用方法

一、 导入组件 分成两种方式 &#xff08;1&#xff09;离线的包导入&#xff08;iOS 常用组件.fig 直接拖拽到figma最近网页&#xff09; &#xff08;2&#xff09;在插件市场下载https://www.figma.com/community 二、figma中使用标尺 快捷键&#xff1a;shift R 三、插件…...

linux rsync 和scp区别

rsync 和 scp 都是 Linux 中用于文件复制的命令&#xff0c;但它们之间存在一些关键差异&#xff1a; 效率&#xff1a;rsync 在复制文件时&#xff0c;只会复制文件中改变的部分&#xff0c;而 scp 则会复制整个文件&#xff0c;即使文件只有一小部分发生了变化。因此&#xf…...

mac如何永久设置环境变量

1. 先将默认shell修改为bash mac修改默认shell为bash-CSDN博客 2. 修改环境变量 Mac中的环境变量介绍 Mac系统的环境变量&#xff0c;加载顺序为&#xff1a; /etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc 当然/etc/profile和/etc/paths…...

小程序一键生成工具哪个好?

在这个数字化时代&#xff0c;小程序已经成为商家吸引客户、提升业务的重要工具。但是&#xff0c;传统的小程序开发方式既费时又费力&#xff0c;让许多商家望而却步。 现在&#xff0c;有了乔拓云小程序模板开发平台&#xff0c;一切都变了。 乔拓云提供了大量精心设计的模板…...

Ubuntu环境下使用nginx实现强制下载静态资源

安装Nginx sudo apt update sudo apt install nginx关闭防火墙 sudo ufw allow Nginx HTTP修改nginx配置 cd /etc/nginx/conf.d vi nginx.conf在http配置中添加(/your path/为需要下载的文件路径) server {listen 80;server_name localhost;location / {root /your path/…...

苹果 macOS 14.1.2 正式发布 更新了哪些内容?

苹果今日向 Mac 电脑用户推送了 macOS 14.1.2 更新&#xff08;内部版本号&#xff1a;23B92 | 23B2091&#xff09;&#xff0c;本次更新距离上次发布隔了 28 天。 需要注意的是&#xff0c;因苹果各区域节点服务器配置缓存问题&#xff0c;可能有些地方探测到升级更新的时间略…...

【网络编程】-- 02 端口、通信协议

网络编程 3 端口 端口表示计算机上的一个程序的进程 不同的进程有不同的端口号&#xff01;用来区分不同的软件进程 被规定总共0~65535 TCP,UDP&#xff1a;65535 * 2 在同一协议下&#xff0c;端口号不可以冲突占用 端口分类&#xff1a; 公有端口&#xff1a;0~1023 HT…...

数字发射链路噪声系数核算方法、实例与matlab程序

前言 发射链路各器件噪声性能较差会影响发射信号信噪比&#xff0c;从而导致较高的误码率&#xff0c;通过定量的分析发射链路噪声系数与信噪比恶化的关系&#xff0c;能够在设计过程中进行合理的评估和处理。 一、发射链路噪声 发射链路的噪声从特性上可以大致分为&#xff1…...

SQL数据库知识点总结归纳

前后顺序可以任意颠倒,不影响库中的数据关系 关系数据库的逻辑性强而物理性弱,因此关系数据库中的各条记录前后顺序可以任意颠倒,不影响库中的数据关系 一名员工可以使用多台计算机(1:m),而一台计算机只能被一名员工使用(1:1),所以员工和计算机两个实体之间是一对多…...

Linux C语言 39-进程间通信IPC之管道

Linux C语言 39-进程间通信IPC之管道 本节关键字&#xff1a;C语言 进程间通信 管道 FIFO 相关库函数&#xff1a;pipe、mkfifo、mknod、write、read 什么是管道&#xff1f; 管道通常指“无名管道”&#xff0c;是Unix系统中最古老的IPC通信方式。 管道的分类 管道&#…...

python pandas dataframe常用数据处理总结

最近一直在做数据处理相关的工作&#xff0c;有几点经常遇到的情况总结如下&#xff1a; 数据中存在为空数据如何处理 处理方式1&#xff1a;丢弃数据行 # 实现方式1 data data.dropna(subset[id]) # 若id列中某行数值为空&#xff0c;丢弃整行数据 # 实现方式2 data df[df…...

excel做预测的方法集合

一. LINEST函数 首先&#xff0c;一元线性回归的方程&#xff1a; y a bx 相应的&#xff0c;多元线性回归方程式&#xff1a; y a b1x1 b2x2 … bnxn 这里&#xff1a; y - 因变量即预测值x - 自变量a - 截距b - 斜率 LINEST的可以返回回归方程的 截距(a) 和 斜…...

12月8日作业

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数&#xff1b;将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断u界面上输入的账号是否为"admin"&#xff0c;…...

RefCell 数据类型

内部可变性&#xff08;interior mutability&#xff09;是RUST的设计模式之一&#xff0c;它允许你在只持有不可变引用的前提下对数据进行修改。为了能改变数据&#xff0c;内部可变性模式在它的数据结构中使用了unsafe&#xff08;不安全&#xff09;代码来绕过RUST正常的可变…...

[oeasy]python0002_终端_CLI_GUI_编程环境_游戏_真实_元宇宙

回忆 上次 了解了 python 语言的特点 历史悠久功能强大深受好评已成趋势 3大主流操作系统 macwindowslinux 我们 选择 linux 作为基础系统 为什么选择 黑乎乎的命令行界面呢&#xff1f;&#x1f914; GUI vs CLI 个人电脑 用图标和菜单组成 图形界面(GUI) Graphic User I…...

微服务1 springcloud学习笔记P1-P40

b微服务技术栈_哔哩哔哩_bilibili 文档资料: 链接&#xff1a;https://pan.baidu.com/s/1P_Ag1BYiPaF52EI19A0YRw?pwdd03r 提取码&#xff1a;d03r 一 了解微服务技术 二 Eureka (1) Eureka配置 (2) 注册user-service (3) 总结 Ribbon 负载均衡 (1) 流程 三 nacos配置管理…...

【页面】表格展示

展示 Dom <template><div class"srch-result-container"><!--左侧--><div class"left"><div v-for"(item,index) in muneList" :key"index" :class"(muneIndexitem.mm)?active:"click"pa…...

天池SQL训练营(六)-综合练习题-10道经典题目

如果你还没有学习过SQL训练营的以下知识&#xff0c;请查阅主页博文学习&#xff1a; Task 1 SQL基础&#xff1a;初识数据库与SQL-安装与基本介绍等 Task 2 SQL基础&#xff1a;查询与排序-select、运算符、聚合分组查询等 Task 3 SQL进阶&#xff1a;复杂查询方法-视图、子查…...

某校园报名sign解密

某校园报名sign解密 定位 看了下确实是md5标准算法&#xff0c;接下来就看下加密的明文了 最后分开看了下&#xff0c; sign md5(用户名 活动id 10位时间戳 keys)...

2024年安防视频监控行业将面临4大机遇和挑战

当前安防监控市场处于快速发展的阶段&#xff0c;市场不仅有传统的视频监控、门禁系统等单一功能的设备&#xff0c;还涌现出了一系列集成多种安防功能的综合系统。随着人工智能技术的发展&#xff0c;安防监控设备不仅可以对场所进行实时监控&#xff0c;还可以通过图像识别、…...

搞懂HashTable, HashMap, ConcurrentHashMap 的区别,看着一篇就足够了!!!

&#x1f6e9;️&#x1f6e9;️&#x1f6e9;️ 今天给大家分享的是 HashTable, HashMap, ConcurrentHashMap之间的区别&#xff0c;也是自己学习过程中的总结。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章能对你有所帮助&#xff0c;有不足的…...

PostgreSQL 技术内幕(十二) CloudberryDB 并行化查询之路

随着数据驱动的应用日益增多&#xff0c;数据查询和分析的量级和时效性要求也在不断提升&#xff0c;对数据库的查询性能提出了更高的要求。为了满足这一需求&#xff0c;数据库引擎不断经历创新&#xff0c;其中并行执行引擎是性能提升的重要手段之一&#xff0c;逐渐成为数据…...

Vue学习计划-Vue2--Vue核心(七)生命周期

抛出问题&#xff1a;一进入页面就开启一个定时器&#xff0c;每隔1秒count就加1&#xff0c;如何实现 示例&#xff1a; <body> <div id"app">{{ n }}<button click"add">执行</button> </div><script>let vm new …...

前端知识笔记(三十四)———HBuilder的下载与使用(详细步骤)

一、HBuilder IDE的下载 HBuilder下载官网地址&#xff1a; 在地址栏中直接输入https://www.dcloud.io 或者直接点击下面的链接 DCloud - HBuilder、HBuilderX、uni-app、uniapp、5、5plus、mui、wap2app、流应用、HTML5、小程序开发、跨平台App、多端框架 进入官网&#x…...

stl容器

大部分容器的size的复杂度如下&#xff1a; std::vector&#xff1a; 时间复杂度为(1). std::deque&#xff1a; 时间复杂度为 O(1). 双端队列 std::list&#xff1a; 时间复杂度为 O(1)&#xff08;C11 及以后的版本&#xff09;。 std::forward_list&#xff1a; 时间复…...

android https 证书过期

有的时候 我们android https 证书过期 &#xff0c;或者使用明文等方式去访问服务器 可能会碰到类似的 问题 &#xff1a; javax.net.ssl.SSLHandshakeException: Chain validation failed java.security.cert.CertPathValidatorException: Response is unreliable: its validi…...

lv11 嵌入式开发 中断控制器14

目录 1 中断控制器 ​编辑 2 Exynos4412下的中断控制器 2.1 概述 2.2 特征 ​编辑 2.3 中断状态 2.4 中断类型 2.5 中断控制器GIC中断表 3 中断控制器寄存器详解 3.1 ICDDCR&#xff08;Interrupt Controller Distributor Control Register&#xff09; 3.2 ICDISER…...

IDEA 出现问题:Idea-操作多次commit,如何合并为一个并push解决方案

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…...

贝蒂的捣蛋小游戏~(C语言)

引言&#xff1a; 前面贝蒂已经给大家介绍了选择&#xff0c;循环结构~&#xff0c;今天贝蒂就基于这两种结构&#xff0c;为大家讲解一种捣蛋小游戏的设计思路和方法哦。 1.游戏要求 游戏要求&#xff1a; 1. 电脑⾃动⽣成1~100的随机数 2. 玩家猜数字&#xff0c;猜数字的过…...

c# 判断是否连接公网

有一个需求&#xff0c;软件需要在连接公网的状态下才能使用&#xff0c;否则弹出提示 我们判断一下网络不通情况 1.系统未开启网络&#xff1a;例如关掉了WIFI&#xff0c;拔掉网线 2.网络已连接无internet&#xff1a;连接了路由器&#xff0c;但路由器未连接外网 对于以上…...

unity 2d 入门 飞翔小鸟 场景延续(八)

1、新建c#脚本如下 代码&#xff0c;在前方生成生成自身图片并3s后销毁自身&#xff0c;在碰撞物体后小鸟死亡后不删除自身 using System.Collections; using System.Collections.Generic; using UnityEngine;public class CopyScene : MonoBehaviour { //要复制的对象public…...

scrapy介绍,并创建第一个项目

一、scrapy简介 scrapy的概念 Scrapy是一个Python编写的开源网络爬虫框架。它是一个被设计用于爬取网络数据、提取结构性数据的框架。 Scrapy 使用了Twisted异步网络框架&#xff0c;可以加快我们的下载速度。 Scrapy文档地址&#xff1a;http://scrapy-chs.readthedocs.io/z…...

Rust语言项目实战(九 - 完结) - 胜利与失败

回顾 在前面的章节中,我们已经实现了这个游戏中大部分的模块和功能,我们可以指挥我们的战机左右移动,并发射子弹;我们还创造了一堆的侵略者,从屏幕上方缓缓降落,试图到达屏幕的底部。 本章中,我们将对游戏的输赢作出最后的裁决,到底是我们的保卫者英勇无敌,还是侵略…...

【Linux系统编程】项目自动化构建工具make/Makefile

介绍&#xff1a; make和Makefile是用于编译和构建C/C程序的工具和文件。Makefile是一个文本文件&#xff0c;其中包含了编译和构建程序所需的规则和指令。它告诉make工具如何根据源代码文件生成可执行文件&#xff0c;里面保存的是依赖关系和依赖方法。make是一个命令行工具&a…...

harmony开发之Text组件的使用

TextInput、TextArea是输入框组件&#xff0c;通常用于响应用户的输入操作&#xff0c;比如评论区的输入、聊天框的输入、表格的输入等&#xff0c;也可以结合其它组件构建功能页面&#xff0c;例如登录注册页面。 图片来源黑马程序员 Text组件的使用&#xff1a; 文本显示组…...

using meta-SQL 使用元SQL 六

%Table Syntax %Table(recname) Description Use the %Table construct to return the SQL table name for the record specified with recname. 使用%Table构造返回使用recname指定的记录的SQL表名。 This construct can be used to specify temporary tables for runn…...

如何将浮点数点左边的数每三位添加一个逗号,如 12000000.11 转化为『12,000,000.11』

// 方法二 function format1(number) {return Intl.NumberFormat().format(number); } // 方法三 function format2(number) {return number.toLocaleString("en"); }...

朴素贝叶斯 贝叶斯方法

朴素贝叶斯 贝叶斯方法 背景知识 贝叶斯分类&#xff1a;贝叶斯分类是一类分类算法的总称&#xff0c;这类算法均以贝叶斯定理为基础&#xff0c;故统称为贝叶斯分类。先验概率&#xff1a;根据以往经验和分析得到的概率。我们用 P ( Y ) P(Y) P(Y)来代表在没有训练数据前假设…...

探索鸿蒙 TextInput组件

TextInput 根据组件名字&#xff0c;可以得知他是一个文本输出框。 声明代码&#x1f447; TextInput({placeholder?:ResourceStr,text?:ResourceStr}); placeholder: 就是提示文本&#xff0c;跟网页开发中的placeholder一样的 text&#xff1a;输入框当前的文本内容 特殊属…...

CNN,DNN,RNN,GAN,RL+图像处理常规算法(未完待续)

好的&#xff0c;让我们先介绍一些常见的神经网络模型&#xff0c;然后再讨论图像处理的常规算法。 神经网络模型&#xff1a; 1. CNN&#xff08;卷积神经网络&#xff09; 原理&#xff1a; CNN主要用于处理图像数据。它包含卷积层、池化层和全连接层。卷积层通过卷积操作…...

C# 语法笔记

1.ref、out&#xff1a;参数传递的两种方式 ref&#xff1a;引用传递 using System; namespace CalculatorApplication {class NumberManipulator{public void swap(ref int x, ref int y){int temp;temp x; /* 保存 x 的值 */x y; /* 把 y 赋值给 x */y temp; /* 把 t…...

el-table 表格多选(后端接口搜索分页)实现已选中的记忆功能。实现表格数据和已选数据(前端分页)动态同步更新。

实现效果&#xff1a;&#xff08;可拉代码下来看&#xff1a;vue-demo: vueDemo&#xff09; 左侧表格为点击查询调用接口查询出来的数据&#xff0c;右侧表格为左侧表格所有选择的数据&#xff0c;由前端实现分页。 两个el-table勾选数据联动更新 实现逻辑&#xff1a; el-…...

Vue3自定义Hooks定义

在Vue3中&#xff0c;自定义Hooks的定义是通过创建一个函数来共享逻辑或状态&#xff0c;以便在多个组件之间重复使用。Vue3中的自定义Hooks与React中的自定义Hooks非常相似&#xff0c;但有一些细微的差别。 要定义一个自定义Hook&#xff0c;可以按照以下步骤进行操作&#x…...

为什么Java程序员需要掌握多线程?揭秘并发编程的奥秘

为什么Java程序员需要掌握多线程&#xff1f;揭秘并发编程的奥秘 个人简介前言多线程对于Java的意义&#x1f4cc;1.提高程序性能&#xff1a;&#x1f4cc;2 提高用户体验&#xff1a;&#x1f4cc;3支持并发处理&#xff1a;&#x1f4cc;4 资源共享和同步&#xff1a;&#…...

数组实现循环队列(新增一个空间)

目录 一、前言 1.如何实现循环&#xff1f; 2.如何判断队列为空&#xff1f; 3.如何判断队列为满&#xff1f; 二、循环队列的结构定义 三、循环队列的创建及其初始化 四、入队 五、出队 六、取队头元素 七、取队尾元素 八、判空 九、判满 十、销毁队列 一、前言 …...

Mysql 索引概念回顾

一、什么是索引 在关系数据库中&#xff0c;索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构&#xff0c;它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录&#xff0c;可以根据…...