XML、HTML注入和越权问题处理

1、XSS和HTMl注入

原理:使用一些script脚本和html标签注入进系统,然后进行侵入。

例如:

<img  onerror="alert(1)" src="aaa" />
<p><img src=1 onerror=alert("xss") /></p>
<p><a href="http://www.baidu.com:">aaa</a></p>

处理方式:

1、进行转义,可以使用阿帕奇包里的StringEscapeUtils.escapeHtml方法进行字符串转义。

 s= StringEscapeUtils.escapeHtml4(s)

2、通过字符串替换进行过滤,替换里面的一些事件标签或者一些脚本标签。

	s = Pattern.compile("onload(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);cleanValue = s.matcher(cleanValue).replaceAll("");s = Pattern.compile("onerror(.*?)=", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);cleanValue = s.matcher(cleanValue).replaceAll("");

3、可以使用Antisamy工具进行统一的数据清洗,不过需要添加一些配置。使用的是antisamy-ebay.xml文件。需要将其放到

Spring mvc版本:

pom文件:排除slf4j是因为对项目产生了jar包冲突,若未产生则不需要排除。

<antisamy.version>1.6.2</antisamy.version> 
<!-- https://mvnrepository.com/artifact/org.owasp.antisamy/antisamy -->
<dependency><groupId>org.owasp.antisamy</groupId><artifactId>antisamy</artifactId><version>${antisamy.version}</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></exclusion><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId></exclusion></exclusions>
</dependency>

XssFilter.java

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;/****Xss过滤器**/
public class XssFilter implements  Filter{/*** 换行标识*/public static final  String line_flag = "[~line_flag~]";@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 拦截请求,处理XSS过滤chain.doFilter(new XSSHttpServletRequestWrapper((HttpServletRequest) request), response);}@Overridepublic void destroy() {}
}

XSSHttpServletRequestWrapper.java:getInputStream() 重写此方法是为了获取post提交的json数据–@RequestBody

