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

常见的安全测试漏洞详解

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快

一、SQL注入攻击

SQL 注入攻击主要是由于程序员在开发过程中没有对客户端所传输到服务器端的参数进行严格的安全检查,同时 SQL 语句的执行引用了该参数,并且 SQL 语句采用字符串拼接的方式执行时,攻击者将可能在参数中插入恶意的 SQL 查询语句,导致服务器执行了该恶意 SQL 语句。

SQL 注入可能造成的危害有:网页、数据被篡改,核心数据被窃取,数据库所在的服务器被攻击,变成傀儡主机。

1.测试方法

在需要进行查询的页面,输入正确查询条件 and 1=1 等简单 sql 语句,查看应答结果,如与输入正确查询条件返回结果一致,表明应用程序对用户输入未进行过滤,可以初步判断此处存在 SQL 注入漏洞。

2.防止sql注入

(1)JBDC 方式查询,我们可以利用 PreparedStatement,这样不光能提升查询效率,而且他的 set 方法已经为我们处理好了 sql 注入的问题。

图片

(2)hibernate 方式查询,我们利用 name:parameter 方式查询,例如利用 find(String queryString, Object value…Object value) 方法查询,就可以避免 sql 注入.

在这里插入图片描述

(3)在查询方法中我们检查 sql,将非法字符转换,导致 sql 注入的字符串,过滤掉或者转化。

(4)在页面中限制,我们通过 js 设置,不让用户输入非法字符。

(5)拦截请求的每一个参数,并将这个参数的非法字符转化,下面的为提交的参数中没有附件的,实现方式。首先在 web.xml 配置文件中添加这个类的 filter,继承类 HttpServletRequestWrapper,如图

在这里插入图片描述

(6)拦截请求的每一个参数,并将这个参数的非法字符转化,下面的为提交的参数中 有含附件的,实现方式。在 xml 中配置上传的时候,配置这个类.继承类 CommonsMultipartResolver 如图

在这里插入图片描述

(7)使用服务器安全狗,安装好网页安全狗和服务器安全狗,可以有效的避免 sql 被注入入侵的风险,如果有更高级的需求还可以联系安全狗可以提供更为强大的云安全服务,帮助用户抵御外来入侵。

二、CSRF跨站伪造请求

CSRF(Cross-Site Request Forgery,跨站点伪造请求)是一种网络攻击方式,该攻击可以在用户毫不知情的情况下以用户自身的名义伪造请求发送给受攻击站点,从而在未授权的情况下执行在权限保护之下的操作。具体来讲,可以这样理解 CSRF 攻击:攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的。

图片

CSRF攻击攻击原理及过程如下:

1.用户 C 打开浏览器,访问受信任网站 A,输入用户名和密码请求登录网站 A;

2.在用户信息通过验证后,网站 A 产生 Cookie 信息并返回给浏览器,此时用户登录网站 A 成功,可以正常发送请求到网站 A;

3.用户未退出网站 A 之前,在同一浏览器中,打开一个 TAB 页访问网站 B;

4.网站 B 接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点 A;

5.浏览器在接收到这些攻击性代码后,根据网站 B 的请求,在用户不知情的情况下携带 Cookie 信息,向网站 A 发出请求。网站 A 并不知道该请求其实是由 B 发起的,所以会根据用户 C 的 Cookie 信息以 C 的权限处理该请求,导致来自网站 B 的恶意代码被执行。

测试方法

同个浏览器打开两个页面,一个页面权限失效后,另一个页面是否可操作成功;

使用工具发送请求,在 http 请求头中不加入 referer 字段,检验返回消息的应答。

防御 CSRF 攻击

比如请求的 Referer 是指向黑客自己的网站 B 而不是网站 A。因此,要防御 CSRF 攻击,网站 A 只需要对于每一个请求验证其 Referer 值,如果是 A 网站的域名,则说明该请求是来自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。

Referer 的值是由浏览器提供的,并不能保证浏览器自身没有安全漏洞。对于某些浏览器,目前已经有一些方法可以篡改 Referer 值,黑客完全可以修改 Referer 值,这样就可以通过验证,从而进行 CSRF 攻击。可在请求中添加 token 并验证。

三、XSS跨站脚本攻击

由于 web 程序对用户的输入过滤不足,导致用户输入的恶意 HTML/Javascript 代码注入到网页中,混淆原有语义,产生新的恶意语句。在其他用户访问网页时,浏览器就会触发恶意的网页代码,从而达到 XSS 攻击的目的。

XSS(Cross Site Script),与 SQL 注入相似,XSS 是通过网页插入恶意脚本,主要用到的技术也是前端的 HTML 和 JavaScript 脚本。当用户浏览网页时,实现控制用户浏览器行为的攻击方式。一次成功的 XSS,可以获取到用户的 cookie,利用该 cookie 盗取用户对该网站的操作权限;也可以获取到用户联系人列表,利用被攻击者的身份向特定的目标群发送大量的垃圾信息,等等。

XSS 分为三类:存储型 (持久性 XSS)、反射型 (非持久性 XSS)、DOM 型。所造成的影响主要是窃取用户登录凭证(Cookies)、挂马攻击、页面访问挟持等。

