《白帽子讲Web安全》15-16章
《白帽子讲Web安全》15-16章
- 《白帽子讲Web安全》15章
- 15、Web Server配置安全
- 15.1、Apache安全
- 15.2、Nginx安全
- 15.3、jBoss远程命令执行
- 15.4、Tomcat远程命令执行
- 15.5、HTTP Parameter Pollution
- 15.6、小结
- 第四篇 互联网公司运营安全
- 《白帽子讲Web安全》16章
- 16、互联网业务安全
- 16.1、产品需要什么样的安全
- 16.1.1、互联网产品对安全的需求
- 16.1.2、什么是好的安全方案
- 16.2、业务逻辑安全
- 16.2.1、永远改不掉的密码
- 16.2.2、谁是大赢家
- 16.2.3、瞒天过海
- 16.2.4、关于密码取回流程
- 16.3、账户是如何被盗的
- 16.3.1、账户被盗的途径
- 16.3.2、分析账户被盗的原因
- 16.4、互联网的垃圾
- 16.4.1、垃圾的危害
- 16.4.1、垃圾处理
- 16.5、关于网络钓鱼
- 16.5.1、钓鱼网站简介
- 16.5.2、邮件钓鱼
- 16.5.3、钓鱼网站的防控
- 16.5.3.1、钓鱼网站的传播途径
- 16.5.3.2、直接打击钓鱼网站
- 16.5.3.3、用户教育
- 16.5.3.4、自动化识别钓鱼网站
- 16.5.4、网购流程钓鱼
- 16.6、用户隐私保护
- 16.6.1、互联网的用户隐私挑战
- 16.6.2、如何保护用户隐私
- 16.6.3、Do-Not-Track
- 16.7、Do-Not-Track
《白帽子讲Web安全》15章
15、Web Server配置安全
15.1、Apache安全
Web Server的安全我们关注两点:一是 Web Server本身是否安全;二是Web Server是否提供了可使用的安全功能。
-
检查Apache安全的第一件事情,就是检查Apache的
Module安装情况,根据“最小权限原则”,应该尽可能地减少不必要的Module,对于要使用的Module,则检查其对应版本是否存在已知的安全漏洞。 -
指定Apache进程以单独的用户身份运行,这通常需要为Apache单独建立一个
user/group。Apache 以root身份或者admin身份运行是一个非常糟糕的决定。这里的admin身份是指服务器管理员在管理机器时使用的身份。这个身份的权限也是比较高的,因为管理员有操作管理脚本、访问配置文件、读/写日志等需求。使用高权限身份运行Apache的结果可能是灾难性的,它会带来两个可怕的后果:
- 当黑客入侵 Web 成功时,将直接获得一个高权限(比如
root或admin)的shell - 应用程序本身将具备较高权限,当出现bug时,可能会带来较高风险,比如删除本地重要文件、杀死进程等不可预知的结果。
比较好的做法是使用专门的用户身份运行Apache,这个用户身份不应该具备
shell,它唯一的作用就是用来运行Web应用。 - 当黑客入侵 Web 成功时,将直接获得一个高权限(比如
-
配置参数,优化服务器性能,提高对抗DDOS攻击的能力。
-
最后,要保护好
Apache Log。一般来说,攻击者入侵成功后,要做的第一件事情就是清除入侵痕迹,修改、删除日志文件,因此access log应当妥善保管,比如实时地发送到远程的syslog服务器上。
15.2、Nginx安全
从历史的经验来看,如果一个软件出现的漏洞较多,那么说明代码维护者的安全意识与安全经验有所欠缺,同时由于破窗效应,这个软件未来往往会出现更多的漏洞。
就软件安全本身来看,Nginx 与 Apache最大的区别在于,检查Apache安全时更多的要关注Module的安全,而 Nginx 则需要注意软件本身的安全,及时升级软件版本。与Apache一样,Nginx 也应该以单独的身份运行,这是所有Web Server、容器软件应该共同遵守的原则。
- 首先,Nginx 的配置非常灵活,在对抗DDOS和CC攻击方面也能起到一定的缓解作用,
- 其次,在 Nginx配置中还可以做一些简单的条件判断,比如客户端
User-Agent具有什么特征,或者来自某个特定referer、IP等条件,响应动作可以是返回错误号,或进行重定向。
在此仍需强调的是,Web Server对于DDOS攻击的防御作用是有限的。对于大规模的拒绝服务攻击,需要使用更加专业的保护方案。
15.3、jBoss远程命令执行
jBoss是J2EE环境中一个流行的Web容器,但是 jBoss在默认安装时提供的一些功能却不太安全,如果配置不得当,则可能直接造成远程命令执行。
由于jBoss在默认安装时会有一个管理后台,叫做JMX-Console,它提供给管理员一些强大的功能,其中包括配置MBeans,这同样也会为黑客们打开方便之门。通过8080端口(默认安装时会监听8080端口)访问/jmx-console 能够进入到这个管理界面。默认安装时访问JMX-Console是没有任何认证的。
在JMX-Console中,有多种可以远程执行命令的方法。
- 最简单的方式,是通过
DeploymentScanner远程加载一个war包。 - 德国的Redteam安全小组研究发现,通过
JMX-Console提供的BSH (Bean Shell)Deployment方法,同样也能布署war包。BSH能够执行一次性的脚本,或者创建服务,这对于黑客来说很有用。
因此出于安全防御的目的,在加固时,需要删除JMX-Console后台,事实上,jBoss 的使用完全可以不依赖于它。如果出于业务需要不得不使用JMX-Console,则应该使用一个强壮的密码,并且运行JMX-Console的端口不应该面向整个Internet开放。
15.4、Tomcat远程命令执行
Apache Tomcat 与jBoss一样,默认也会运行在8080端口。它提供的Tomcat Manager的作用与JMX-Console类似,管理员也可以在Tomcat Manager中部署war包。但值得庆幸的是,Tomcat Manager布署war包需要有manager权限,而这一权限是在配置文件中定义的。
虽然Tomcat后台有密码认证,但笔者仍然强烈建议删除这一后台,因为攻击者可以通过暴力破解等方式获取后台的访问权限,从安全的角度看,这增加了系统的攻击面,得不偿失。
15.5、HTTP Parameter Pollution
在2009年的OWASP大会上,Luca、Carettoni等人演示了这种被称为HPP的攻击。简单来说,就是通过GET或 POST向服务器发起请求时,提交两个相同的参数,那么服务器会如何选择呢?
比如提交:
/?a=test&a=test1
在某些服务端环境中,会只取第一个参数;而在另外一些环境中,比如.net环境中,则会变成:
a=test,testl
这种特性在绕过一些服务器端的逻辑判断时,会非常有用。
这种HPP攻击,与Web服务器环境、服务器端使用的脚本语言有关。HPP本身可以看做服务器端软件的一种功能,参数选择的顺序是由服务器端软件所决定的。但是正如我们在本书中所举的很多例子一样,当程序员不熟悉软件的这种功能时,就有可能造成误用,或者程序逻辑涵盖范围不够全面,从而形成漏洞。
HPP的发现者,在测试了大量服务器软件版本的组合后,整理出下表,作为参考。

15.6、小结
在本章中探讨了Web Server、Web容器相关的安全问题。
- Web Server、Web容器是Web应用的载体,是基础,它们的安全与否将直接影响到应用的安全性。
- 在搭建服务器端环境时,需要注意最小权限原则,应该以独立的低权限身份运行Web进程。同时 Web Server的一些参数能够优化性能,有助于缓解DDOS攻击,在实际运用时可以酌情使用。
- Web Server本身的漏洞也需要时刻关注,而有些Web容器的默认配置甚至可能还会成为弱点,一名合格的安全工程师应该熟知这些问题。
第四篇 互联网公司运营安全
《白帽子讲Web安全》16章
16、互联网业务安全
16.1、产品需要什么样的安全
安全本身可视作产品的一个组成部分。一个好的产品,在设计之初,就应该考虑是否会存在安全隐患,从而提前准备好对策。将安全视为产品特性,往往也就解决了业务与安全之间的矛盾。
其实业务与安全之间本来是没有冲突的,出现冲突往往是因为安全方案设计得不够完美。比如安全方案的实现成本相对较高,从而不得不牺牲一些产品功能上的需求,有时候牺牲的可能还有性能。
16.1.1、互联网产品对安全的需求
-
搜索结果是否安全,对网民来说是很重要的,因为搜索引擎是互联网最重要的一个门户。
一个好的全网搜索引擎,其爬虫所抓取的页面可能会达到十亿到百亿的数量级。要一个个检测这些网页是否安全,也是件非常艰巨和有挑战的事情。目前搜索引擎的普遍做法是与专业的安全厂商进行合作,排查搜索结果中的恶意网址。
-
除了搜索引擎外,电子邮箱领域的竞争也凸显了安全的重要性。在电子邮箱领域,最重要的一项安全特性就是“反垃圾邮件”。
目前在反垃圾邮件领域,各家互联网公司都各有妙招。在用户使用的电子邮箱中,能够收到的垃圾邮件多少,也能判断出各个互联网公司在安全实力上的高低。
-
推而广之,可以发现,在互联网中,一个成熟的产品几乎必然会存在安全性方面的竞争。
安全性做得好的产品,对于用户来说可能不会有什么特别的感觉,因为坏人、坏的信息已经被处理掉了;相反,如果产品安全没有做好,则用户一定会感受到:垃圾消息泛滥、骗子满地跑,这些业务安全的问题会带来糟糕的用户体验,有时候甚至会毁掉一个新兴的领域。
安全是产品特性的一个组成部分,具备了安全性,产品才是完整的;安全做好了,产品最终才能真正成熟。
16.1.2、什么是好的安全方案
笔者认为,一个优秀的安全方案,除了可以有效地解决问题以外,至少还必须具备两个条件:
- 良好的用户体验;
- 优秀的性能。
双因素认证提高了用户的使用门槛,损失了部分用户体验,设置复杂密码也是一种糟糕的体验。
“提高密码复杂度”这个安全需求,其本质其实可以分解为:
-
如何对抗暴力破解;
可以在登录的应用中检测暴力破解的尝试。检查一个账户在一段时间内的登录失败次数,或者检测某一个IP地址在一段时间内的登录行为次数。这些行为都是比较明显的暴力破解特征。暴力破解往往还借助了脚本或者扫描器,那么在检测到此类行为后向特定客户端返回一个验证码,也可以有效地缓解暴力破解攻击。
-
如何防止密码中包含个人信息。
如何防止密码中包含个人信息呢?在用户注册时,可以收集到用户填写的个人资料,如果发现用户使用了诸如:用户名、邮件地址、生日、电话号码之类的个人信息作为密码,则应当立即进行提示。
安全是产品的一种特性,如果我们的产品能够潜移默化地培养用户的安全习惯,将用户往更安全的行为上引导,那么这样的安全就是最理想的产品安全。
16.2、业务逻辑安全
16.2.1、永远改不掉的密码
业务逻辑问题与业务的关系很紧密,花样百出,很难总结归类。
业务逻辑问题是一种设计缺陷,在产品开发过程中,可以考虑在产品设计和测试阶段解决。但业务逻辑问题没有一个成熟的归纳体系,很多时候,只能依靠安全工程师的个人经验来判断这些问题。
16.2.2、谁是大赢家
某家在线购物网站为了对抗密码暴力破解,规定短时间内账户登录失败5次,就将锁定账户一个小时。该网站的业务中,提供了一个在线竞拍的功能,用户可以给喜欢的商品出价,后来者必须给出一个更高的价格。在拍卖时间截止后,商品将为出价高者所得。之前也有想到过,这里感觉锁IP更好一些
某黑客在给商品出价后,在网站上继续观察谁出了一个更高的价格,当他发现有人出价更高时,就去恶意登录这个用户的账户:当登录失败次数达到5次时,该账户就被系统锁定了。
暴力破解通常都有一定的特征:
- 比如某个账户在5分钟内登录错误达到10次。
- 根据弱口令来遍历用户名的,比如黑客使用密码“123456”,尝试登录不同的用户名。这需要黑客事先收集一份可以使用的ID列表。
但无论如何变化,暴力破解是需要高效率的,所以“短时间”“高频率”的行为特征比较明显。黑客为了躲避安全系统的检测,常常会使用多个IP地址来进行登录尝试。这些IP地址可能是代理服务器,也可能是傀儡机。
但经过实践检验,即使黑客使用了多个IP地址,想要使攻击达到一定的规模,还是会使用重复的IP地址。最终的结果就是单个IP地址可能会发起多次网络请求。
16.2.3、瞒天过海
16.2.4、关于密码取回流程
很多网站曾经提供的“修改密码”功能中,也存在一个典型的逻辑问题:用户修改密码时不需要提供当前密码。
这种设计,导致账户被盗后,黑客就可以直接使用此功能修改账户的密码。账户被盗的原因有很多种,比如 Cookie劫持导致的账户被盗,黑客是不知道用户密码的。因此修改密码时不询问当前密码,是一个逻辑漏洞。
正确的做法是,在进行敏感操作之前再次认证用户的身份。
用户密码丢失后,就不能再使用用户密码作为认证手段。通常,如果不考虑客服的话,用户想自助取回密码,有三个方法可以用来认证用户:
- 一是用户设定的安全问题;
- 二是用户注册时留下的安全邮箱;
- 三是给用户发送手机短信验证码,这需要用户预留手机信息。
当三种认证信息都不太可靠时,只能选择一些其他的办法来解决。一个比较好的方法,是使用用户在网站上留下过的一些私有信息,与用户逐一核对,以验证用户身份确实是本人。
比如:用户曾经使用过的密码;用户曾经登录过的时间、地点;用户曾经在站内发表过,但又删除了的文章等。这些信息可以称为用户的“基因”,因为这些信息越详细,就越能准确地区分出一个独立的用户。
16.3、账户是如何被盗的
16.3.1、账户被盗的途径
- 网站登录过程中无HTTPS,密码在网络中被嗅探。
- 用户电脑中了木马,密码被键盘记录软件所获取。
- 用户被钓鱼网站所迷惑,密码被钓鱼网站所骗取。
- 网站某登录入口可以被暴力破解。
- 网站密码取回流程存在逻辑漏洞。
- 网站存在XSS 等客户端脚本漏洞,用户账户被间接窃取。
- 网站存在SQL注入等服务器端漏洞,网站被黑客入侵导致用户账户信息泄露。
以上这些威胁中,除了“用户电脑中了木马”与“用户上了钓鱼网站”这两点与用户自身有关外,其余几点都是可以从服务器端进行控制的。换句话说,如果这几点没有做好而导致的安全问题,网站都应该负主要责任。
这节还是再强调,弱口令与个人密码的复用,在不同网站使用的是同个或相近的密码,是导致暴力破解存在且长期有效的原因。
另外,用户的密码不应明文保存在数据库中。
16.3.2、分析账户被盗的原因
- 首先,客服是最重要和直接的渠道。
从客服收集第一手资料,甚至由工程师回访客户,会有意想不到的收获。 - 其次,从日志中寻找证据。
除了从客户处收集第一手资料外,也应该重视网站日志的作用,从日志中去大胆求证。 - 最后,打入敌人内部,探听最新动态。
在黑色产业链中,有人制作、销售工具,也有人专门从事诈骗活动。这些人建立的群体,关系并不是非常紧密的,可能仅仅是依靠QQ群或其他IM互相联系。
16.4、互联网的垃圾
16.4.1、垃圾的危害
垃圾注册几乎成为一切业务安全问题的源头。
一般来说,“目的不是网站所提供的服务”的注册账户,都属于垃圾账户。
16.4.1、垃圾处理
垃圾处理离不开两个步骤:“识别”和“拦截”。
拦截的方法根据业务而定。可以选择冻结账户或者删除账户,也可以只针对垃圾内容做屏蔽。但问题的关键是屏蔽什么、拦截什么,这就涉及到“垃圾识别技术”了。
如果仔细分析垃圾行为特征,可以大致分成:内容的特征、行为的特征、客户端本身的特征。从这三个方面入手,可以得出不同类型的规则。
- 基于内容的规则:以自然语言分析、关键词匹配等为代表。
- 基于行为的规则:以业务逻辑规则为代表。
- 基于客户端识别的规则:以人机识别为代表,比如验证码,或者让客户端去解析JavaScript。
识别出非法用户和非法行为后,在“拦截”上也需要讲究策略和战术。因为很多时候,规则都是“见光死”,规则的保密性非常重要。如果使用规则和恶意用户做直接对抗,那么规则的内容很容易暴露,导致规则很快会被绕过。因此要有技巧地保护规则。
如何保护呢?以“拦截”来说,如果不是特别紧急的业务,则可以打一个时间差。当使用规则识别出垃圾账户后,过一段时间再做处理,这样恶意用户就摸不准到底触犯了哪条规则。同时还可以“打压”大部分账户,放过一小批账户。这样既控制住大部分的风险,又让风险不会随意转移,可以一直把可控的风险放在明处。这样从防御的角度看,就能掌握主动权。
与垃圾注册和垃圾信息的对抗最终还是会升级。作为安全团队,需要紧跟敌人的变化,走在敌人的前面。
16.5、关于网络钓鱼
16.5.1、钓鱼网站简介
在国外,钓鱼网站(Phishing)的定义是页面中包含了登录表单的网站,此类网站的目的是骗取用户的密码。
但是随着网络犯罪手段的多样化,很多钓鱼网站开始模仿登录页面之外的页面,目标也不仅仅是简单的骗取密码。此类钓鱼网站可以称为“欺诈网站”,也可以认为是广义的钓鱼网站,因为它们都是以模仿目标网站的页面为基本技术手段。在本书中,将统一称之为“钓鱼网站”。
16.5.2、邮件钓鱼
钓鱼邮件,是垃圾邮件的一种,它比广告邮件更有针对性。
令人比较无奈的是,SMTP协议是可以由用户伪造发件人邮箱的。而在邮件服务器上,如果没有实施相关的安全策略,则无从识别发件人邮箱的真伪。
识别发件人邮箱的安全技术,大部分是基于域名策略的,比如SPF(Sender Policy Framework)、Yahoo 的 DomainKeys、微软的Sender ID技术等。
-
Yahoo的 DomainKeys会生成一对公私钥。公钥布署在收信方的 DNS服务器上,用于解密;
私钥则用于发信方的邮件服务器,对发出的每封邮件进行签名。这样收信方在收信时,到DNS服务器上查询属于发信方域名的公钥,并对邮件中的加密串进行解密验证,以确保该邮件来自正确域。 -
SPF技术与 DomainKeys不同,SPF是基于IP策略的,有点类似于DNS反向解析。收信方在接收到邮件时,会去 DNS查询发信方域的SPF记录。这个记录写着发信方邮件服务器和IP的对应关系,检查了这个记录后,就可以确定该邮件是不是发自指定IP的邮件服务器,从而判断邮件真伪。
-
微软的Sender ID技术,是以 SPF为基础的。
16.5.3、钓鱼网站的防控
16.5.3.1、钓鱼网站的传播途径
控制钓鱼网站传播的途径,就能对钓鱼网站实施有效的打击。
网络钓鱼是需要整个互联网共同协作解决的一个问题,因此当钓鱼传播途径脱离了目标网站本身的范畴时,应该积极地通过与外部合作的方式,共建一个安全的大环境,也就是建立一个反钓鱼的统一战线。
浏览器是一个较为特殊的环节,因为浏览器是互联网的入口,钓鱼网站不管是在IM中传播,还是在邮件里传播,归根结底还是要上到浏览器上的。所以在浏览器中拦截钓鱼网站,能事半功倍。
16.5.3.2、直接打击钓鱼网站
在钓鱼网站的防控中,还有一个有力的措施,就是关停站点。
16.5.3.3、用户教育
16.5.3.4、自动化识别钓鱼网站
在钓鱼网站的拦截过程中,有一个关键的工作,就是快速而准确地识别钓鱼网站。依靠人工处理钓鱼网站,工作量会非常大,因此有必要使用技术手段,对钓鱼网站进行一些自动化的识别。
16.5.4、网购流程钓鱼
分析与防范网购流程钓鱼
一个正常的网购流程,一般如下:
商户(比如淘宝网)→第三方支付平台(比如支付宝、yeepay)→网上银行(比如工商银行)
这实际上是一个跨平台传递信息的过程。
贯穿不同平台的唯一标识,是订单号。订单中只包含了商品信息,但缺少创建订单用户的相关信息。这是网上支付流程中存在的一个重大设计缺陷。
造成这个设计缺陷的原因是,在网购过程中的每个平台都有一套自己的账户体系,而账户体系之间并没有对应关系。因此平台与平台之间,只能根据订单本身的信息作为唯一的判断依据。
比如银行的账户是银行卡号和开户名,第三方支付平台有自己的账户,商户又有自己的一套账户体系(比如京东商城)。
解决这个设计缺陷的方法是,找到一个唯一的客户端信息,贯穿于整个网上支付流程的所有平台,保证订单是由订单创建者本人支付的。
目前看来,使用客户端IP地址作为这个信息,比较经济,易于推广。
16.6、用户隐私保护
16.6.1、互联网的用户隐私挑战
在互联网时代,网站在提供服务的同时,也拥有了各种各样的用户数据。
在PCI-DSS(支付卡行业数据与安全标准)中,PCI认为技术是复杂的,要想完美地保护好用户个人信息比较困难,最好的做法是限制数据的使用——“不存在的数据是最安全的”。
目前互联网缺乏一个对用户隐私数据分级和保护的标准,没有定义清楚哪些数据是敏感的,哪些数据是公开化的,从而也无从谈起隐私数据应该如何保护。
16.6.2、如何保护用户隐私
- 首先,用户应该拥有知情权和选择权。
- 其次,网站应该妥善保管收集到的用户数据,不得将数据用于任何指定范围以外的用途。
16.6.3、Do-Not-Track
Do-Not-Track工作在浏览器上。该选项打开后,将在HTTP头中增加一个header,用以告诉网站用户不想被追踪。
16.7、Do-Not-Track
本章讲述的是互联网安全中,网站最关心的业务安全。
互联网公司在发展业务时,也许会忽略自身的安全防护和漏洞修补,但一定不会漠视业务安全问题。因为业务安全问题,直接损害的是用户的利益、公司的利益,这些安全问题会有真正的切肤之痛。因此无论是公司内部,还是政府、行业,甚至是社会舆论,都会产生足够大的压力和推动力,迫使互联网公司认真对待业务安全问题。
互联网公司要想健康地发展,离不开业务安全。把握住业务安全,对于公司的安全部门来说,就真正把握住了部门发展的命脉,这是真正看得见、摸得着的敌人。业务安全问题更加直接,损失的都是真金白银,考核的自标也易于设定。
安全工程师可以承担更大的责任,帮助公司的业务健康成长。
相关文章:
《白帽子讲Web安全》15-16章
《白帽子讲Web安全》15-16章 《白帽子讲Web安全》15章15、Web Server配置安全15.1、Apache安全15.2、Nginx安全15.3、jBoss远程命令执行15.4、Tomcat远程命令执行15.5、HTTP Parameter Pollution15.6、小结 第四篇 互联网公司运营安全《白帽子讲Web安全》16章16、互联网业务安全…...
计算机毕业设计Python+LSTM天气预测系统 AI大模型问答 vue.js 可视化大屏 机器学习 深度学习 Hadoop Spark
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
大语言模型压缩技术;推理优化技术;SparseGPT算法;GPTQ算法
目录 大语言模型落地的成本、效率与效果 模型压缩技术 推理优化技术 SparseGPT算法 GPTQ算法 大语言模型落地的成本、效率与效果 模型压缩技术 模型压缩技术是大语言模型轻量化的关键。介绍了多种模型压缩方法,其中权重量化和模型稀疏化是两种主要的技术。 权重量化:权重…...
Facebook的开源项目解析:推动开发者社区的技术进步
Facebook,作为全球领先的社交平台之一,其在技术领域的创新不仅体现在产品功能的实现上,也积极推动开源社区的发展。开源项目已经成为Facebook技术战略的重要组成部分,通过开源,Facebook不仅加速了技术进步,…...
力扣--LCR 149.彩灯装饰记录I
题目 代码 /** Definition for a binary tree node. public class TreeNode { int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val val;this.left left;this.right ri…...
Rust SQLx CLI 同步迁移数据库
上文我们介绍了SQLx及SQLite,并介绍了如何使用代码同步迁移数据库。本文介绍Sqlx cli 命令行工具,介绍如何安装、使用,利用其提供的命令实现数据表同步迁移。Java生态中有flyway, sqlx cli 功能类似,利用命令行工具可以和其他语言…...
批量生成不同用户的pdf 文件(html样式)
技术 selenium thymeleaf itextpdf chromedriver 使用thymeleaf 将动态数据替换 使用selenium chromedriver 进行js ,css等逻辑运算后渲染视图 使用itextpdf 将html 转为pdf 文件 html模板 <!DOCTYPE html> <html xmlns:th"http://www.thymeleaf…...
混淆零碎知识点
minifyEnabled true //混淆开关 zipAlignEnabled true // Zipalign优化 shrinkResources true // 移除无用的resource文件 (必须要混淆开了之后才才可以设置为true) proguard-rules.pro 为混淆文件 //整个文件保留 不被混淆 -keep class com.cn…...
排序算法2
排序算法1-CSDN博客 排序算法1中提及的是较为基础(暴力实现,复杂度较高)的排序算法,不适合于数据量较大的场景,比如序列长度达到1e5 接下来以蓝桥另一道题目来理解其它的排序算法 蓝桥3226 蓝桥账户中心 样例 5 1 5 9 3 7 4、快速排序 快速排…...
【Web开发基础学习——corsheaders 应用的理解】
Web开发基础学习系列文章目录 第一章 基础知识学习之corsheaders 应用的理解 文章目录 Web开发基础学习系列文章目录前言一、使用1.1 安装1.2 配置 二、功能总结 前言 corsheaders 是一个 Django 第三方应用,用于处理跨域资源共享 (CORS)。CORS 是一种机制&#x…...
Redis和MySQL之间如何进行数据同步
原因 为什么要进行Redis和MySQL的数据同步? 性能优化:MySQL是关系型数据库,数据读取和存储相对复杂;Redis是内存数据库,读写速度极快,将热点数据存在Redis,可以大大提高系统的访问速度。 数据…...
css:转换
转换 移动 /* transform: translate(100px, 200px); */transform: translateX(100px);transform: translateY(100px); /*一个意思*/ 如果后面跟百分数的意思是移动盒子自身x/y方向长度的百分比,可以用作子绝父相控制盒子水平居中垂直居中 translate里的xy值是相对…...
状态管理与存储:Vuex 和 sessionStorage
1. sessionStorage 存储位置 sessionStorage 是浏览器提供的 Web Storage API 的一部分,用于在一个会话期间存储数据。数据保存在浏览器的 内存 中,而不是在硬盘上,且其生命周期仅限于当前浏览器标签页。数据在浏览器窗口或标签页关闭时会被…...
Redis和MySQL保持一致性的延迟双删(Delay Double Delete)策略
Redis和MySQL保持一致性的延迟双删(Delay Double Delete)策略,是一种在数据更新或删除时为了保证数据一致性而采取的方法。以下是延迟双删的过程和原理的详细解释: 一、过程 第一次删除缓存: 当需要更新数据库中的数据…...
快速理解微服务中Fegin的概念
一.由来 1.在传统的架构里面,我们是通过使用RestTemplate来访问其他的服务,但是这种方式就存在了一个很大的缺陷,也就是被调用方如果发生了服务的迁移(IP和端口发生了变化),那么调用方也需要同步的在代码里面进行修改,…...
新增工作台模块,任务中心支持一键重跑,MeterSphere开源持续测试工具v3.5版本发布
2024年11月28日,MeterSphere开源持续测试工具正式发布v3.5版本。 在这一版本中,MeterSphere新增工作台模块,工作台可以统一汇总系统数据,提升测试数据的可视化程度并增强对数据的分析能力,为管理者提供测试工作的全局…...
快速搭建一个博客!!!“Halo框架深度优化:搭建你的个性化博客或网站”
目录 引言: 一. 首先服务器上去下载一个docker 1.可以参考官方地址: 2. 通过宝塔来一键安装!!! 3.也可以自己下载!!! 1.卸载旧版 2.配置Docker的yum库 3.安装Docker 4.启动和…...
009 STM32 HAL库介绍
STM32 HAL库(Hardware Abstraction Layer)是STMicroelectronics为STM32系列微控制器提供的一套硬件抽象层库,它旨在简化STM32的开发过程,提高代码的可移植性和可维护性。HAL库通过提供一组统一的API接口,使得开发者无需…...
【微服务】 Eureka和Ribbon
一、Eureka 服务调用出现的问题:在远程调用另一个服务时,我们采用的解决办法是发送一次http请求,每次环境的变更会产生新的地址,所以采用硬编码会出现很多麻烦,并且为了应对并发问题,采用分布式部署&#…...
6.算法移植第六篇 YOLOV5/rknn生成可执行文件部署在RK3568上
接上一篇文章best-sim.rknn模型生成好后,我们要将其转换成可执行文件运行在RK3568上,这一步需要在rknpu上进行,在强调一遍!!rknpu的作用是可以直接生成在开发板上运行的程序 退出上一步的docker环境 exit1.复制best-…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