import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;public class XSSHttpServletRequestWrapper extends HttpServletRequestWrapper {public XSSHttpServletRequestWrapper(HttpServletRequest request) {super(request);}/*** 方法说明:过滤掉字符** @param name* @return*/@Overridepublic String getParameter(String name) {String value = super.getParameter(name);return htmlFilter(value);}/*** 方法说明:过滤掉字符** @param name* @return*/@Overridepublic String getHeader(String name) {return htmlFilter(super.getHeader(name));}/*** 方法说明:过滤掉字符** @param name* @return*/@Overridepublic String[] getParameterValues(String name) {String[] values = super.getParameterValues(name);if (values == null || values.length == 0) {return values;}for (int i = 0; i < values.length; i++) {values[i] = htmlFilter(values[i]);}return values;}@Override@SuppressWarnings("unchecked")public Enumeration<String> getParameterNames(){Enumeration<String> e = super.getParameterNames();Vector<String> v = new Vector<String>();while (e.hasMoreElements()) {String paramName = e.nextElement();if(StringUtils.isBlank(paramName)){paramName = "";}paramName = htmlFilter(paramName);v.add(paramName);}return v.elements();}/*** 方法说明:过滤掉字符,struts2获取request参数就是通过该方法,所以以后要注意** @return Map*/@Override@SuppressWarnings("unchecked")public Map<String, String[]> getParameterMap() {Map<String, String[]> returnMap = new HashMap<String, String[]>();Enumeration<String> e = super.getParameterNames();while (e.hasMoreElements()) {String paramName = e.nextElement();String[] values = getParameterValues(paramName);if (StringUtils.isNotBlank(paramName)) {returnMap.put(paramName, values);}}return returnMap;}@Overridepublic ServletInputStream getInputStream() throws IOException {// 非json类型,直接返回if (!super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE)) {return super.getInputStream();}String json = IoUtil.read(super.getInputStream(), "utf-8");if (StrUtil.isEmpty(json)) {return super.getInputStream();}//转义json = StringEscapeUtils.unescapeHtml4(json);// 这里要注意,json格式的参数不能直接使用hutool的EscapeUtil.escape, 因为它会把"也给转义,// 使得@RequestBody没办法解析成为一个正常的对象,所以我们自己实现一个过滤方法// 或者采用定制自己的objectMapper处理json出入参的转义(推荐使用)json =htmlFilter(json).trim();final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));return new ServletInputStream() {@Overridepublic boolean isFinished() {return true;}@Overridepublic boolean isReady() {return true;}@Overridepublic void setReadListener(ReadListener readListener) {}@Overridepublic int read() {return bis.read();}};}private String htmlFilter(String s) {if (s == null) {return s;}final String line_flag = XssFilter.line_flag;// 换行特殊字符替换先,在AntiSamy 处理时,会将换行符处理成空格,所以在AntiSamy处理后将特殊字符替换成换行符;s = s.replace("\r\n", line_flag).replace("\r", line_flag).replace("\n", line_flag);s = HtmlFilterConfig.htmlFiler(s);s = s.replace(line_flag, "\n");return StringEscapeUtils.unescapeHtml4(s);}
}
public class HtmlFilterConfig {private static final Logger logger = LoggerFactory.getLogger(HtmlFilterConfig.class);private static HtmlFilter htmlFilter = null;public static String htmlFiler(String html) {if (htmlFilter == null) {return html;}return htmlFilter.htmlFiler(html);}/*** 初始化* @param htmlFilterClass* @param initParam*/public static void init(String htmlFilterClass, String initParam) {try {if (htmlFilterClass != null && htmlFilterClass.length() > 0) {htmlFilter = (HtmlFilter) Class.forName(htmlFilterClass).newInstance();}htmlFilter.init(initParam);} catch (InstantiationException e) {if (logger.isErrorEnabled()) {logger.error("HtmlFilter use user-defined filter:" + htmlFilterClass+ " instantiation error", e);}} catch (IllegalAccessException e) {if (logger.isErrorEnabled()) {logger.error("HtmlFilter use user-defined filter:" + htmlFilterClass+ " illegalAccess error", e);}} catch (ClassNotFoundException e) {if (logger.isErrorEnabled()) {logger.error("HtmlFilter use user-defined filter:" + htmlFilterClass+ " not found", e);}}}
}

Spring Boot版本:

AntiSamyConfig.java

@Configuration
public class AntiSamyConfig {/*** * 配置XSS过滤器** @return FilterRegistrationBean*/@Beanpublic FilterRegistrationBean<Filter> filterRegistrationBean() {FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>(new XssFilter());filterRegistrationBean.addUrlPatterns("/*");filterRegistrationBean.setOrder(1);return filterRegistrationBean;}/*** 用于过滤Json类型数据的解析器** @param builder Jackson2ObjectMapperBuilder* @return ObjectMapper*/@Bean@Primarypublic ObjectMapper xssObjectMapper(Jackson2ObjectMapperBuilder builder) {// 创建解析器ObjectMapper objectMapper = builder.createXmlMapper(false).build();// 注册解析器SimpleModule simpleModule = new SimpleModule("XssStringJsonSerializer");//入参和出参过滤选一个就好了,没必要两个都加//这里为了和XssHttpServletRequestWrapper统一,建议对入参进行处理//注册入参转义simpleModule.addDeserializer(String.class, new XssRequestWrapper.XssStringJsonDeserializer());//注册出参转义
//        simpleModule.addSerializer(new XssRequestWrapper.XssStringJsonSerializer());objectMapper.registerModule(simpleModule);return objectMapper;}
}

XssFilter.java

public class XssFilter implements Filter {/*** 换行标识*/public static final  String LINE_BREAK_FLAG = "[~line_brk_fg~]";@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 拦截请求,处理XSS过滤chain.doFilter(new XssRequestWrapper((HttpServletRequest) request), response);}@Overridepublic void destroy() {}
}

XssRequestWrapper.java

@Slf4j
public class XssRequestWrapper extends HttpServletRequestWrapper {private static Policy policy = null;// html过滤static {try {// 获取策略文件路径,策略文件需要放到项目的classpath下String antiSamyPath = Objects.requireNonNull(XssRequestWrapper.class.getClassLoader().getResource("antisamy-ebay.xml")).getFile();log.info("XssRequestWrapper::antiSamyPath 路径:{}", antiSamyPath);// 获取的文件路径中有空格时,空格会被替换为%20,在new一个File对象时会出现找不到路径的错误// 对路径进行解码以解决该问题antiSamyPath = URLDecoder.decode(antiSamyPath, "utf-8");log.info("XssRequestWrapper::antiSamyPath 路径:{}", antiSamyPath);// 指定策略文件policy = Policy.getInstance(antiSamyPath);} catch (UnsupportedEncodingException | PolicyException e) {log.error("XssRequestWrapper  failure.", e);}}public XssRequestWrapper(HttpServletRequest request) {super(request);}/*** 过滤请求头** @param name 参数名* @return 参数值*/@Overridepublic String getHeader(String name) {String header = super.getHeader(name);// 如果Header为空,则直接返回,否则进行清洗return StringUtils.isBlank(header) ? header : xssClean(header);}@Overridepublic String getParameter(String name) {String parameter = super.getParameter(name);// 如果Parameter为空,则直接返回,否则进行清洗return StringUtils.isBlank(parameter) ? parameter : xssClean(parameter);}@Overridepublic Map<String, String[]> getParameterMap() {Map<String, String[]> requestMap = super.getParameterMap();requestMap.forEach((key, value) -> {for (int i = 0; i < value.length; i++) {log.info(value[i]);value[i] = xssClean(value[i]);log.info(value[i]);}});return requestMap;}@Overridepublic ServletInputStream getInputStream() throws IOException {// 非json类型,直接返回if (!super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE)&&!super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_UTF8_VALUE)) {return super.getInputStream();}String json = IoUtil.read(super.getInputStream(), "utf-8");if (StrUtil.isEmpty(json)) {return super.getInputStream();}json = StringEscapeUtils.unescapeHtml4(json);// 这里要注意,json格式的参数不能直接使用hutool的EscapeUtil.escape, 因为它会把"也给转义,// 使得@RequestBody没办法解析成为一个正常的对象,所以我们自己实现一个过滤方法// 或者采用定制自己的objectMapper处理json出入参的转义(推荐使用)json =xssClean(json).trim();final ByteArrayInputStream bis = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));return new ServletInputStream() {@Overridepublic boolean isFinished() {return true;}@Overridepublic boolean isReady() {return true;}@Overridepublic void setReadListener(ReadListener readListener) {}@Overridepublic int read() {return bis.read();}};}@Overridepublic String[] getParameterValues(String name) {String[] parameterValues = super.getParameterValues(name);if (parameterValues != null) {int length = parameterValues.length;String[] newParameterValues = new String[length];for (int i = 0; i < length; i++) {// 清洗参数newParameterValues[i] = xssClean(parameterValues[i]);}return newParameterValues;}return super.getParameterValues(name);}/*** 使用AntiSamy清洗数据** @param value 需要清洗的数据* @return 清洗后的数据*/private String xssClean(String value) {try {final String LINE_BREAK_FLAG = XssFilter.LINE_BREAK_FLAG;// 换行特殊字符替换先,在AntiSamy 处理时,会将换行符处理成空格,所以在AntiSamy处理后将特殊字符替换成换行符;value = value.replace("\r\n", LINE_BREAK_FLAG).replace("\r", LINE_BREAK_FLAG).replace("\n", LINE_BREAK_FLAG);value = value.replace("/::<", "/::&lt;");AntiSamy antiSamy = new AntiSamy();// 使用AntiSamy清洗数据final CleanResults cleanResults = antiSamy.scan(value, policy);// 获得安全的HTML输出value = cleanResults.getCleanHTML();// 替换 双引号""value =  value.replaceAll("\"","'");value = value.replace("/::<", "/::&lt;");value = value.replace(LINE_BREAK_FLAG, "\n");// 对转义的HTML特殊字符(<、>、"等)进行反转义,因为AntiSamy调用scan方法时会将特殊字符转义return StringEscapeUtils.unescapeHtml4(value);} catch (ScanException | PolicyException e) {e.printStackTrace();}return value;}/*** 通过修改Json序列化的方式来完成Json格式的XSS过滤*/public static class XssStringJsonSerializer extends JsonSerializer<String> {@Overridepublic Class<String> handledType() {return String.class;}@Overridepublic void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {if (!StringUtils.isBlank(value)) {try {AntiSamy antiSamy = new AntiSamy();final CleanResults cleanResults = antiSamy.scan(value, XssRequestWrapper.policy);gen.writeString(StringEscapeUtils.unescapeHtml4(cleanResults.getCleanHTML()));} catch (PolicyException | ScanException e) {e.printStackTrace();}}}}/*** 处理json入参的转义*/public static class XssStringJsonDeserializer extends JsonDeserializer<String> {@Overridepublic Class<String> handledType() {return String.class;}//对入参转义@Overridepublic String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {String value = jsonParser.getValueAsString();if (value != null) {return EscapeUtil.escape(value.toString());}return value;}}
}

2、越权问题

原理:越权主要分为垂直越权和水平越权,垂直越权是指当一个普通用户使用管理员的信息能够获取到不属于自己权限内的信息。水平越权是指都是普通用户,但是不同部门不同组,却可以通过接口获取其他人的信息。

处理:我们此次主要采用的是引入Security 框架,通过@PreAuthorize注解和自定义权限认证方法去进行接口管控(此方法主要用于水平越权)。

相关代码:

登录信息放入Security:
UserDetails userDetails = new OperatorUserDetails(user, Arrays.asList(user.getPrivilege());UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));SecurityContextHolder.getContext().setAuthentication(authentication);

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)