1.持久型跨站:最直接的危害类型,跨站代码存储在服务器(数据库)。

攻击者把恶意脚本注入服务器并存储起来,等待受害者请求此脚本并在浏览器中自动运行。
使用场景:攻击者在评论区提交带有恶意脚本的评论,如果服务器检查不出恶意脚本,那么此恶意评论会被存入服务器数据库,下一个用户访问时,评论会被自动获取并展示,其中恶意脚本也被自动运行了。

在这里插入图片描述

2.非持久型跨站:反射型跨站脚本漏洞,最普遍的类型。用户访问服务器 - 跨站链接 - 返回跨站代码。

通过用户点击恶意链接,获取用户已登录的会话 cookie(黑客在留言板中插入恶意代码
受害者访问被植入恶意代码的页面,恶意代码将 cookie 发送给黑客的服务器,一般使用 xss 平台生成 payload,受害者执行之后 cookie 会被发送到 xss 平台)

在这里插入图片描述

3.DOM 跨站(DOM XSS):DOM(document object model 文档对象模型),客户端脚本处理逻辑导致的安全问题,在用户浏览的页面中直接注入代码。

实例:HTML 中有个锚的功能,也就是通过 #id 来实现当页面的跳转。

在这里插入图片描述

(1)测试方法

a.在数据输入界面,输入:alert(/123/),保存成功后如果弹出对话框,表明此处存在一个 XSS 漏洞。(或输入框中输入)

b.或把 url 请求中参数改为 alert(/123/),如果页面弹出对话框,表明此处存在一个 XSS 漏洞。(或 url 请求参数中值改为)

(2)怎么防止 XSS 攻击?

XSS 来源于用户提供的内容,只要过滤掉其中的恶意代码即可,Node.js 项目中推荐使用 xss 库来完成这个工作

在这里插入图片描述

四、URL跳转漏洞

URL 跳转漏洞,即未经验证的重定向漏洞,是指 Web 程序直接跳转到参数中的 URL,或者在页面中引入了任意开发者的 URL,将程序引导到不安全的第三方区域,从而导致安全问题。

图片

1.测试方法

(1)使用抓包工具抓取请求。

(2)抓取 302 的 url,修改目标地址,查看是否能跳转。

图片

ps:不过现在很多跳转都加了 referer 的校验导致攻击者跳转失败

2.绕过URL跳转限制

(1)利用?号绕过限制

比如:http://www.aaa.com/acb?Url=http://login.aaa.com
这是一个跳转链接,跳转到它的二级域名下,那么这个问号放哪里可以绕过呢?其实就是放到它自身的域名前面也就是你添加的想要跳转的域名的后面,如:http://www.aaa.com/acb?Url=http://test.com?login.aaa.com 。它其实是会跳转到这个 test.com 域名下,这个域名是我想要跳转的任意域名,而后面的它自身域名一定要带上,不带上就无法辅助用问号?这个特性来跳转到指定域名了,而跳转后,问号和问号后面的内容会变为这样:http://www.test.com/?login.aaa.com

(2)利用反斜杠和正斜杠绕过限制

比如:http://www.aaa.com/acb?Url=http://login.aaa.com/ 同样是在它本身域名钱加上正斜杠,然后正斜杠前面跟上你想跳转的域名地址
如:http://www.aaa.com/acb?Url=http://test.com/login.aaa.com

反斜杠有三种思路:

两个反斜杠绕过方法

比如:http://www.aaa.com/acb?Url=http://login.aaa.com/ 同样是在它本身域名前加上两个反斜杠,然后两个反斜杠前面跟上你想跳转的域名地址
如:http://www.aaa.com/acb?Url=http://test.comlogin.aaa.com\

一个反斜杠绕过方法

如:http://www.aaa.com/acb?Url=http://test.comlogin.aaa.com\

另一种思路,一个反斜杠一个点

利用.这样的格式,也就是一个反斜杠加一个点来跳过限制,

如:http://www.aaa.com/acb?Url=http://test.com.login.aaa.com\

(3)利用@绕过URL 限制

如果你用这方法在火狐里进行跳转,会有弹窗提示,在其它游览器则没有。

如:http://www.aaa.com/acb?Url=http//login.aaa.com@test.com 后面的 test.com 就是要跳转到的域名,前面的域名都是用来辅助以绕过限制的:

(4)利用 # 号绕过

如:http://www.aaa.com/acb?Url=http://test.com#login.aaa.com

(5)利用白名单缺陷绕过

有的域名白名单限制是不全的,比如如果想利用一个跳转,而这个跳转是通用,在这个公司网站很多子域名等都可以跳转,那么你买个域名也不算贵对吧,为什么这么说呢,这个问题就是白名单限制不当,比如,当跳转的域名包含这个网站下的所有域名,比如:
http://www.aaa.com/acb?Url=http://login.aaa.comlogin.aaa.com 也可以改成 aaa.com 同样可以跳转对吧,因为白名单里只要有包含这个域名就直接成功跳转。那么当我在这个域名前面加上如 testaaa.com,白名单里会检查是否包含 aaa.com 这个域名,包含,然后直接跳转,而并没有检查这个域名的整个信息,然后可以利用这个问题,直接注册一个 testaaa.com 这个域名就可以利用这个跳转。