这两个注解很重要!!!

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overridepublic void configure(HttpSecurity httpSecurity) throws Exception {ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry = httpSecurity.authorizeRequests();//url为白名单地址registry.antMatchers(url).permitAll();//允许跨域请求的OPTIONS请求registry.antMatchers(HttpMethod.OPTIONS).permitAll();registry.anyRequest().authenticated()// 自定义权限拒绝处理类.and().csrf().disable().exceptionHandling().accessDeniedHandler(restfulAccessDeniedHandler()).authenticationEntryPoint(restAuthenticationEntryPoint()).and().headers().frameOptions().disable().and().addFilterBefore(securityOncePerRequestFilter(), UsernamePasswordAuthenticationFilter.class);}/*** Override this method to configure {@link WebSecurity}. For example, if you wish to* ignore certain requests.** @param web*/@Overridepublic void configure(WebSecurity web) throws Exception {super.configure(web);web.httpFirewall(defaultHttpFireWall());}@Beanpublic RestfulAccessDeniedHandler restfulAccessDeniedHandler() {return new RestfulAccessDeniedHandler();}@Beanpublic RestAuthenticationEntryPoint restAuthenticationEntryPoint() {return new RestAuthenticationEntryPoint();}@Beanpublic SecurityOncePerRequestFilter securityOncePerRequestFilter() {return new SecurityOncePerRequestFilter();}@Beanpublic HttpFirewall defaultHttpFireWall() {return new DefaultHttpFirewall();}}

RestfulAccessDeniedHandler.java

public class RestfulAccessDeniedHandler implements AccessDeniedHandler{@Overridepublic void handle(HttpServletRequest request,HttpServletResponse response,AccessDeniedException e) throws IOException, ServletException {response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Cache-Control","no-cache");response.setCharacterEncoding("UTF-8");response.setContentType("application/json");response.getWriter().println("您没有权限"));response.getWriter().flush();}
}

RestAuthenticationEntryPoint.java

public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {@Overridepublic void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Cache-Control","no-cache");response.setCharacterEncoding("UTF-8");response.setContentType("application/json");response.getWriter().println("您暂未登录");response.getWriter().flush();}
}

使用方法:在接口层次上加 @PreAuthorize(“@pms.hasPermission(‘自定义的权限值’)”)

/*** @Description  检查客服权限*/
@Component("pms")
public class PermissionService {/*** 检查权限* @param permissions* @return*/public boolean hasPermission(String ...permissions){Authentication authentication = SecurityContextHolder.getContext().getAuthentication();Object principal = authentication.getPrincipal();if ("anonymousUser".equals(principal)){return false;}OperatorUserDetails userDetails = (OperatorUserDetails) principal;User user = userDetails.getUser();for (String permission : permissions) {if (user.getPrivilege().hasPrivilege(permission)){return true;}}return false;}
}

SecurityWebApplicationInitializer.java 必须存在,不然会出现篡权问题

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
//public class SecurityWebApplicationInitializer {}

需要导入此配置。

@Import({ SecurityConfig.class})

注意:如果接口没有权限,默认是会返回500,所以为了进一步区分,所以建议拦截@ExceptionHandler(AccessDeniedException.class)和@ExceptionHandler(AuthenticationException.class)这两个异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/89821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度SEO优化基本原理(掌握SEO基础,提高网站排名)

随着互联网的迅速发展&#xff0c;越来越多的企业开始意识到网站优化的重要性&#xff0c;其中百度SEO优化是企业不可忽视的一项工作。本文将介绍百度SEO优化的基本概念、步骤、原理、解决方法和提升网站标题优化的方法。蘑菇号-www.mooogu.cn 百度SEO优化是指针对百度搜索引擎…

数字IC设计笔试常见大题整理(简答+手撕)

IC修真院为大家整理了一些数字IC设计的笔试常见题目&#xff0c;大家快来领取吧~ 面试题目&#xff08;文末可全领&#xff09; 1. 简述latch与FF的区别&#xff0c;并用verilog分别实现1bit latch与DFF。 Latch对电平信号敏感&#xff0c;在输入脉冲的电平作用下改变状态。…

电脑显示系统错误怎么办?

有时我们在开机时会发现电脑无法开机&#xff0c;并显示系统错误&#xff0c;那么这该怎么办呢&#xff1f;下面我们就一起来了解一下。 方法1. 替换SAM文件解决问题 1. 重启电脑并进入安全模式。 Win8/10系统&#xff1a;在启动电脑看到Windows标志时&#xff0c;长按电源键…

k8s中常用命令总结

文章目录 进入pod容器的命令pod中只有1个用户容器pod中只有2个&#xff08;含&#xff09;以上用户容器 yaml中的字段不清楚后面跟什么&#xff0c;通过explain来查看查看pod内指定容器的日志Pod内各个容器的服务端口不能相同资源对象的创建方式一方式二 查看pod的详细信息查看…

C++ 32盏灯,利用进制和 与 或 进行设计

一共32盏灯&#xff0c;设计一个灯光控制系统&#xff0c;其中 台球部8盏灯 桌游区8盏灯 酒吧区8盏灯 休息区8盏灯 满足以下功能 1、能够独立控制每一盏灯 2、能够一次性打开或关闭一个区域的全部灯光 3、能够获取各个区域的灯光打开关闭情况 4、能够一次性关闭打开的灯&#x…

C++中实现雪花算法来在秒级以及毫秒及时间内生成唯一id

1、雪花算法原理 雪花算法&#xff08;Snowflake Algorithm&#xff09;是一种用于生成唯一ID的算法&#xff0c;通常用于分布式系统中&#xff0c;以确保生成的ID在整个分布式系统中具有唯一性。它的名称来源于雪花的形状&#xff0c;因为生成的ID通常是64位的整数&#xff0…

Servlet开发-通过代码案例熟悉HttpServletRequest类

关于Servlet开发的流程推荐看servlet开发-通过Tomcat部署一个简单的webapp Servlet开发与idea集成的插件安装推荐看idea集成tomcat&#xff08;Smart Tomcate插件安装&#xff09; postman&#xff08;第三方创建HTTP请求工具&#xff09;的安装推荐看创建HTTP请求的几种方式…

vue 脚手架 入门 记录

vue 脚手架 入门 记录 以管理员身份运行PowerShell执行&#xff1a;get-ExecutionPolicy&#xff0c;回复Restricted&#xff0c;表示状态是禁止的 3.执行&#xff1a;set-ExecutionPolicy RemoteSigned 4.选择Y 注意&#xff1a;一定要以管理员的身份运行PowerShell&#xff…

【JVM】并发可达性分析-三色标记算法

欢迎访问&#x1f44b;zjyun.cc 可达性分析 为了验证堆中的对象是否为可回收对象&#xff08;Garbage&#xff09;标记上的对象&#xff0c;即是存活的对象&#xff0c;不会被垃圾回收器回收&#xff0c;没有标记的对象会被垃圾回收器回收&#xff0c;在标记的过程中需要stop…

JeecgBoot v3.5.5 版本发布,性能大升级版本—开源免费的低代码开发平台

项目介绍 JeecgBoot是一款企业级的低代码平台&#xff01;前后端分离架构 SpringBoot2.x&#xff0c;SpringCloud&#xff0c;Ant Design&Vue3&#xff0c;Mybatis-plus&#xff0c;Shiro&#xff0c;JWT 支持微服务。强大的代码生成器让前后端代码一键生成! JeecgBoot引领…

LeetCode 四数相加II 哈希

原题链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题面&#xff1a; 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i,…

【Java 进阶篇】深入理解 SQL 分组查询

SQL 是结构化查询语言&#xff08;Structured Query Language&#xff09;的缩写&#xff0c;是用于管理关系型数据库的标准语言。在 SQL 中&#xff0c;查询是其中最重要的部分之一&#xff0c;通过查询&#xff0c;我们可以从数据库中检索所需的数据。分组查询是 SQL 查询中的…

生命在于研究——CVE-2021-22214记录

一、前言 我现在在某央企驻场&#xff0c;渗透测试工程师&#xff0c;也负责漏洞管理平台&#xff0c;也就是监测、渗透测试出现的漏洞&#xff0c;都会录入平台&#xff0c;走流程整改复测办结。 二、漏洞详情 1、漏洞简介 GitLab存在前台未授权SSRF漏洞&#xff0c;未授权…

认识电磁干扰?|深圳比创达EMC

认识电磁干扰&#xff1f;相信不少人是有疑问的&#xff0c;今天深圳市比创达电子科技有限公司就跟大家解答一下&#xff01; 1、电磁干扰(Electromagnetic Interference)&#xff1a;简称EMI&#xff0c;有传导干扰和辐射干扰两种&#xff1b; 2、传导干扰&#xff1a;主要是…

win10录屏的3种方法,让你的视频更加精彩

在现代工作和娱乐中&#xff0c;录制屏幕活动已经变得非常重要。无论您是教育工作者、内容创作者还是想分享您的技能或游戏成就&#xff0c;win10 提供了多种方法来满足这个需求。本文将介绍3种win 10录屏的方法。无论您是初学者还是有经验的用户&#xff0c;我们都会为您提供详…

联盟 | 彩漩 X HelpLook,AI技术赋能企业效率提升

近日&#xff0c;AI 驱动的 PPT 协作分享平台「 彩漩 」与 AI 知识库搭建工具「 HelpLook」&#xff0c;携手为用户工作流注入更多智能和创造力&#xff0c;全面拥抱 AIGC 时代带来的机遇&#xff0c;致力于提供前沿的智能解决方案。 彩 漩 彩漩是一个以 AI 技术为基础、贯彻 …

自制网页。

文章目录 注:代码中图片等素材均来自网络,侵删 20230920_213831 index.html <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-…

Java当中的BIO模型

我们知道Java中的IO模型分为BIO和NIO模型&#xff0c;BIO是BlCKING IO的简称而NIO当中的N有两层意思&#xff0c;一个是从java1.4开始出现的NEW IO&#xff0c;今天我们来聊一聊为什么传统的BIO会慢以及它并不适合大量的连接&#xff0c;我们先来看一段简单的代码&#xff0c;这…

pt28django教程

缓存 缓存是一类可以更快的读取数据的介质统称&#xff0c;读取硬盘、较复杂的计算、渲染都会产生较大的耗时。数据变化频率不会很高的场景适合使用缓存。使用缓存场景&#xff1a;博客列表页、电商商品详情页、缓存导航及页脚。 Django中设置缓存 Django中提供多种缓存方式…

什么是堆栈和队列?如何实现它们?

堆栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;是两种常见的线性数据结构&#xff0c;用于组织和管理数据。它们分别具有不同的特点和用途。本文将详细解释堆栈和队列的概念、特点以及如何实现它们。 堆栈&#xff08;Stack&#xff09; 什么是堆栈&…