3.预防或修复漏洞方法

(1)若跳转的 URL 事先是可以确定的,包括 url 和参数的值,则可以在后台先配置好,url 参数只需传对应 url 的索引即可,通过索引找到对应具体 url 再进行跳转;

(2)若跳转的 URL 事先不确定,但其输入是由后台生成的(不是用户通过参数传入),则可以先生成好跳转链接然后进行签名,而跳转 cg 首先需要进行验证签名通过才能进行跳转;注:“签名 (sign):就是在应用程序的特定字段写入特定的标记信息,表示该软件已经通过了签署者的审核。签署者对该软件的安全性负责;

(3)若 1 和 2 都不满足,url 事先无法确定,只能通过前端参数传入,则必须在跳转的时候对 url 进行按规则校验:即控制 url 是否是你们公司授权的白名单或者是符合你们公司规则的 url:

(4)XSS 漏洞的注意事项 :跳转 url 检测中也加入了 CRLF 头部注入漏洞的检测逻辑, 具体就是在请求参数中加入了%0d%0a 这种测试代码,需要对这些参数进行删除处理 (事实上:在判断到一个参数中包含 %00 -> %1f 的控制字符时都是不合法的,需对其进行删除)。

(5)开源项目及时进行升级,如 Django 升级 pip install django --upgrade 比如中华 GIS 对 nacos、Log4j2、nginx 等进行升级,应中华要求对存在漏洞的服务进行升级。

五、任意文件上传

文件上传漏洞是 web 安全中经常用到的一种漏洞形式。是对数据与代码分离原则的一种攻击。上传漏洞顾名思义,就是攻击者上传了一个可执行文件如木马,病毒,恶意脚本,WebShell 等到服务器执行,并最终获得网站控制权限的高危漏洞。

文件上传漏洞危害:上传漏洞与 SQL 注入或 XSS 相比 , 其风险更大 , 如果 Web 应用程序存在上传漏洞 , 攻击者上传的文件是 Web 脚本语言,服务器的 Web 容器解释并执行了用户上传的脚本,导致代码执行。如果上传的文件是 Flash 的策略文件 crossdomain.xml,黑客用以控制 Flash 在该域下的行为。如果上传的文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行。如果上传的文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。甚至攻击者可以直接上传一个 webshell 到服务器上 完全控制系统或致使系统瘫痪。

1.常见的防护方法

网站常见的防护方法,知道了网站是如何防护该漏洞的,有利于我们更好地开展渗透测试。

对文件上传的防护大体上可以分为两类,一类是客户端检测,另一类是服务端检测。

(1)客户端检测

客户端检测是指依靠浏览器,用 JS 代码去检测。一般是在网页上写一段 Js 脚本,用 Js 去检测,在文件未上传时,校验文件的后缀名,检测的方式有白名单和黑名单两种。
那么如何判断是否为客户端检测?

在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png 后缀名的文件,而此时并没有发送数据包,所以可以通过抓包来判断,如果弹出不准上传,但是没有抓到数据包,那么就是采用了前端验证。

从安全的角度来看,前端验证非常不可靠,上传正常文件再改数据包就可以绕过,甚至关闭 JS 都可以尝试绕过。很多程序员使用 JavaScript 来拒绝非法文件的上传,这种验证方式对一些普通用户防止上传错误还可以,但是对专业的技术人员来说,这是非常低级的验证方式。攻击者可以用非常多的方法来突破客户端的验证。

由于前端代码对用户完全开放,因此很容易通过分析前端代码来绕过,所以相当于没有检测。可以用以下三种方式去绕过或者删除前端的检测:

用 burp 抓个返回包然后把前端代码里面文件检测的部分代码删掉 (这种方式也叫中间人攻击);

点检查,然后找到文件检测部分的 JS 代码,删掉即可,(但是最保险的办法还是抓包后再去删);

根据前端代码允许上传的类型,预先把木马文件后缀改成相应的后缀,比如 jpg,通过前端代码的检测以后,会自动往服务器发包,然后通过 burp 去拦截这个包,把后缀名改回来。

(2)服务端检测

服务端检测是先将文件上传到服务器,然后服务器依靠后端代码去检测上传的文件是否合规。服务器脚本一般会检测文件的 MIME 类型(文件的媒体类型)、扩展名是否合法,甚至可能会去检测文件中是否嵌入恶意代码。

服务端检测几个常见的手段有:检查 Content-Type(内容类型)、检查后缀 (检查后缀是主流,根据后缀来决定用什么方式来处理这个文件)、检查文件头等。

(3)白名单和黑名单的区别

黑名单:不允许某某类型的文件上传;

白名单:只允许某某类型的文件上传。

显然白名单的方式比黑名单更安全,黑名单很容易就会被绕过。

那么如何判断目标是黑名单还是白名单呢,其实很简单,只要上传一个莫名其妙的后缀,比如 1.czczxca,这个后缀的文件肯定不存在,所以如果能上传成功,说明目标是黑名单检测,如果上传失败,则目标是白名单检测。

2.文件上传漏洞绕过技巧

一般来说文件上传过程中检测部分由客户端 javascript 检测、服务端 Content-Type 类型检测、服务端 path 参数检测、服务端文件扩展名检测、服务端内容检测组成。但这些检测并不完善,且都有绕过方法。

客户端检测绕过(js 检测):

利用 firebug 禁用 js 或使用 burp 代理工具可轻易突破。

如果只对.jpg 后缀设置了白名单,我们可以先把后缀改为.jpg 绕过,再到 Burp Suite 抓包把后缀改回.php

➢服务端 MIME 检测绕过(Content-Type 检测):

使用 burpsuit 代理,修改 Content-Type 的参数

对于只允许指定 Content-Type(内容类型)这种防护手段,最简单的绕过方法是直接上传一个允许的文件类型再抓包修改后缀名。以上传 jpg 文件为例,先上传该文件,抓包修改后缀名为实际的后缀名.php,由于上传的时候是 jpg,所以浏览器发送的数据包中,Content-Type 的类型默认为 jpg,那么此时发送的文件就可以绕过后端的检测。

➢服务端扩展名检测绕过:

文件名大小写绕过,例如 Php,AsP 等类似的文件名

对于那种老版本的 WEB 容器,是区分大小写的,所以这种方法只对 WEB 容器非常古老的版本有效。原理很简单,在解析的时候,windows 的文件和文件夹都是不区分大小写的,而 WEB 容器区分大小写,因此上传的时候就有可能绕过该 WEB 容器,从而实现绕过后缀名检测。

后缀名字双写嵌套,例如 pphphp,asaspp 等

来看一段源代码:

f i l e n a m e = s t r i r e p l a c e ( file_name = str_ireplace(filen​ame=stri​replace(deny_ext,“”, $file_name);

这里的意思就是把检测到的危险字符替换为空,php 被替换为空,那么假设上传的文件后缀名为 pphphp,被替换为空后就会变为 php,从而实现了绕过。

可以利用系统会对一些特殊文件名做默认修改的系统特性绕过

文件后缀加空格或点绕过后缀名检测

在文件名后面留一个空格,然后上传上去后空格会被自动的省略,但是看源码可知道,源码中黑名单中没有过滤空值,那么 php 和 php 空格,当然是不一样的。

注意:windows 会自动去除文件末尾的空格,所以需要先上传正常的文件,然后抓包在后缀名的地方加空格,再放包,就可以了。这里的空格改成点也是一样的。

可以利用 asp 程序中的漏洞,使用截断字符绕过

%00 截断和 00 截断

了解%00 之前我们要先了解 0x00。

00 截断:类似我们用对讲机或者电报通话时,说完一句话会用 over 表示一句话说完了,而电脑也需要一个截断的信号,而这个信号就是 00 截断。

0x 是一个十六进制表示方式,声明这是十六进制数,00 实际上就是表示 ascii 码值为 0,有些函数在处理这个字符的时候会把这个字符当做结束符,他们就读取到这里认为这一段结束了。

了解这个有什么用呢?

在文件上传时,如果遇到了白名单机制只允许上传 jpg 后缀的,我们该怎么办?JPG 格式并不会被解析,那么我们需要绕过上传过滤。

假如我写了 1.php%00.jpg 传参之后,有些过滤都是直接匹配字符串,他强行匹配到了结尾是.jpg,然后允许上传,但是 php 的函数去执行的时候他读取到 0x00 认为结束了,那么这个文件就变成了 1.php,从而实现绕过白名单。

%00 实际上和 00 截断是一模一样的原理,只不过%00 是经过 URL 编码的,%00 解码后就是 0x00 截断的那个字符。

需要注意%00 和 00 的区别,只有 GET 传参会进行一次 URL 编码,其他的传参方式不会,所以只有 GET 传参能够识别这种%00 的截断。

可以利用不在黑名单列表中却能够成功执行的同义后缀名绕过黑名单的限制

换一个后缀名绕过黑名单检测

假设我们要上传的文件为 php 文件,那么就要去尝试,看看什么样的后缀名会被当成 php 文件解析。实际上,除了后缀为.php 的文件会被当成 php 文件解析, 还有 phtml php3 php4 php5 之类的后缀也会,可以都去尝试一下,看看能否上传成功。

对于不同的文件,可以采用不同的后缀去测试,虽然概率很小,但万一成功了呢?

可以利用解析/包含漏洞配合上传一个代码注入过的白名单文件绕过

用.htaccess 文件巧妙绕过黑名单

假如开发者把后端代码写的很严格,甚至后缀名的大小写也写进了黑名单,那么就可以尝试用.htaccess 文件来绕过了。

.htaccess 全称是 Hypertext Access(超文本入口)。htaccess 文件也被称为分布式配置文件,是 Apache 特有的的针对目录改变配置的方法。通过在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。该文件可以针对不同的目录采用不同的策略。

一般后端的黑名单不会过滤把.htaccess 后缀写进去,那么我们可以先上传一个.htaccess 文件上去,提前设置好让它把.jpg 文件当做 php 文件来解析,这样后续只需要上传.jpg 文件就可以了。

.htaccess 文件的内容如下:

AddType application/x-httpd-php .jpg

这个指令代表着.jpg 文件会当做 php 文件来解析。

3.文件上传漏洞预防

系统运行时的防御

(1)文件上传的目录设置为不可执行。只要 web 容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。

(2)判断文件类型。在判断文件类型时,可以结合使用 MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者 resize 函数,在处理图片的同时破坏图片中可能包含的 HTML 代码。

(3)使用随机数改写文件名和文件路径。文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像 shell.php.rar.rar 和 crossdomain.xml 这种文件,都将因为重命名而无法攻击。

(4)单独设置文件服务器的域名。由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传 crossdomain.xml、上传包含 Javascript 的 XSS 利用等问题将得到解决。

(5)使用安全设备防御。文件上传攻击的本质就是将恶意文件或者脚本上传到服务器,专业的安全设备防御此类漏洞主要是通过对漏洞的上传利用行为和恶意文件的上传过程进行检测。恶意文件千变万化,隐藏手法也不断推陈出新,对普通的系统管理员来说可以通过部署安全设备来帮助防御。

系统开发阶段的防御

(1)系统开发人员应有较强的安全意识,尤其是采用 PHP 语言开发系统。在系统开发阶段应充分考虑系统的安全性。

(2)对文件上传漏洞来说,最好能在客户端和服务器端对用户上传的文件名和文件路径等项目分别进行严格的检查。客户端的检查虽然对技术较好的攻击者来说可以借助工具绕过,但是这也可以阻挡一些基本的试探。服务器端的检查最好使用白名单过滤的方法,这样能防止大小写等方式的绕过,同时还需对%00 截断符进行检测,对 HTTP 包头的 content-type 也和上传文件的大小也需要进行检查。

系统维护阶段的防御

(1)系统上线后运维人员应有较强的安全意思,积极使用多个安全检测工具对系统进行安全扫描,及时发现潜在漏洞并修复。

(2)定时查看系统日志,web 服务器日志以发现入侵痕迹。定时关注系统所使用到的第三方插件的更新情况,如有新版本发布建议及时更新,如果第三方插件被爆有安全漏洞更应立即进行修补。

(3)对于整个网站都是使用的开源代码或者使用网上的框架搭建的网站来说,尤其要注意漏洞的自查和软件版本及补丁的更新,上传功能非必选可以直接删除。除对系统自生的维护外,服务器应进行合理配置,非必选一般的目录都应去掉执行权限,上传目录可配置为只读。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

相关文章:

常见的安全测试漏洞详解

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、SQL注入攻击 SQL 注入攻击主要是由于程序员在开发过程中没有对客户端所传输到服务器端的参数进行严格的安全检查,同时 SQL 语句的执行引用了该参…...

代理模式和适配器模式有什么区别

代理模式(Proxy Pattern)和适配器模式(Adapter Pattern)都是结构型设计模式,它们有不同的应用场景和目标,虽然在某些方面看起来相似,但它们的意图和实现方式有显著的区别。 1. 代理模式&#x…...

机器学习头歌(第三部分-强化学习)

一、强化学习及其关键元素 二、强化学习的分类 三、任务与奖赏 import numpy as np# 迷宫定义 maze np.array([[0, 0, 0, 0, 0],[0, -1, -1, 0, 0],[0, 0, 0, -1, 0],[-1, -1, 0, -1, 0],[0, 0, 0, -1, 1] ])# 定义强化学习的参数 gamma 0.8 # 折扣因子 alpha 0.5 # 学习率…...

【Hive】新增字段(column)后,旧分区无法更新数据问题

TOC 【一】问题描述 Hive修改数据表结构的需求,比如:增加一个新字段。 如果使用如下语句新增列,可以成功添加列col1。但如果数据表tb已经有旧的分区(例如:dt20190101),则该旧分区中的col1将为…...

智能化的城市管理解决方案,智慧城管执法系统源码,微服务架构、Java编程语言、Spring Boot框架、Vue.js前端技术

智慧城管执法系统是一种高度信息化、智能化的城市管理解决方案,它利用现代信息技术,如微服务架构、Java编程语言、Spring Boot框架、Vue.js前端技术、Element UI组件库、UniApp跨平台开发工具以及MySQL数据库等,构建了一个综合性的执法管理平…...

【区间DP】【hard】力扣1312. 让字符串成为回文串的最少插入次数

加粗样式给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符。 请你返回让 s 成为回文串的 最少操作次数 。 「回文串」是正读和反读都相同的字符串。 示例 1: 输入:s “zzazz” 输出:0 解释:字…...

android刷机

android ota和img包下载地址: https://developers.google.com/android/images?hlzh-cn android启动过程 线刷 格式:ota格式 模式:recovery 优点:方便、简单,刷机方法通用,不会破坏手机底层数据&#xff0…...

web-前端小实验8

实现以上图片中的内容 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wid…...

C++实现设计模式---单例模式 (Singleton)

单例模式 (Singleton) 概念 单例模式 确保一个类在整个程序生命周期中只有一个实例&#xff0c;并提供一个全局访问点。 它是一种创建型设计模式&#xff0c;广泛用于需要共享资源的场景。 使用场景 配置管理器&#xff1a;程序中需要一个全局的配置对象。日志系统&#xff…...

【大数据】机器学习-----线性模型

一、线性模型基本形式 线性模型旨在通过线性组合输入特征来预测输出。其一般形式为&#xff1a; 其中&#xff1a; x ( x 1 , x 2 , ⋯ , x d ) \mathbf{x}(x_1,x_2,\cdots,x_d) x(x1​,x2​,⋯,xd​) 是输入特征向量&#xff0c;包含 d d d 个特征。 w ( w 1 , w 2 , ⋯ ,…...

C#类型转换

C#是静态类型的语言&#xff0c;变量一旦声明就无法重新声明或者存储其他类型的数据&#xff0c;除非进行类型转换。本章的主要任务就是学习类型转换的知识。类型转换有显式的&#xff0c;也有隐式的。所谓显式&#xff0c;就是我们必须明确地告知编译器&#xff0c;我们要把变…...

OpenCV相机标定与3D重建(55)通用解决 PnP 问题函数solvePnPGeneric()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 根据3D-2D点对应关系找到物体的姿态。 cv::solvePnPGeneric 是 OpenCV 中一个更为通用的函数&#xff0c;用于解决 PnP 问题。它能够返回多个可能…...

NVIDIA CUDA Linux 官方安装指南

本文翻译自&#xff1a;https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#post-installation-actions NVIDIA CUDALinux安装指南 CUDA工具包的Linux安装说明。 文章目录 1.导言1.1.系统要求1.2.操作系统支持政策1.3.主机编译器支持政策1.3.1.支持的C方言…...

C++中的STL

STL&#xff08;标准模板库&#xff09;在广义上分为&#xff1a;容器&#xff0c;算法&#xff0c;迭代器 容器和算法之间通过迭代器进行无缝衔接 STL大体上分为六大组件:分别为容器&#xff0c;算法&#xff0c;迭代器&#xff0c;仿函数&#xff0c;适配器&#xff0c;空间…...

前端进程和线程及介绍

前端开发中经常涉及到进程和线程的概念&#xff0c;特别是在浏览器中。理解这两个概念对于理解浏览器的工作机制和前端性能优化非常重要。以下是详细介绍&#xff1a; 1. 什么是进程和线程&#xff1f; 进程&#xff1a; 是操作系统分配资源的基本单位。一个程序启动后&#xf…...

本地用docker装mysql

目录 拉取镜像查看镜像 启动容器查看运行中的容器连接到 MySQL 容器其他一些操作 装WorkBench链接mysql——————————————允许远程登录MySql 拉取镜像 docker pull mysql查看镜像 docker image lsREPOSITORY TAG IMAGE ID CREATED SIZE mysq…...

设计模式 行为型 责任链模式(Chain of Responsibility Pattern)与 常见技术框架应用 解析

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许将请求沿着处理者链进行发送。每个处理者对象都有机会处理该请求&#xff0c;直到某个处理者决定处理该请求为止。这种模式的主要目的是避免请求的发送者和接收者之间…...

Apache Spark中与数据分区相关的配置和运行参数

Apache Spark中与数据分区相关的配置和运行参数涉及多个方面&#xff0c;包括动态分区设置、分区数设置、Executor与并行度配置等。合理配置这些参数可以显著提高Spark作业的执行效率和资源利用率。在实际应用中&#xff0c;建议根据业务需求和计算集群的特性进行相应的调整和测…...

“深入浅出”系列之设计模式篇:(0)什么是设计模式

设计模式六大原则 1. 单一职责原则&#xff1a;一个类或者一个方法只负责一项职责&#xff0c;尽量做到类的只有一个行为原因引起变化。 核心思想&#xff1a;控制类的粒度大小&#xff0c;将对象解耦&#xff0c;提高其内聚性。 2. 开闭原则&#xff1a;对扩展开放&#xf…...

【Git版本控制器--1】Git的基本操作--本地仓库

目录 初识git 本地仓库 认识工作区、暂存区、版本库 add操作与commit操作 master文件与commit id 修改文件 版本回退 撤销修改 删除文件 初识git Git 是一个分布式版本控制系统&#xff0c;主要用于跟踪文件的更改&#xff0c;特别是在软件开发中。 为什么要版本…...

如何在Jupyter中快速切换Anaconda里不同的虚拟环境

目录 介绍 操作步骤 1. 选择环境&#xff0c;安装内核 2. 注册内核 3. 完工。 视频教程 介绍 很多网友在使用Jupyter的时候会遇到各种各样的问题&#xff0c;其中一个比较麻烦的问题就是我在Anaconda有多个Python的环境里面&#xff0c;如何让jupyter快速切换不同的Pyt…...

Python自学 - “包”的创建与使用(从头晕到了然)

<< 返回目录 1 Python自学 - “包”的创建与使用(从头晕到了然) 相对于模块&#xff0c;包是一个更大的概念&#xff0c;按照业界的开发规范&#xff0c;1个代码文件不要超过1000行&#xff0c;稍微有点规模的任务就超过这个代码限制了&#xff0c;必然需要多个文件来管…...

ElasticSearch 同义词匹配

synonym.txt 电脑, 计算机, 主机 复印纸, 打印纸, A4纸, 纸, A3 平板电脑, Pad DELETE /es_sku_index_20_20250109 PUT /es_sku_index_20_20250109 {"settings": {"index": {"number_of_shards": "5","number_of_replicas&quo…...

android 官网刷机和线刷

nexus、pixel可使用google官网线上刷机的方法。网址&#xff1a;https://flash.android.com/ 本文使用google线上刷机&#xff0c;将Android14 刷为Android12 以下是失败的线刷经历。 准备工作 下载升级包。https://developers.google.com/android/images?hlzh-cn 注意&…...

Vue环境变量配置指南:如何在开发、生产和测试中设置环境变量

-## 前言 Vue.js是一个流行的JavaScript框架&#xff0c;它提供了许多工具和功能来帮助开发人员构建高效、可维护的Web应用程序。其中一个重要的工具是环境变量&#xff0c;它可以让你在不同的环境中配置不同的参数和选项。在这篇博客中&#xff0c;我们将介绍如何在Vue应用程…...

蓝桥杯_B组_省赛_2022(用作博主自己学习)

题目链接算法11.九进制转十进制 - 蓝桥云课 进制转换 21.顺子日期 - 蓝桥云课 时间与日期 31.刷题统计 - 蓝桥云课 时间与日期 41.修剪灌木 - 蓝桥云课 思维 51.X 进制减法 - 蓝桥云课 贪心 61.统计子矩阵 - 蓝桥云课 二维前缀和 71.积木画 - 蓝桥云课 动态规划 82.扫雷 - 蓝桥…...

【干货】交换网络环路介绍

定义 以太网交换网络中为了提高网络可靠性&#xff0c;通常会采用冗余设备和冗余链路&#xff0c;然而现网中由于组网调整、配置修改、升级割接等原因&#xff0c;经常会造成数据或协议报文环形转发&#xff0c;不可避免的形成环路。如图7-1所示&#xff0c;三台设备两两相连就…...

unity——Preject3——面板基类

目录 1.Canvas Group Canvas Group 的功能 Canvas Group 的常见用途 如何使用 Canvas Group 2.代码 3.代码分析 类分析:BasePanel 功能 作用 实际应用 代码解析:hideCallBack?.Invoke(); 语法知识点 作用 虚函数(virtual)和抽象类(abstract)的作用与区别 …...

BTC系列 - 启示录

推荐《区块链启示录&#xff1a;中本聪文集》这本书, 原来早在2010年, BTC生态还不完善的时候, 社区中就已经畅想出了未来其它链上的特色方案, 中本聪也都一一做了教父级回应: coinbase币的成熟时间, 交易池, 交易确认机制, 防51%攻击, 防双重消费, 水龙头, 轻量级客户端, 链上…...

C# 25Dpoint

C# 25Dpoint &#xff0c;做一个备份 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace _25Dpoint {public partial cl…...

Kotlin构造函数

class Person {var name: String? nullvar age: Int? nullfun think() {println("Mr./Ms.$name, who is $age years old, is thinking!")} }fun main () {val p Person()p.name "Jimmy"p.age 20p.think() } 在Kotlin中任意一个非抽象类都无法被继承…...

springMVC---resultful风格

目录 一、创建项目 pom.xml 二、配置文件 1.web.xml 2.spring-mvc.xml 三、图解 四、controller 一、创建项目 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi…...

flutter 装饰类【BoxDecoration】

装饰类 BoxDecoration BoxDecoration 是 Flutter 中用于控制 Container 等组件外观的装饰类&#xff0c;它提供了丰富的属性来设置背景、边框、圆角、阴影等样式。 BoxDecoration 的主要属性 1.color 背景颜色。类型&#xff1a;Color?示例&#xff1a; color: Colors.blu…...

自动连接校园网wifi脚本实践(自动网页认证)

目录 起因执行步骤分析校园网登录逻辑如何判断当前是否处于未登录状态&#xff1f; 书写代码打包设置开机自动启动 起因 我们一般通过远程控制的方式访问实验室电脑&#xff0c;但是最近实验室老是断电&#xff0c;但重启后也不会自动连接校园网账户认证&#xff0c;远程工具&…...

微信小程序集成Vant Weapp移动端开发的框架

什么是Vant Weapp Vant 是一个轻量、可靠的移动端组件库&#xff0c;于 2017 年开源。 目前 Vant 官方提供了 Vue 2 版本、Vue 3 版本和微信小程序版本&#xff0c;并由社区团队维护 React 版本和支付宝小程序版本。 官网地睛&#xff1a;介绍 - Vant Weapp (vant-ui.gith…...

MySQL从库 Last_SQL_Errno: 1197 问题处理过程

记录一个遇到过的错误&#xff0c;今天整理一下。 问题 MySQL error code MY-001197 (ER_TRANS_CACHE_FULL): Multi-statement transaction required morethan max_binlog_cache_size bytes of storage; increase this mysqld variable and try again报错很明显是max_binlog_…...

springboot 加载本地jar到maven

在Spring Boot项目中&#xff0c;如果你想要加载一个本地的jar文件到Maven本地仓库&#xff0c;你可以使用Maven的install-file目标来实现。以下是一个简单的例子&#xff1a; 打开命令行工具&#xff08;例如&#xff1a;终端或者命令提示符&#xff09;。 执行以下Maven命令…...

面向B站商业化场景的广告标题智能推荐

01.背景 大模型的发展也在不断改变广告主/代理商广告创编的过程&#xff0c;为了提高广告主的创作效率&#xff0c;提升广告主投放标题的质量&#xff0c;我们利用大语言模型技术以及B站商业数据&#xff0c;能够让广告主仅需要输入特定的关键词&#xff0c;即可以生成理论上无…...

element plus 使用 upload 组件达到上传数量限制时隐藏上传按钮

最近在重构项目&#xff0c;使用了 element plus UI框架&#xff0c;有个功能是实现图片上传&#xff0c;且限制只能上传一张图片&#xff0c;结果&#xff0c;发现&#xff0c;可以限制只上传一张图片&#xff0c;但是上传按钮还在&#xff0c;如图&#xff1a; 解决办法&…...

java进行pdf文件压缩

文章目录 pdf文件压缩 pdf文件压缩 添加依赖 <dependency><groupId>com.luhuiguo</groupId><artifactId>aspose-pdf</artifactId><version>23.1</version> </dependency>public class OptimizePdf {public static void opti…...

初识算法和数据结构P1:保姆级图文详解

文章目录 前言1、算法例子1.1、查字典&#xff08;二分查找算法&#xff09;1.2、整理扑克&#xff08;插入排序算法&#xff09;1.3、货币找零&#xff08;贪心算法&#xff09; 2、算法与数据结构2.1、算法定义2.2、数据结构定义2.3、数据结构与算法的关系2.4、独立于编程语言…...

内网服务器添加共享文件夹功能并设置端口映射

参考网址 https://blog.csdn.net/Think88666/article/details/118438465 1.服务器安装smb服务&#xff0c;由于网路安全不允许使用默认端口&#xff08;445&#xff0c;446&#xff09;&#xff0c;于是修改端口为62445、62446。 2.每台需要共享的电脑都要修改端口映射&#x…...

ruoyi-cloud docker启动微服务无法连接nacos,Client not connected, current status:STARTING

ruoyi-cloud docker启动微服务无法连接nacos&#xff0c;Client not connected, current status:STARTING 场景 当使用sh deploy.sh base来安装mysql、redis、nacos环境后&#xff0c;紧接着使用sh deploy.sh modules安装微服务模块&#xff0c;会发现微服务无法连接nacos的情…...

Python----Python高级(函数基础,形参和实参,参数传递,全局变量和局部变量,匿名函数,递归函数,eval()函数,LEGB规则)

一、函数基础 1.1、函数的用法和底层分析 函数是可重用的程序代码块。 函数的作用&#xff0c;不仅可以实现代码的复用&#xff0c;更能实现代码的一致性。一致性指的是&#xff0c;只要修改函数的代码&#xff0c;则所有调用该函数的地方都能得到体现。 在编写函数时&#xf…...

excel 整理表格,分割一列变成多列数据

数据准备 对于很多系统页面的数据是没有办法下载的。 这里用表格数据来举例。随便做数据的准备。想要看excel部分的可以把这里跳过&#xff0c;从数据准备完成开始看。 需要一点前端基础知识&#xff0c;但不多&#xff08;不会也行&#xff09;。 把鼠标放在你想要拿到本地的…...

Oracle 分区索引简介

目录 一. 什么是分区索引二. 分区索引的种类2.1 局部分区索引&#xff08;Local Partitioned Index&#xff09;2.2 全局分区索引&#xff08;Global Partitioned Index&#xff09; 三. 分区索引的创建四. 分区索引查看4.1 USER_IND_COLUMNS 表4.2 USER_INDEXES 表 五. 分区索…...

C++实现设计模式--- 观察者模式 (Observer)

观察者模式 (Observer) 观察者模式 是一种行为型设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;使得当一个对象的状态发生改变时&#xff0c;其依赖者&#xff08;观察者&#xff09;会收到通知并自动更新。 意图 定义对象之间的一对多依赖关系。当一个对象状…...

CentOS 6.8 安装 Nginx

个人博客地址&#xff1a;CentOS 6.8 安装 Nginx | 一张假钞的真实世界 提前安装&#xff1a; # sudo yum install yum-utils 一般情况下这个工具系统已经安装。 创建文件/etc/yum.repos.d/nginx.repo&#xff0c;输入内容如下&#xff1a; [nginx-stable] namenginx stab…...

px、em 和 rem 的区别:深入理解 CSS 中的单位

文章目录 前言一、px - 像素 (Pixel)二、em - 相对父元素字体大小 (Ems)三、rem - 相对于根元素字体大小 (Root Ems)四、综合比较结语 前言 在CSS中&#xff0c;px、em和rem是三种用于定义尺寸&#xff08;如宽度、高度、边距、填充等&#xff09;的长度单位。它们各自有不同的…...

vue 表格内点编辑,单元格不切换成输入框问题分析

vue 表格渲染时&#xff0c;我点击编辑时&#xff0c;想直接在单元格上面进行编辑。 效果如下&#xff0c;正常是文本效果&#xff0c;点击编辑时&#xff0c;出现输入框 其实实现起来&#xff0c;逻辑很简单&#xff0c;但是中间我却出现了一个问题&#xff0c;效果始终出不…...