浅谈暴力破解及验证码安全

文章目录

    • 一、暴力破解及验证码安全
      • 注意事项
    • 二、C/S架构暴力猜解
    • 三、B/S架构暴力猜解
    • 四、Hydra安装及使用
      • 安装
      • 参数说明
      • 各种用法实例
    • 五、防范暴力猜解
    • 六、验证码安全
      • 工作原理
      • 存在的问题
        • 图片验证码的生成可能存在如下问题
        • 在验证码的程序实现流程方面可能存在如下问题
      • 对抗现状
      • 验证码未来可能的主要形式
      • 操作验证码安全
        • 0x01 验证码可重用
        • 0x02 验证码可识别
        • 0x03 客户端生成/显示/校验
        • 0x04 空验证码绕过
        • 0x05 验证码数量有限
        • 0x06 是否校验可控
        • 0x07 超过次数才开启验证码
        • 0x08 验证码可预测
      • 身份验证码安全
        • 0x01 验证码返回客户端
        • 0x02 业务流程缺陷
        • 0x03 验证码无时间间隔限制
        • 0x04 验证码可爆破
        • 0x05 验证码在客户端生成
      • 验证码分类
        • **传统图形验证码**
        • **广告型的图形验证码**
        • **滑动验证码**
        • **图标选择与行为辅助**
        • **点击式的图文验证与行为辅助**
        • **智能验证码**
        • **语音验证码**
      • **图形验证码的验证过程**
      • **图形验证码的安全问题**
        • **客户端的安全问题**
        • **服务端的安全问题**
        • **验证码技术安全问题**
      • **静态图形验证码的破解**
    • 示例
    • 验证码修复

一、暴力破解及验证码安全

注意事项

破解前一定要有一个强大有效的字典(top100、top2000 、CSDN、QQ、163等常用密码):判断用户是否设置了复杂的密码、网站是否存在验证码、尝试登陆的行为是否有限制、网站是否双因素认证、token值等等

首先对目标网站进行注册,搞清楚账号面膜的一些限制,比如目标站点要求密码必须是8位以上,字母数字组合。则可以按照此有话字典,比如去掉不合符要求的免密

如果破解的是管理后台密码,可使用admin/administrator/root账号几率较高,可使用这三个账号+任意密码字典进行暴力破解,破解过程中一定要注意观察提示,如“用户名或免密错误”,“密码错误”,“用户名不存在”等相关提示。

二、C/S架构暴力猜解

C/S即客户端/服务器,基于C/S架构的应用程序,如ssh、ftp、sql-server、mysql等,这些服务往往提供一个高权限的用户,而这个高权限的用户往往可以进行执行命令的操作,如sql-server的sa,mysql的root,Oracle的sys和system账号,使用这些高权限的用户能在很大程度上给开发人员带来方便,但如果口令被破解带来的危害也是相当大的。C/S架构主要使用的破解工具Hydra、Bruter、X-scan

三、B/S架构暴力猜解

一般是对web应用程序中的高权限用户进行蔡姐,如网站的内容管理系统账户,一般针对B/S的宝丽蔡姐,使用BurpSuite镜像表单爆破

API接口暴力猜解参考 https://xz.aliyun.com/t/6330

四、Hydra安装及使用

安装

  • Hydra 安装

    # wget --no-check-certificate https://www.thc.org/releases/hydra-8.1.tar.gz
    # tar zxvf hydra-8.1.tar.gz 
    # cd hydra-8.1 
    # ./configure 
    # make && make install 
    

参数说明

hydra [[[-l LOGIN|-L FILE] [-p PASS|-P FILE]] | [-C FILE]] [-e ns] 
 
[-o FILE] [-t TASKS] [-M FILE [-T TASKS]] [-w TIME] [-f] [-s PORT] [-S] [-vV] server service [OPT] 
 
-R 继续从上一次进度接着破解。 
 
-S 采用SSL链接。 
 
-s PORT 可通过这个参数指定非默认端口。 
 
-l LOGIN 指定破解的用户,对特定用户破解。 
 
-L FILE 指定用户名字典。 
 
-p PASS 小写,指定密码破解,少用,一般是采用密码字典。 
 
-P FILE 大写,指定密码字典。 
 
-e ns 可选选项,n:空密码试探,s:使用指定用户和密码试探。 
 
-C FILE 使用冒号分割格式,例如“登录名:密码”来代替-L/-P参数。 
 
-M FILE 指定目标列表文件一行一条。 
 
-o FILE 指定结果输出文件。 
 
-f 在使用-M参数以后,找到第一对登录名或者密码的时候中止破解。 
 
-t TASKS 同时运行的线程数,默认为16。 
 
-w TIME 设置最大超时的时间,单位秒,默认是30s。 
 
-v / -V 显示详细过程。 
 
server 目标ip 
 
service 指定服务名,支持的服务和协议:telnet ftp pop3[-ntlm] imap[-ntlm] smb smbnt 
http-{head|get} http-{get|post}-form http-proxy cisco cisco-enable vnc 
ldap2 ldap3 mssql mysql oracle-listener postgres nntp socks5 rexec 
rlogin pcnfs snmp rsh cvs svn icq sapr3 ssh smtp-auth[-ntlm] pcanywhere 
teamspeak sip vmauthd firebird ncp afp等等。 
 
OPT 可选项

各种用法实例

1、破解ssh: 
hydra -l 用户名 -p 密码字典 -t 线程 -vV -e ns ip ssh 
hydra -l 用户名 -p 密码字典 -t 线程 -o save.log -vV ip ssh 
 
 
2、破解ftp: 
hydra ip ftp -l 用户名 -P 密码字典 -t 线程(默认16) -vV 
hydra ip ftp -l 用户名 -P 密码字典 -e ns -vV 
 
 
3、get方式提交,破解web登录: 
hydra -l 用户名 -p 密码字典 -t 线程 -vV -e ns ip http-get /admin/ 
hydra -l 用户名 -p 密码字典 -t 线程 -vV -e ns -f ip http-get /admin/index.php
 
 
4、post方式提交,破解web登录: 
hydra -l 用户名 -P 密码字典 -s 80 ip http-post-form "/admin/login.php:username=^USER^&password=^PASS^&submit=login:sorry password" 
hydra -t 3 -l admin -P pass.txt -o out.txt -f 10.36.16.18 http-post-form "login.php:id=^USER^&passwd=^PASS^:wrong username or password" 
(参数说明:-t同时线程数3,-l用户名是admin,字典pass.txt,保存为out.txt,-f 当破解了一个密码就停止, 10.36.16.18目标ip,http-post-form表示破解是采用http的post方式提交的表单密码破解,中 的内容是表示错误猜解的返回信息提示。) 
 
 
5、破解https: 
hydra -m /index.php -l muts -P pass.txt 10.36.16.18 https 
 
 
 
6、破解teamspeak: 
hydra -l 用户名 -P 密码字典 -s 端口号 -vV ip teamspeak 
 
 
 
7、破解cisco: 
hydra -P pass.txt 10.36.16.18 cisco 
hydra -m cloud -P pass.txt 10.36.16.18 cisco-enable 
 
 
 
8、破解smb: 
hydra -l administrator -P pass.txt 10.36.16.18 smb 
 
 
 
9、破解pop3: 
hydra -l muts -P pass.txt my.pop3.mail pop3 
 
 
 
10、破解rdp: 
hydra ip rdp -l administrator -P pass.txt -V 
 
 
 
11、破解http-proxy: 
hydra -l admin -P pass.txt http-proxy://10.36.16.18 
 
 
 
12、破解imap: 
hydra -L user.txt -p secret 10.36.16.18 imap PLAIN 
hydra -C defaults.txt -6 imap://[fe80::2c:31ff:fe12:ac11]:143/PLAIN
</code></pre> 
  <h2>五、防范暴力猜解</h2> 
  <p>防止暴力猜解是非常简单的,无论是B/S架构或者是C/S架构,下面总结出一下几点。</p> 
  <p>1.密码的复杂性</p> 
  <p>毫无疑问,密码设置一定要复杂,这是最基本的,最底层的防线,密码设定一定要有策略:</p> 
  <ul> 
   <li>对于重要的应用,密码长度最低位8位数以上,尽量在8~16位数</li> 
   <li>绝不允许以自己的手机号码,邮箱等关键“特征”为密码</li> 
   <li>用户名与密码不能有任何联系,如用户名为“admin”,密码为“admin888”。</li> 
   <li>仅仅以上三点是不够的,比如说“123456”,“222222”,“111111”这样的弱口令密码,长度够了,但是也是极为危险,因为这些密码一般都已收录到了攻击者的密码字典中,所以就必须要增加密码的复杂性,比如以下方案: 
    <ul> 
     <li>至少一个小写字母(a-z)</li> 
     <li>至少一个大写字母(A-Z)</li> 
     <li>至少一个数字(0-9)</li> 
     <li>至少一个特殊字符</li> 
    </ul> </li> 
  </ul> 
  <p>2.验证码措施</p> 
  <p>验证码是一种区分用户是计算机和人的公共全自动程序</p> 
  <p>使用验证码可以有效地防止:</p> 
  <ul> 
   <li> <p>恶意破解密码</p> </li> 
   <li> <p>刷票</p> </li> 
   <li> <p>论坛灌水等</p> <p>可以说验证码最主要的是防范“机器人“</p> </li> 
  </ul> 
  <p>验证码防范手段</p> 
  <ul> 
   <li>滑动验证码</li> 
   <li>点击对应图片</li> 
   <li>输入图片中的文字或者数字</li> 
  </ul> 
  <p>3.限制访问的频率</p> 
  <ul> 
   <li>当短暂时间内大量发送请求时可以封IP,禁止发送请求</li> 
   <li>或短暂封禁一段时间</li> 
   <li>当短期内访问次数达到一定数目可以要求发送手机验证码或回答密保问题</li> 
  </ul> 
  <h2>六、验证码安全</h2> 
  <p>验证码是一种区分用户是计算机还是人的公共全自动程序,可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较建议的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以会打出问题的用户可以被认为是人类。</p> 
  <h3>工作原理</h3> 
  <p>常见的图形验证码是与web中的会话相关联的,在一个会话开始时,在需要使用验证码的地方会生成一个与当前会话相关的验证码,用户识别出验证码后通过填写表单将数据提交给服务器,服务器端会验证此次会话中的验证码是否正确。具体来说,其工作流程如图1所示:</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2P0Ex0VX-1600787880307)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\暴力破解.assets\图1-验证码技术工作原理-298x300.jpg)]</p> 
  <p>图1 验证码技术工作原理</p> 
  <p>对用户方来说,用户访问起始页面,识别返回页面中的验证码,在输入验证码和其他信息后提交表单,在服务器处理后可查看到当前操作是否成功。</p> 
  <p>服务器在接收到用户对初始页面的请求后,会自动创建一个新的会话,同时生成验证码来关联这个会话,并且生成用户可见到的验证码图片,最后这些页面返回到用户的浏览器上,用户此时可看到完整的页面;在接到用户提交的表单请求时,服务器会比较用户提交的验证码值并与之前存储在此会话下的验证码值做比较,如果一致判断验证码是正确,否则认为提交的验证码是错误的,可能是客户端是计算机或者用户识别错误。服务器端进行这些处理后将处理结果反馈给用户。如果提交的验证码是正确的,则按照预定流程进行下一步骤,否则回到需要用户输入的那个界面上。</p> 
  <h3>存在的问题</h3> 
  <p>验证码作为区分人与机器的一道重要屏障,与之相关的对抗技术一直在WEB安全研究上有着重要意义。图片验证码生成算法以及程序实现流程上都有可能带来问题,容易被攻击者突破。</p> 
  <h4>图片验证码的生成可能存在如下问题</h4> 
  <p><strong>1) 图片验证码的字符空间小</strong></p> 
  <p>如果选取的字符空间较小,则让验证码识别变得相对简单。字母数字组合的字符集比单纯为数字的字符集效果要好。</p> 
  <p><strong>2) 图片中的字符规则</strong></p> 
  <p>字符进行变形,扭曲不利于程序的识别,而对人眼识别是无障碍的,但此方法对生成程序来说有一定的难度。</p> 
  <p><strong>3) 图片中缺少干扰图案</strong></p> 
  <p>干扰图案能有效增加验证码的识别难度,并且对生成程序来说代价小。</p> 
  <h4>在验证码的程序实现流程方面可能存在如下问题</h4> 
  <p><strong>1) 验证码固定</strong></p> 
  <p>一般地,用户在开始访问初始页面时,浏览器会向服务器发起页面请求,服务器此时创建会话,同时返回的页面里会嵌入验证码图片地址,浏览器在加载响应页面后,会自动加载验证码图片地址。服务器在接收到验证码图片地址的请求时,会对当前会话生成一个对应的验证码并且返回验证码图片。用户此时根据就可根据验证码图片信息填写表单数据来进行后面的操作,这时,服务器如果检验出提交的验证码是错误的,服务器会返回页面提示错误然后跳转到初始页面,因初始页面内嵌了验证码图片地址,浏览器再次自动刷新验证码页面。</p> 
  <p>如果验证码输入错误,会在上面的流程里自动刷新验证码,正常情况下,这个过程看起来是没有问题的。但是,由于HTTP请求响应式的工作原理,使得攻击者有可能控制验证码生成页面请求不被触发,使得在服务器上同一会话内,服务器端保存的此会话下的验证码一直有效。<br> 基于此,服务器端的正确处理应该是在验证码检验失败时,就需要设置此验证码失效,同时对生成的每一个验证码也需要设置有效期。</p> 
  <p><strong>2) 验证码的字符串值出现在返回的响应中</strong></p> 
  <p>这是属于程序编码考虑不当导致,比如忘记注释掉调试信息导致。验证码可能出现在响应包中的Cookie, URL, 页面注释,甚至验证码在展示的时候直接就是文本方式,这样就完全失去了使用验证码的价值了。</p> 
  <p><strong>3) 验证码长度可指定</strong></p> 
  <p>在页面上存在参数可指定验证码的位数,这可简化识别工作。此问题的出现也可能是调试的需要,并发布时忘记注释掉相关代码而导致。</p> 
  <h3>对抗现状</h3> 
  <p>自验证码技术问世以来,其成为自动化程序运行的第一大敌人。在利益的驱动下,突破封锁技术自然也会产生。一般来说,验证码的对抗技术有如下几个方面:</p> 
  <p>1)避免触发验证码</p> 
  <p>验证码的引入会带来用户友好度的下降,增加验证码输入以及人眼对验证码识别的可能错误等都会带来不好的使用体验。这对追求用户体验的网站来说,在没遇到可疑行为时,其采取的策略是默认不开启验证码功能,当触发可疑行为识别规则时,才会出现验证码。基于此原理,对攻击方来说,就是尽量避免触发可能出现验证码的规则。一般可疑行为识别是通过检查频繁尝试并且出错这个行为来进行,基于此的对抗措施则是使用不同的IP来进行尝试,或者等待足够的时间再次尝试,这样让目标网站程序认为这些尝试都是正常的访问请求,从而在自动化程序端连续作业时不会出现验证码而达到绕过的目的。</p> 
  <p>2)验证码固定</p> 
  <p>从前面的验证码固定问题描述可看出,攻击者可以在同一个会话下,在获得第一个验证码后,后面不再主动触发验证码生成页面,并且一直使用第一个验证码就可循环进行后面的表单操作,从而绕过了验证码的屏障作用。</p> 
  <p>3)验证码机器自动识别</p> 
  <p>计算机自动识别验证码,主要原理是通过一定的算法预先建立验证码范围内的字体特征库,再将要识别的验证码通过同样的算法生成特征,与之前保存的特征库进行比较,进而得到图片验证码的值。</p> 
  <p>一般地,其识别过程有如下图所示的处理流程:</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TuHzwqwo-1600787880311)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\暴力破解.assets\图2-验证码计算机识别过程-300x150.jpg)]</p> 
  <p>图2 验证码计算机识别过程</p> 
  <p>A. 去噪处理</p> 
  <p>主要是去掉图像里的所有干扰信息,比如背景的点,线等。</p> 
  <p>B. 图像二值化</p> 
  <p>图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出黑白效果。图像二值化主要是为了将图像与空白区分开来,方便后续步骤的进行。</p> 
  <p>C. 切片处理</p> 
  <p>图片的切片处理是将每个字符所在区域分离成一个个的图片,确保一个图片内只有一个文字。</p> 
  <p>D. 文字图片标准化</p> 
  <p>对切片后的每个字符图片,还需要进行变形修复处理,比如旋转,缩放等操作尽量将每一个字符图片都调整到标准格式,减小随机度。</p> 
  <p>E. 字符模板识别</p> 
  <p>在最后的字符识别阶段,常用是通过模板对比的方法。模板的生成就是通过上述处理过程后,对给定图片处理后把生成的特征保存下来,并且人工识别输入其对应的字符。在用作识别阶段时,就与保存的每个字符特征模板进行比较,从中找出最相近的一个字符来。</p> 
  <p>4)人工分布式识别</p> 
  <p>机器自动识别图片验证码,对简单的情况能有较高的准确率,但对干扰多,变形复杂的图片验证码,其准确率会很差。由于图片验证码重要度增加,复杂的图片验证码被大量使用,导致近年来出现了利用众包力量实现的人工验证码识别平台。<br> 其工作原理图下所示:</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MI6c2gXz-1600787880313)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\暴力破解.assets\图3-人工分布式识别-300x134.jpg)]</p> 
  <p>​ 图3 人工分布式识别</p> 
  <p>自动化程序将要识别的验证码发送到打码平台,打码平台再将验证码发放给从事验证码识别工作的人员(俗称打码工作),在人工识别后再将值依次返回到自动化程序。由于是人直接参与了验证码的识别,此方法就让验证码完全失去了屏障功能。</p> 
  <h3>验证码未来可能的主要形式</h3> 
  <p>随着验证码攻防技术的对抗升级,验证码技术也出现了一些新的发展动向。<br> 从图片验证码自身的发展来看,主要是围绕增强人脑交互性来展开的,具体来说有如下几个方向:</p> 
  <p>1)增强干扰和字符变形</p> 
  <p>从验证码的机器识别可以看出来,增强干扰和字符变形能极大地提高识别难度。像下面的生成的图片验证码,对人眼识别来说都存在着一些难度。<br> [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JQMdZxE5-1600787880316)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\暴力破解.assets\字母-300x38.jpg)]<br> 2)拓展字符空间</p> 
  <p>常见的图片验证码都是数字或者字母,近年来出现了中文字符作为验证码,这样字符空间就增大了很多。<br> [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u2oUUK6G-1600787880318)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\暴力破解.assets\字母1.jpg)]<br> 如果字符空间足够大,试图通过制作字符模板库方式来实现识别的难度就变得很大了。</p> 
  <p>3)增强与用户的互动性</p> 
  <p>通过增加与用户的互动也可增加难度,但因为这类互动都是通过问答题方式来实现,其题库数量是否足够以及是否具有足够的随机性则成为了关键所在。</p> 
  <p>如下图所示的问答型验证码:<br> [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2lQpNJ8t-1600787880319)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\暴力破解.assets\12306-300x220.jpg)]</p> 
  <p>从验证码的信息传递途径和方式来看,有如下几个方式</p> 
  <p>1)增加信息传递途径也</p> 
  <p>在原来只通过网页来传递信息的基础上增加了其他传递方式,比如手机短信等。对于使用手机短信验证码,需要确保其关联的手机号不为攻击者所控制,否则也将失去保护意义。因为通过在手机里安装特定app软件就可以获得短信内容,这对于手机号码攻击者可控的情况下,验证码可轻松绕过;但如果其攻击场景是账号登陆类的,由于手机号码不可控,则使得暴力猜测变得不可能实施。扩展验证码的传递途径需要结合应用场景来使用,确保此途径不容易被攻击者获得。</p> 
  <p>2)利用动态令牌进行一次一密</p> 
  <p>通过动态令牌实现的一次一密方式,就必须通过人工交互才能实现,但此方式也增加了使用成本,只适用于密级要求很高的场合。</p> 
  <p>3)语音方式</p> 
  <p>语音方式在当前网络也有出现,但主要只是作为方便盲人使用的一个备用方案,但由于智能手机终端的广泛普及,以后也有可能成为一个主要的验证码发展场景。<br> 随着技术的不断发展,以后还会出现其他方式的验证码,但可以肯定的是基于人脑的思维特性来区别于程序的预设特性,至于以后会如何发展,还是让我们拭目以待吧。</p> 
  <h3>操作验证码安全</h3> 
  <p>操作验证码,主要是为了解决三个问题:</p> 
  <p>1、账户暴力破解</p> 
  <p>2、高频次的接口访问</p> 
  <p>3、敏感操作二次确认(CSRF)</p> 
  <p>实际上这三个问题,都属于 人机区分问题,即 这个操作、请求到底是不是人为地、自愿地发出的?</p> 
  <p>验证码安全,围绕下面几点展开:</p> 
  <p>1、验证码可重用 (特定账户暴力破解、CSRF)</p> 
  <p>2、验证码可识别 (特定账户暴力破解)</p> 
  <p>3、验证码在客户端生成、显示、校验 (特定账户暴力破解、CSRF)</p> 
  <p>4、空验证码绕过 (特定账户暴力破解、CSRF)</p> 
  <p>5、验证码数量有限 (特定账户暴力破解)</p> 
  <p>6、是否校验客户端可控 (特定账户暴力破解、CSRF)</p> 
  <p>7、验证码可预测 (特定账户暴力破解)</p> 
  <p>8、错误超过一定次数才开启验证码 (撞库)</p> 
  <p>我将乌云上所有的验证码案例汇总分析,共有63个相关案例,得到如下统计结果:</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FciwbCIe-1600787880321)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\暴力破解.assets\20190815234732-feb4601e-bf73-1.jpeg)]</p> 
  <h4>0x01 验证码可重用</h4> 
  <p>这是验证码安全里最常见的一类安全问题,也是最容易遗漏的一类</p> 
  <p>一般来说,验证码是与Session绑定的,Session生成时,往往也伴随着验证码的生成和绑定。</p> 
  <p>在访问页面时,接口的请求和验证码的生成通常是异步进行的,这使得两个功能变得相对独立。也就意味着我们如果仅请求接口,而不触发验证码的生成,那么验证码就不会变化。</p> 
  <p>并且在考虑安全时,开发人员的关注点往往在 验证码校验 是否通过,通过则进入业务流程,不通过则重新填写,而忽视了 这个用户是否按照既定的业务流程在走(接口访问与验证码生成是否同时进行),验证码是否被多次使用了。</p> 
  <p>理论上来讲,任何验证码只能使用一次或几次,否则就可能导致安全问题</p> 
  <ul> 
   <li>案例1 (验证码输入正确时,未销毁重置)</li> 
  </ul> 
  <p>当用户输入正确的验证码时,程序认为其通过了校验,直接进入了业务流程,忽视了验证码销毁重置的问题。</p> 
  <p>我们可以在输入了正确验证码后,不断重用这一验证码,这导致了 特定账户暴力破解的问题</p> 
  <p>WooYun这方面的案例有27个</p> 
  <pre><code>http://www.anquan.us/static/bugs/wooyun-2015-0116594.html 验证正确,未销毁
http://www.anquan.us/static/bugs/wooyun-2016-0169672.html 正确,未销毁
http://www.anquan.us/static/bugs/wooyun-2015-0164315.html 正确,未销毁
http://www.anquan.us/static/bugs/wooyun-2015-0111128.html 正确,未销毁
http://www.anquan.us/static/bugs/wooyun-2015-0110497.html 校验正确后,未销毁
http://www.anquan.us/static/bugs/wooyun-2015-0102697.html 校验正确后,未销毁
http://www.anquan.us/static/bugs/wooyun-2015-099708.html  校验正确后,未销毁
http://www.anquan.us/static/bugs/wooyun-2015-093065.html  校验正确后,未销毁
http://www.anquan.us/static/bugs/wooyun-2014-087890.html  错误,未销毁,可爆破
http://www.anquan.us/static/bugs/wooyun-2014-085942.html  校验正确后,未销毁
http://www.anquan.us/static/bugs/wooyun-2014-084180.html  同上
http://www.anquan.us/static/bugs/wooyun-2014-083092.html  同上
http://www.anquan.us/static/bugs/wooyun-2014-083274.html  同上
http://www.anquan.us/static/bugs/wooyun-2014-082783.html  同上
http://www.anquan.us/static/bugs/wooyun-2014-074661.html
http://www.anquan.us/static/bugs/wooyun-2014-070959.html
http://www.anquan.us/static/bugs/wooyun-2014-056990.html  输入错误时销毁,正确时不销毁
http://www.anquan.us/static/bugs/wooyun-2014-050862.html
http://www.anquan.us/static/bugs/wooyun-2014-049064.html
http://www.anquan.us/static/bugs/wooyun-2013-046547.html  异步机制请求验证码,未销毁
http://www.anquan.us/static/bugs/wooyun-2013-028024.html  同上
http://www.anquan.us/static/bugs/wooyun-2013-025053.html  未销毁
http://www.anquan.us/static/bugs/wooyun-2013-020460.html
http://www.anquan.us/static/bugs/wooyun-2012-013915.html  未销毁
http://www.anquan.us/static/bugs/wooyun-2012-06226.html
http://www.anquan.us/static/bugs/wooyun-2011-03450.html
</code></pre> 
  <ul> 
   <li>案例2 (验证码输入错误时,未销毁)</li> 
  </ul> 
  <p>当用户输入错误的验证码,而程序没有将验证码重置时,也会存在安全隐患</p> 
  <p>不过验证码的爆破,有什么意义呢?我们本来就可以看到呀</p> 
  <p>当一个敏感操作的CSRF存在验证码防御,且验证码比较弱时,我们就可以用js写脚本来爆破,绕过防御</p> 
  <h4>0x02 验证码可识别</h4> 
  <ul> 
   <li>案例 1(验证码过于简单)</li> 
  </ul> 
  <p>这个属于最简单的验证码,过于简单、清晰、可识别性高,可以编写程序进行识别,导致验证码防御体系失效</p> 
  <p>WooYun中共有7个类似案例:</p> 
  <pre><code>http://www.anquan.us/static/bugs/wooyun-2016-0204186.html
http://www.anquan.us/static/bugs/wooyun-2016-0194576.html
http://www.anquan.us/static/bugs/wooyun-2016-0176919.html
http://www.anquan.us/static/bugs/wooyun-2015-0120388.html
http://www.anquan.us/static/bugs/wooyun-2012-012722.html
http://www.anquan.us/static/bugs/wooyun-2012-011765.html
http://www.anquan.us/static/bugs/wooyun-2012-010851.html
</code></pre> 
  <p>实际上,比这个更难识别,更复杂的验证码,也有一些准确率较高的识别方法,我们在测试时把握好效果与成本的平衡即可</p> 
  <h4>0x03 客户端生成/显示/校验</h4> 
  <ul> 
   <li>案例1(客户端生成验证码文本,然后在服务端请求对应的img)</li> 
  </ul> 
  <p>程序在客户端生成验证码文本,然后向服务端请求该文本对应的 img,导致我们在客户端直接拿到验证码</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jNELLkuw-1600787880321)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\暴力破解.assets\20190815234800-0f021132-bf74-1.jpeg)]</p> 
  <p>程序在客户端生成验证码文本,然后加图层生成img</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K98ZQB5X-1600787880322)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\暴力破解.assets\20190815234821-1b855cca-bf74-1.jpeg)]</p> 
  <ul> 
   <li>案例2 (客户端生成验证码,并且输出到HTML标签中)</li> 
  </ul> 
  <p>程序在客户端生成验证码,并且输出到form表单里的html标签中,可能是为了方便校验?</p> 
  <p>WooYun中共有5个类似案例:</p> 
  <pre><code>http://www.anquan.us/static/bugs/wooyun-2015-0161823.html
http://www.anquan.us/static/bugs/wooyun-2015-0146767.html
http://www.anquan.us/static/bugs/wooyun-2015-099909.html
http://www.anquan.us/static/bugs/wooyun-2012-06634.html
http://www.anquan.us/static/bugs/wooyun-2012-012829.html
https://xz.aliyun.com/t/4487
</code></pre> 
  <ul> 
   <li>案例3(服务端生成验证码,但将明文文本返回给了客户端)</li> 
  </ul> 
  <p>验证码生成之后,向客户端返回了验证码文本(Cookie、body)</p> 
  <p>WooYun中共有6个类似案例:</p> 
  <pre><code>http://www.anquan.us/static/bugs/wooyun-2013-023090.html
http://www.anquan.us/static/bugs/wooyun-2012-010524.html
http://www.anquan.us/static/bugs/wooyun-2012-05151.html
http://www.anquan.us/static/bugs/wooyun-2012-03967.html
http://www.anquan.us/static/bugs/wooyun-2014-075186.html
http://www.anquan.us/static/bugs/wooyun-2014-073811.html
https://xz.aliyun.com/t/4533
</code></pre> 
  <h4>0x04 空验证码绕过</h4> 
  <p>如果你的代码是这样写的,那就会存在安全问题</p> 
  <pre><code>if isset($_POST['captcha'])
{
    ....
}

login();
</code></pre> 
  <p>当验证码为空时,不进入验证码判断流程,直接进入业务逻辑</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rBeqaWO8-1600787880323)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\暴力破解.assets\20190815234851-2d7fb0ce-bf74-1.jpeg)]</p> 
  <p>WooYun中有6个类似案例:</p> 
  <pre><code>http://www.anquan.us/static/bugs/wooyun-2015-0150406.html
http://www.anquan.us/static/bugs/wooyun-2013-028061.html
http://www.anquan.us/static/bugs/wooyun-2013-025065.html
http://www.anquan.us/static/bugs/wooyun-2012-014224.html
http://www.anquan.us/static/bugs/wooyun-2012-08287.html
http://www.anquan.us/static/bugs/wooyun-2014-049531.html
</code></pre> 
  <h4>0x05 验证码数量有限</h4> 
  <p>当程序使用静态的图片,而不是动态生成验证码时,图片的数量将是有限的。</p> 
  <p>我们可以将其全部取回并计算md5,以此绕过验证码机制。</p> 
  <p>WooYun中有2个类似案例,之前的12306也属于这种情况</p> 
  <pre><code>http://www.anquan.us/static/bugs/wooyun-2015-0102178.html
http://www.anquan.us/static/bugs/wooyun-2012-07413.html
</code></pre> 
  <h4>0x06 是否校验可控</h4> 
  <p>天才才能写出来的验证码校验机制,请求中存在一个字段,来决定是否进行校验,修改为 false(0) 即可</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5CELS9E7-1600787880324)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\暴力破解.assets\20190815234904-35459b02-bf74-1.jpeg)]</p> 
  <p>WooYun中有5个类似案例</p> 
  <pre><code>http://www.anquan.us/static/bugs/wooyun-2014-071289.html
http://www.anquan.us/static/bugs/wooyun-2013-034367.html
http://www.anquan.us/static/bugs/wooyun-2013-026219.html
http://www.anquan.us/static/bugs/wooyun-2012-014563.html
http://www.anquan.us/static/bugs/wooyun-2014-082981.html
</code></pre> 
  <h4>0x07 超过次数才开启验证码</h4> 
  <p>接口在登录错误超过一定次数后才会开启验证码,这种机制要么是基于ip判断,要么就是基于session判断,要么是基于账号判断</p> 
  <ul> 
   <li>案例1 (基于session)</li> 
  </ul> 
  <p>如果是基于Session判断,我们清空session即可绕过。</p> 
  <p>WooYun中有1个类似案例</p> 
  <pre><code>http://www.anquan.us/static/bugs/wooyun-2015-0114450.html
</code></pre> 
  <ul> 
   <li>案例2 (基于ip)</li> 
  </ul> 
  <p>如果是基于ip判断,我们可以尝试ip是否可以伪造,或者使用代理池</p> 
  <p>WooYun中有1个类似案例</p> 
  <pre><code>http://www.anquan.us/static/bugs/wooyun-2014-080327.html
</code></pre> 
  <ul> 
   <li>案例3 (基于账号)</li> 
  </ul> 
  <p>服务端的限制仅针对于特定账号,比如某账户错误5次以上开启验证码。</p> 
  <p>这种情况下虽然无法暴力破解特定账户,但是仍然可以实施撞库攻击</p> 
  <p>WooYun中有2个类似案例</p> 
  <pre><code>http://www.anquan.us/static/bugs/wooyun-2015-0149748.html
http://www.anquan.us/static/bugs/wooyun-2016-0193985.html
</code></pre> 
  <h4>0x08 验证码可预测</h4> 
  <p>当验证码与时间戳等因素强相关时,就不再具有随机性的属性,导致验证码形同虚设。</p> 
  <p>WooYun中有1个类似案例</p> 
  <pre><code>http://www.anquan.us/static/bugs/wooyun-2015-0115041.html
</code></pre> 
  <h3>身份验证码安全</h3> 
  <p>身份验证码主要是为了验证操作人身份,然后进行 密码修改、账户变更、重要操作等功能。</p> 
  <p>而这类验证码主要牵扯到5类安全问题:</p> 
  <p>1、验证码返回给客户端</p> 
  <p>2、业务流程缺陷</p> 
  <p>3、验证码无时间间隔限制</p> 
  <p>4、验证码可爆破</p> 
  <p>5、验证码在客户端生成</p> 
  <p>将乌云中的案例去重、去无关案例后,有41个身份验证码的案例,分布如下:</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xIi95Xka-1600787880325)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\暴力破解.assets\20190815234926-426d5edc-bf74-1.jpeg)]</p> 
  <h4>0x01 验证码返回客户端</h4> 
  <p>服务器将验证码明文返回给客户端,本来觉得这种错误比较低级,没想到这样的案例还挺多。</p> 
  <p>大致有三种可能,一种是验证码校验在客户端进行,这种错误太低级了,可能性不大。</p> 
  <p>另一种情况:</p> 
  <p>1、客户点击获取验证码</p> 
  <p>2、程序生成一个随机验证码,将参数拼接之后,提交给短信API</p> 
  <p>3、客户端需要判断是否发送成功,所以程序将短信API返回的内容交给了客户端</p> 
  <p>作为一个短信API,很有可能会在response中包含了发送的短信内容,导致验证码的泄露</p> 
  <p>最后一种情况,开发写API的时候,为了方便调试,返回了这些信息,后来忘删了…</p> 
  <ul> 
   <li>案例</li> 
  </ul> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wUQTSIfX-1600787880326)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\暴力破解.assets\20190815234949-50522776-bf74-1.jpeg)]</p> 
  <p>WooYun中有15个类似案例</p> 
  <pre><code>http://www.anquan.us/static/bugs/wooyun-2016-0179467.html
http://www.anquan.us/static/bugs/wooyun-2016-0172266.html
http://www.anquan.us/static/bugs/wooyun-2015-0139468.html
http://www.anquan.us/static/bugs/wooyun-2014-085124.html
http://www.anquan.us/static/bugs/wooyun-2014-082114.html
http://www.anquan.us/static/bugs/wooyun-2014-078687.html
http://www.anquan.us/static/bugs/wooyun-2014-066510.html
http://www.anquan.us/static/bugs/wooyun-2014-049813.html
http://www.anquan.us/static/bugs/wooyun-2014-049547.html
http://www.anquan.us/static/bugs/wooyun-2013-042464.html
http://www.anquan.us/static/bugs/wooyun-2013-024195.html
http://www.anquan.us/static/bugs/wooyun-2013-022009.html
http://www.anquan.us/static/bugs/wooyun-2013-019668.html
http://www.anquan.us/static/bugs/wooyun-2014-085124.html
http://www.anquan.us/static/bugs/wooyun-2014-082114.html
</code></pre> 
  <h4>0x02 业务流程缺陷</h4> 
  <p>涉及到验证码的业务,通常都分为多步进行,比如 修改手机号功能:认证原手机号 -> 填写新手机号</p> 
  <p>当下一步的业务,没有校验上一步的认证是否成功时,就会存在逻辑缺陷绕过。</p> 
  <ul> 
   <li>案例1 (修改response绕过)</li> 
  </ul> 
  <p>填写手机验证码时填任意值,然后修改请求的response包中的标识字段,将其修改为true,即可绕过</p> 
  <p>实际上这种问题,本质上也是业务流程的逻辑缺陷问题。</p> 
  <p>虽然验证码的校验在服务端进行,但是下一步的业务,并没有校验上一步的认证是否成功,两者之间是独立的</p> 
  <p>这就导致我们可以修改response,让客户端直接跳入下一次逻辑,我们也可以审计源码,直接找出下一步的url</p> 
  <p>WooYun中有5个类似案例</p> 
  <pre><code>http://www.anquan.us/static/bugs/wooyun-2015-0151201.html
http://www.anquan.us/static/bugs/wooyun-2015-0120951.html
http://www.anquan.us/static/bugs/wooyun-2015-0119252.html
http://www.anquan.us/static/bugs/wooyun-2015-0104509.html
http://www.anquan.us/static/bugs/wooyun-2015-090379.html
</code></pre> 
  <ul> 
   <li>案例2 (手机号合法性)</li> 
  </ul> 
  <p>在验证码校验过程中,程序应严格检查对应关系,即 接收验证码的手机号,是否是该账户对应的手机号</p> 
  <p>如果不存在这处对应关系校验,则会衍生出各种逻辑问题,比如用自己的手机通过验证,然后修改其它人的信息</p> 
  <p>其实这种情况下,也是存在业务流程缺陷的问题。下一步的业务,并没有校验上一步业务中,手机号是否是属于该账户的</p> 
  <pre><code>http://www.anquan.us/static/bugs/wooyun-2015-0102205.html
http://www.anquan.us/static/bugs/wooyun-2011-03099.html
http://www.anquan.us/static/bugs/wooyun-2014-080315.html
</code></pre> 
  <h4>0x03 验证码无时间间隔限制</h4> 
  <p>服务端对用户请求短信的频次没有时间间隔限制,或者是在客户端限制,可导致短信资源滥用</p> 
  <p>没有基于session、ip、账户的限制,属于完全无限制的情况</p> 
  <pre><code>http://www.anquan.us/static/bugs/wooyun-2012-010102.html
http://www.anquan.us/static/bugs/wooyun-2012-010556.html
http://www.anquan.us/static/bugs/wooyun-2012-04876.html
http://www.anquan.us/static/bugs/wooyun-2012-04771.html
http://www.anquan.us/static/bugs/wooyun-2012-04166.html
http://www.anquan.us/static/bugs/wooyun-2012-04022.html
http://www.anquan.us/static/bugs/wooyun-2011-01188.html
http://www.anquan.us/static/bugs/wooyun-2011-03485.html
</code></pre> 
  <h4>0x04 验证码可爆破</h4> 
  <ul> 
   <li>案例1 (完全无限制)</li> 
  </ul> 
  <p>当验证码太弱(4-6位数字),且服务器没有错误次数限制时,则会存在可爆破的问题</p> 
  <p>WooYun中有7个类似案例</p> 
  <pre><code>http://www.anquan.us/static/bugs/wooyun-2015-0155994.html
http://www.anquan.us/static/bugs/wooyun-2013-017242.html
http://www.anquan.us/static/bugs/wooyun-2013-016896.html
http://www.anquan.us/static/bugs/wooyun-2012-016179.html
http://www.anquan.us/static/bugs/wooyun-2013-031605.html
http://www.anquan.us/static/bugs/wooyun-2013-040908.html
http://www.anquan.us/static/bugs/wooyun-2012-012377.html
</code></pre> 
  <ul> 
   <li>案例2 (限制覆盖不全)</li> 
  </ul> 
  <p>以重置密码业务为例:用户输入手机验证码 -> 用户提交新密码</p> 
  <p>为了解决业务流程绑定的问题,通常两个步骤的参数中都会带有验证码。</p> 
  <p>开发人员往往只注意到第一个接口,而忽视了第二个接口。此时,在第一个页面中使用自己的手机号通过验证,第二个页面中修改为他人手机号并爆破</p> 
  <p>WooYun中有1个类似案例:</p> 
  <pre><code>http://www.anquan.us/static/bugs/wooyun-2015-0133289.html
</code></pre> 
  <h4>0x05 验证码在客户端生成</h4> 
  <p>这种情况下,客户端生成一个验证码发送给服务端,服务端将这个验证码拼接,然后请求短信API发送短信</p> 
  <p>天才才能想出来的办法</p> 
  <p>WooYun中有2个类似案例</p> 
  <pre><code>http://www.anquan.us/static/bugs/wooyun-2014-086716.html
http://www.anquan.us/static/bugs/wooyun-2013-022378.html
</code></pre> 
  <h3>验证码分类</h3> 
  <p>图形验证码是现在大多数网站登录通行的方式。不同的网站,由于其安全级别不一样,网站开发人员掌握的技术不一样,使用的图形验证码的种类也不一样。大体上,图形验证码可以分为以下几类:</p> 
  <ul> 
   <li>传统图形验证码</li> 
   <li>广告型的图形验证码</li> 
   <li>滑动验证码</li> 
   <li>图标选择与行为辅助验证码</li> 
   <li>点击式的图文验证与行为辅助</li> 
   <li>智能验证码</li> 
   <li>语音验证码</li> 
  </ul> 
  <h4><strong>传统图形验证码</strong></h4> 
  <p>主要是通过用户输入图片中的字母、数字、汉字等进行验证。<br> 代表:大多数网站采用此种验证形式。<br> 特点:简单易操作,人机交互性较好。但安全系数低,容易被破解。</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XB2pYkPo-1600787880327)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20190104105523420.png)]</p> 
  <h4><strong>广告型的图形验证码</strong></h4> 
  <p>有精美图案,识别文本也清晰可认,专注于广告。<br> 代表:Solve Media,宇初验证码<br> 特点:与其说是验证码,倒不如说是广告位。</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7LmXR2mM-1600787880328)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\2019010413461084.png)]</p> 
  <h4><strong>滑动验证码</strong></h4> 
  <p>按要求将备选碎片滑动到正确的位置,或者滑动图标到末尾<br> 代表:极验验证码<br> 特点:操作简单,体验好。单一纬度,容易被逆向模拟,与移动端页面切换不兼容。</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mIcl2OTm-1600787880329)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20190104134758102.png)]</p> 
  <h4><strong>图标选择与行为辅助</strong></h4> 
  <p>给出一组图片,按要求点击其中指定的一张或者多张图片。<br> 代表:点触验证码、Google新型验证码、12306验证码<br> 特点:安全性强,对于图片、图库、技术要求高。</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-00zeBptc-1600787880330)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20190104134856809.png)]</p> 
  <h4><strong>点击式的图文验证与行为辅助</strong></h4> 
  <p>通过文字提醒用户点击图中相同字或者相同图标的位置进行验证。<br> 代表:淘宝新型验证码、点触验证码<br> 特点:操作简单,体验良好,单一图片区域较大,破解难度大。</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AlXB5s0q-1600787880331)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20190104135157478.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E68WIbiG-1600787880332)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20190104135619907.png)]</p> 
  <h4><strong>智能验证码</strong></h4> 
  <p>通过行为特征、设备指纹、数据风控等技术,正常用户免验证,异常用户强制验证<br> 代表:点触智能验证码,支付宝验证码<br> 特点:简单便捷,区分人与机器、人与人、设备与设备</p> 
  <h4><strong>语音验证码</strong></h4> 
  <p>通过机器客服给你打电话,告诉你验证码<br> 代表:滴滴验证码,易到验证码<br> 特点:需要接听客服电话,体验较差,无法破解</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XBXj92GY-1600787880333)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20190105120347103.png)]</p> 
  <h3><strong>图形验证码的验证过程</strong></h3> 
  <ul> 
   <li>我们访问一个网站的登录页面</li> 
   <li>服务器端响应并创建一个新的Session ID,同时生成一个随机图形验证码,服务器端有该Sessino ID对应图形验证码的答案</li> 
   <li>服务器端将该Session ID和图形验证码发送给客户端</li> 
   <li>客户端填写登录表单,并且填入该图形验证码的答案</li> 
   <li>服务器端收到用户提交的登录数据,取出Session ID与图形验证码的答案,并且与服务器端相同Session ID的图形验证码答案做比较,如果相同,再判断提交表单的用户名,密码等其他信息。如果图形验证码错误,随即返回验证码错误</li> 
  </ul> 
  <p>注意:这里需要注意的是,Session ID销毁的条件是用户提交的图形验证码和用户名密码等其他信息正确,即登录成功,或者是用户手动刷新验证码</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XTx1WzHA-1600787880334)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20190104142647372.png)]</p> 
  <h3><strong>图形验证码的安全问题</strong></h3> 
  <p>既然图形验证是用来抵御机器自动化攻击,防止恶意破解密码、刷票、论坛灌水,防止黑客攻击等威胁的一种手段。道高一尺魔高一丈,那么恶意用户肯定会想方设法去绕过或破解图形验证码,来达到其恶意的目的。图形验证码面临的安全问题来自多方面的,既有客户端的问题,也有服务器端的问题,也有验证码本身的技术问题。</p> 
  <h4><strong>客户端的安全问题</strong></h4> 
  <ol> 
   <li>客户端生成验证码,验证码由客户端生成并且仅仅在客户端用验证</li> 
   <li>验证码输出在响应包中</li> 
   <li>验证码输出在cookie中</li> 
   <li>有些网站默认不显示验证码,而是在输入错误一定数量之后才需要验证验证码,开发人员可能在Cookie中写入一个标记loginErr,用来记录错误数量,则可以不更新Cookie中的loginErr值反复提交,验证码就不会出现。</li> 
  </ol> 
  <h4><strong>服务端的安全问题</strong></h4> 
  <ol> 
   <li>验证码不过期,没有及时销毁Session ID会话导致验证码重复使用</li> 
   <li>没有进行非空判断</li> 
   <li>产生的验证码内容集内的答案非常有限,导致可以被制作成字典</li> 
  </ol> 
  <h4><strong>验证码技术安全问题</strong></h4> 
  <p>比如现在很多类型的图形验证码已经可以通过技术手段识别绕过了,识别图形验证码是计算机科学里的一项重要课题,涉及到计算机图形学,机器学习,机器视觉,人工智能等高深领域。</p> 
  <h3><strong>静态图形验证码的破解</strong></h3> 
  <p><strong>图片灰度化和****图片二值化</strong></p> 
  <p>传送门——> https://blog.csdn.net/qq_36119192/article/details/86012022</p> 
  <p><strong>文字分隔</strong></p> 
  <p>为了能识别出字符,需要对要识别的文字图图片进行分割,把每个字符作为单独的一个图片看待</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ROvrrQyx-1600787880334)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20190104195114498.png)]</p> 
  <p><strong>标准化</strong></p> 
  <p>对于部分特殊的验证码,需要对分割后的图片进行标准化处理,也就是说尽量把每个相同的字符都变成一样的格式,减少随机的程度,最简单的比如旋转还原,复杂点的比如扭曲还原等等</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i2k0dwxd-1600787880335)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20190104195326253.png)]</p> 
  <p><strong>识别</strong></p> 
  <p>这一步可以用很多种方法,最简单的就是模板对比,对每个出现过的字符进行处理后把点阵变成字符串,标明是什么字符后,通过字符串对比来判断相似度</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q3oPWUTn-1600787880336)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20190104195651390.png)]</p> 
  <p>最好的识别算法,就是<strong>神经网络</strong>,神经网络是一种模拟动物神经元工作模式的算法,神经网络有多种不同的结构,但是基本架构分为<strong>输入层</strong>,<strong>隐含层</strong>和<strong>输出层</strong>,输入和输出均为二进制。</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6fhnnxha-1600787880336)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20190104195812163.png)]</p> 
  <h2>示例</h2> 
  <p><strong>1.基于表单的暴力破解</strong></p> 
  <p>尝试输入用户名、密码</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-csr7j0PE-1600787880337)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\2019111116300387.png)]</p> 
  <p>结果如下:用户名或密码不存在</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X1KUttbX-1600787880337)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191111163142351.png)]</p> 
  <p>源码分析:</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7fW0P0lS-1600787880338)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\2019111211223038.png)]</p> 
  <p>打开代理,使用burpsuite抓包,进行用户名和密码破解</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WUPufxV3-1600787880339)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191111165007555.png)]</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N3xvx68f-1600787880339)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191111165727939.png)]</p> 
  <p>设置爆破项,添加$符号</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jnnKTSMD-1600787880341)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112091933412.png)]</p> 
  <p>添加payload,如果有密码本可进行上传</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sOOVbzlG-1600787880342)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112092427445.png)]</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Bhx2IUD-1600787880343)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\201911120924589.png)]</p> 
  <p>添加完成后,可根据需要是否在option中的选项修改线程数,另外需要进行grep-match</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sFfH7R4T-1600787880344)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\2019111209261837.png)]</p> 
  <p>单击右上角start attack,开始破解</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2hUKxUh2-1600787880346)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112092727807.png)]</p> 
  <p>破解结果如下:</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nRIV1YeH-1600787880348)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112093100658.png)]</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GH7Hsb1m-1600787880349)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\2019111209354549.png)]</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gSxNrTY2-1600787880350)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112094116724.png)]</p> 
  <p>将爆破结果验证登录</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W1peluy4-1600787880351)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\201911120947193.png)]</p> 
  <p><strong>2.验证码绕过(on server)</strong></p> 
  <p>将用户名、密码、验证码错误输入,使用burpsuite抓包如下:</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eJGzgVmZ-1600787880352)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112121225960.png)]</p> 
  <p>可知,后台对验证码进行了逻辑判断。</p> 
  <p>源码分析:</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-03ovGzL1-1600787880353)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112113448726.png)]</p> 
  <p>查找验证码生成文件[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lQfYOlNC-1600787880354)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112114111845.png)]</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IDxkrJ2D-1600787880356)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\2019111211435427.png)]</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hMmwLoQz-1600787880357)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112114540251.png)]随机生成字母数字组成的6位验证码</p> 
  <p>漏洞利用:</p> 
  <p>在刚才burpsuite抓取的包中,将验证码vcode的值修改为正确值</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q7wJUhCM-1600787880358)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112121823884.png)]</p> 
  <p>接着对用户名和密码进行爆破</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zeKfR9QN-1600787880359)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112141526704.png)]</p> 
  <p><strong>3.验证码绕过(on client)</strong></p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8uW5PdB8-1600787880360)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112161416608.png)]</p> 
  <p>单击确认后,验证码会重新刷新,因此必须输入正确的验证码后,再使用burpsuite抓包。用户名、密码随意填写。</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gS5KptIx-1600787880361)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112161748928.png)]</p> 
  <p>代码分析:</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kGgKct4Z-1600787880362)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112145331910.png)]</p> 
  <p>用户名、密码依旧没有什么有效的防护措施,接着看验证码,从A–Z、0-9组合随机产生五位数</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-55y1ouE1-1600787880363)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112145535265.png)]</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fJKjQfui-1600787880363)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112145738503.png)]</p> 
  <p>根据抓包后,继续可以进行用户名、密码的爆破</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ShU4bcbT-1600787880364)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112164805105.png)]</p> 
  <p><strong>4.token防爆破?</strong></p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SkyAOhWs-1600787880364)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\2019111217110361.png)]</p> 
  <p>随意输入用户名、密码,使用burpsuite进行抓包</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jd8o5FnJ-1600787880365)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112171655527.png)]</p> 
  <p>代码分析:</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uwrczv75-1600787880365)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112172850822.png)]</p> 
  <p>下面这条语句中的<span class="katex--inline"><span class="katex"><span class="katex-mathml"> S E E S I O N [ ′ t o k e n ′ ] 很 显 然 是 加 载 页 面 时 产 生 的 , 而 从 前 端 页 面 F 12 下 的 t o k e n 的 v a l u e 值 相 当 于 _SEESION['token']很显然是加载页面时产生的,而从前端页面F12下的token的value值相当于 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1.00189em; vertical-align: -0.25em;"></span><span class="mord"><span class=""></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.328331em;"><span class="" style="top: -2.55em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right: 0.05764em;">S</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right: 0.05764em;">E</span><span class="mord mathdefault" style="margin-right: 0.05764em;">E</span><span class="mord mathdefault" style="margin-right: 0.05764em;">S</span><span class="mord mathdefault" style="margin-right: 0.07847em;">I</span><span class="mord mathdefault" style="margin-right: 0.02778em;">O</span><span class="mord mathdefault" style="margin-right: 0.10903em;">N</span><span class="mopen"><span class="mopen">[</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.751892em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mord mathdefault">t</span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right: 0.03148em;">k</span><span class="mord mathdefault">e</span><span class="mord"><span class="mord mathdefault">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.751892em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">]</span><span class="mord cjk_fallback">很</span><span class="mord cjk_fallback">显</span><span class="mord cjk_fallback">然</span><span class="mord cjk_fallback">是</span><span class="mord cjk_fallback">加</span><span class="mord cjk_fallback">载</span><span class="mord cjk_fallback">页</span><span class="mord cjk_fallback">面</span><span class="mord cjk_fallback">时</span><span class="mord cjk_fallback">产</span><span class="mord cjk_fallback">生</span><span class="mord cjk_fallback">的</span><span class="mord cjk_fallback">,</span><span class="mord cjk_fallback">而</span><span class="mord cjk_fallback">从</span><span class="mord cjk_fallback">前</span><span class="mord cjk_fallback">端</span><span class="mord cjk_fallback">页</span><span class="mord cjk_fallback">面</span><span class="mord mathdefault" style="margin-right: 0.13889em;">F</span><span class="mord">1</span><span class="mord">2</span><span class="mord cjk_fallback">下</span><span class="mord cjk_fallback">的</span><span class="mord mathdefault">t</span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right: 0.03148em;">k</span><span class="mord mathdefault">e</span><span class="mord mathdefault">n</span><span class="mord cjk_fallback">的</span><span class="mord mathdefault" style="margin-right: 0.03588em;">v</span><span class="mord mathdefault">a</span><span class="mord mathdefault" style="margin-right: 0.01968em;">l</span><span class="mord mathdefault">u</span><span class="mord mathdefault">e</span><span class="mord cjk_fallback">值</span><span class="mord cjk_fallback">相</span><span class="mord cjk_fallback">当</span><span class="mord cjk_fallback">于</span></span></span></span></span>_POST[‘token’],从上面抓到的token值与页面下看到的值相等,即<span class="katex--inline"><span class="katex"><span class="katex-mathml"> P O S T [ ′ t o k e n ′ ] = _POST['token']= </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1.00189em; vertical-align: -0.25em;"></span><span class="mord"><span class=""></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height: 0.328331em;"><span class="" style="top: -2.55em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right: 0.13889em;">P</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height: 0.15em;"><span class=""></span></span></span></span></span></span><span class="mord mathdefault" style="margin-right: 0.02778em;">O</span><span class="mord mathdefault" style="margin-right: 0.05764em;">S</span><span class="mord mathdefault" style="margin-right: 0.13889em;">T</span><span class="mopen"><span class="mopen">[</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.751892em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mord mathdefault">t</span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right: 0.03148em;">k</span><span class="mord mathdefault">e</span><span class="mord"><span class="mord mathdefault">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.751892em;"><span class="" style="top: -3.063em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mclose">]</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span></span></span></span></span>_SEESION[‘token’]</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ygrsGaMJ-1600787880366)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112173135521.png)]</p> 
  <p>接下来保证token值不变的情况下,进行暴力破解,由于是三个变量,因此选择Pitchfork类型爆破,如下图所示:</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3nw2brF7-1600787880366)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\2019111222582118.png)]</p> 
  <p>设置线程数为1,保证只有获取上一个请求返回的taken值才能,做下一次请求</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ufhAEUJo-1600787880367)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112230238653.png)]</p> 
  <p>在Options中的Grep-Extract选择Add,出现如下图所示,点击Refetch response 获取返回的包,找到返回的token值,选中并复制下来。点击确定(注意:一定要在选中token的状态下点击确定)</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ImOLBIOQ-1600787880367)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112231039320.png)]</p> 
  <p>接着下拉options中到redirections模块选择always</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-An0vuUEk-1600787880368)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112231431867.png)]</p> 
  <p>通过筛选规则Recursive grep(匹配),拿到上一个返回包的taken值放在这次taken值的变量里面</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X8XYojXK-1600787880368)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\2019111223192160.png)]</p> 
  <p>payload1和2设置同之前爆破用户名、密码一样,上传密码本</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b8c4PLn9-1600787880369)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112232052219.png)] [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oh0KTXqY-1600787880370)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112232111945.png)]</p> 
  <p>最后,进行start attack,开始暴力破解</p> 
  <p>[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ybflnDu9-1600787880370)(C:\Users\79021\Desktop\笔记\渗透测试\其他漏洞\浅谈暴力破解及验证码安全.assets\20191112232811106.png)]</p> 
  <p>很明显,爆破成功,获取用户名、密码。</p> 
  <h2>验证码修复</h2> 
  <ul> 
   <li>强制要求输入验证码</li> 
   <li>限制IP策略,只能由内网IP访问</li> 
   <li>验证码只能用一次,用完即销毁</li> 
   <li>保证验证码强度,例如变形,扭曲,变换字体,干扰线条,干扰背景色等</li> 
   <li>大网站最好统一安全验证码,各处使用统一验证码接口</li> 
  </ul> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1646487832694448128"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(web安全,渗透,安全,web安全)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1943993281092317184.htm"
                           title="为什么会出现“与此站点的连接不安全”警告?" target="_blank">为什么会出现“与此站点的连接不安全”警告?</a>
                        <span class="text-muted"></span>

                        <div>当浏览器弹出“与此站点的连接不安全”的红色警告时,不仅会让访客感到不安,还可能直接导致用户流失、品牌信誉受损,甚至引发数据泄露风险。作为网站运营者,如何快速解决这一问题?一、为什么会出现“与此站点的连接不安全”警告?浏览器提示“不安全连接”,本质上是检测到当前网站与用户之间的数据传输未经过加密保护。以下是触发警告的常见原因:1.未安装SSL证书SSL(SecureSocketsLayer)证书是网</div>
                    </li>
                    <li><a href="/article/1943993154692771840.htm"
                           title="什么是证书吊销列表?CRL 解释" target="_blank">什么是证书吊销列表?CRL 解释</a>
                        <span class="text-muted">WoTrusSSL</span>
<a class="tag" taget="_blank" href="/search/ssl/1.htm">ssl</a><a class="tag" taget="_blank" href="/search/https/1.htm">https</a>
                        <div>数字证书是安全在线互动的支柱,用于验证身份和确保加密通信。但是,当这些证书被盗用或滥用时,必须立即撤销它们以维持信任。这就是证书撤销列表(CRL)的作用所在。CRL由证书颁发机构(CA)维护,对于识别和撤销已撤销的证书,防止其造成危害至关重要。在本指南中,我们将探讨什么是CRL、它们如何运作以及为什么它们对网络安全至关重要。什么是证书吊销列表(CRL)?证书吊销列表(CRL)是证书颁发机构(CA)</div>
                    </li>
                    <li><a href="/article/1943992397344075776.htm"
                           title="驱动程序为什么要做 WHQL 认证?" target="_blank">驱动程序为什么要做 WHQL 认证?</a>
                        <span class="text-muted">GDCA SSL证书</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a>
                        <div>驱动程序进行WHQL(WindowsHardwareQualityLabs)认证的核心价值在于解决兼容性、安全性和市场准入三大关键问题,具体必要性如下:️‌一、规避系统拦截,保障驱动可用性‌消除安装警告‌未认证的驱动在安装时会触发Windows的‌红色安全警告‌(如“无法验证发布者”),甚至被系统强制拦截。通过WHQL认证的驱动获得微软数字签名,用户可无阻安装‌。满足系统强制要求‌Windows1</div>
                    </li>
                    <li><a href="/article/1943990629709180928.htm"
                           title="Guava LoadingCache" target="_blank">Guava LoadingCache</a>
                        <span class="text-muted">sqyaa.</span>
<a class="tag" taget="_blank" href="/search/java%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/1.htm">java并发编程</a><a class="tag" taget="_blank" href="/search/Java%E7%9F%A5%E8%AF%86/1.htm">Java知识</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a><a class="tag" taget="_blank" href="/search/guava/1.htm">guava</a>
                        <div>LoadingCache是GoogleGuava库提供的一个高级缓存实现,它通过自动加载机制简化了缓存使用模式。核心特性自动加载机制当缓存未命中时,自动调用指定的CacheLoader加载数据线程安全:并发请求下,相同key只会加载一次灵活的过期策略支持基于写入时间(expireAfterWrite)和访问时间(expireAfterAccess)的过期可设置最大缓存大小,基于LRU策略淘汰丰富的</div>
                    </li>
                    <li><a href="/article/1943984578133815296.htm"
                           title="Android ViewBinding 使用与封装教程" target="_blank">Android ViewBinding 使用与封装教程</a>
                        <span class="text-muted">积跬步DEV</span>
<a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E5%AE%9E%E6%88%98%E5%A4%A7%E5%85%A8/1.htm">开发实战大全</a><a class="tag" taget="_blank" href="/search/android/1.htm">android</a>
                        <div>AndroidViewBinding使用与封装教程:一、ViewBinding是什么?核心功能:为每个XML布局文件自动生成一个绑定类(如ActivityMainBinding),直接暴露所有带ID的视图引用。优点:避免繁琐的findViewById(),类型安全且编译时检查。对比DataBinding:ViewBinding仅处理视图引用,无数据绑定功能。DataBinding支持双向数据绑定,</div>
                    </li>
                    <li><a href="/article/1943968314044772352.htm"
                           title="Python多版本管理与pip升级全攻略:解决冲突与高效实践" target="_blank">Python多版本管理与pip升级全攻略:解决冲突与高效实践</a>
                        <span class="text-muted">码界奇点</span>
<a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/pip/1.htm">pip</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/python3.11/1.htm">python3.11</a><a class="tag" taget="_blank" href="/search/%E6%BA%90%E4%BB%A3%E7%A0%81%E7%AE%A1%E7%90%86/1.htm">源代码管理</a><a class="tag" taget="_blank" href="/search/%E8%99%9A%E6%8B%9F%E7%8E%B0%E5%AE%9E/1.htm">虚拟现实</a><a class="tag" taget="_blank" href="/search/%E4%BE%9D%E8%B5%96%E5%80%92%E7%BD%AE%E5%8E%9F%E5%88%99/1.htm">依赖倒置原则</a>
                        <div>引言Python作为最流行的编程语言之一,其版本迭代速度与生态碎片化给开发者带来了巨大挑战。据统计,超过60%的Python开发者需要同时维护基于Python3.6+和Python2.7的项目。本文将系统解决以下核心痛点:如何安全地在同一台机器上管理多个Python版本pip依赖冲突的根治方案符合PEP标准的生产环境最佳实践第一部分:Python多版本管理核心方案1.1系统级多版本共存方案Wind</div>
                    </li>
                    <li><a href="/article/1943968187112550400.htm"
                           title="OpenWebUI(12)源码学习-后端constants.py常量定义文件" target="_blank">OpenWebUI(12)源码学习-后端constants.py常量定义文件</a>
                        <span class="text-muted">青苔猿猿</span>
<a class="tag" taget="_blank" href="/search/AI%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">AI大模型</a><a class="tag" taget="_blank" href="/search/openwebui/1.htm">openwebui</a><a class="tag" taget="_blank" href="/search/constants%E5%B8%B8%E9%87%8F%E5%AE%9A%E4%B9%89/1.htm">constants常量定义</a>
                        <div>目录文件名:`constants.py`功能概述:主要功能点详解1.**MESSAGES枚举类**2.**WEBHOOK_MESSAGES枚举类**3.**ERROR_MESSAGES枚举类**✅默认错误模板✅认证与用户相关错误✅资源冲突与重复错误✅验证失败类错误✅权限限制类错误✅文件上传与格式错误✅模型与API错误✅请求频率与安全限制✅数据库与配置错误4.**TASKS枚举类**✅总结实际应用场</div>
                    </li>
                    <li><a href="/article/1943968187645227008.htm"
                           title="Kafka系列之:Dead Letter Queue死信队列DLQ" target="_blank">Kafka系列之:Dead Letter Queue死信队列DLQ</a>
                        <span class="text-muted">快乐骑行^_^</span>
<a class="tag" taget="_blank" href="/search/Kafka/1.htm">Kafka</a><a class="tag" taget="_blank" href="/search/Kafka%E7%B3%BB%E5%88%97/1.htm">Kafka系列</a><a class="tag" taget="_blank" href="/search/Dead/1.htm">Dead</a><a class="tag" taget="_blank" href="/search/Letter/1.htm">Letter</a><a class="tag" taget="_blank" href="/search/Queue/1.htm">Queue</a><a class="tag" taget="_blank" href="/search/%E6%AD%BB%E4%BF%A1%E9%98%9F%E5%88%97/1.htm">死信队列</a><a class="tag" taget="_blank" href="/search/DLQ/1.htm">DLQ</a>
                        <div>Kafka系列之:DeadLetterQueue死信队列DLQ一、死信队列二、参数errors.tolerance三、创建死信队列主题四、在启用安全性的情况下使用死信队列更多内容请阅读博主这篇博客:Kafka系列之:KafkaConnect深入探讨-错误处理和死信队列一、死信队列死信队列(DLQ)仅适用于接收器连接器。当一条记录以JSON格式到达接收器连接器时,但接收器连接器配置期望另一种格式,如</div>
                    </li>
                    <li><a href="/article/1943964028313333760.htm"
                           title="小林渗透入门:burpsuite+proxifier抓取小程序流量" target="_blank">小林渗透入门:burpsuite+proxifier抓取小程序流量</a>
                        <span class="text-muted">ξ流ぁ星ぷ132</span>
<a class="tag" taget="_blank" href="/search/%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">小程序</a><a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8%E6%80%A7%E6%B5%8B%E8%AF%95/1.htm">安全性测试</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a>
                        <div>目录前提:代理:proxifier:步骤:bp证书安装bp设置代理端口:proxifier设置规则:proxifier应用规则:结果:前提:在介绍这两个工具具体实现方法之前,有个很重要的技术必须要大概了解才行---代理。代理:个人觉得代理,简而言之,就是在你和服务器中间的一个中间人,来转达信息。那为什么要代理呢,因为这里的burpsuite要抓包,burpsuite只有做为中间代理人才可以进行拦截</div>
                    </li>
                    <li><a href="/article/1943963649831923712.htm"
                           title="玩转Docker | 使用Docker部署gopeed下载工具" target="_blank">玩转Docker | 使用Docker部署gopeed下载工具</a>
                        <span class="text-muted">心随_风动</span>
<a class="tag" taget="_blank" href="/search/%E7%8E%A9%E8%BD%ACDocker/1.htm">玩转Docker</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>玩转Docker|使用Docker部署gopeed下载工具前言一、gopeed介绍Gopeed简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署gopeed服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问gopeed应用五、测试与下载六、总结前言在当今信息爆炸的时代,高效地获取和管理网络资源变得尤为重要。无论是下载大型文件还是进行日常的数据传输,一个稳</div>
                    </li>
                    <li><a href="/article/1943961756602789888.htm"
                           title="零信任落地难题:安全性与用户体验如何两全?" target="_blank">零信任落地难题:安全性与用户体验如何两全?</a>
                        <span class="text-muted">粤海科技君</span>
<a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/%E9%9B%B6%E4%BF%A1%E4%BB%BB/1.htm">零信任</a><a class="tag" taget="_blank" href="/search/%E7%BB%88%E7%AB%AF%E5%AE%89%E5%85%A8/1.htm">终端安全</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a><a class="tag" taget="_blank" href="/search/iOA/1.htm">iOA</a>
                        <div>在零信任架构的实施过程中,平衡安全性与用户体验是企业数字化转型的核心命题。这一挑战的本质在于:既要通过「永不信任,持续验证」的安全机制抵御新型攻击,又要避免过度验证导致的效率损耗。一、矛盾根源:安全与体验的天然张力零信任的“永不信任”原则,本质上要求对每一次访问都进行动态评估,但这与用户对“便捷、流畅”的诉求存在天然冲突。例如:频繁的身份验证(如每次登录都需短信验证码)会打断工作节奏,某制造企业统</div>
                    </li>
                    <li><a href="/article/1943959738240790528.htm"
                           title="等保测评中的物联网设备安全评估" target="_blank">等保测评中的物联网设备安全评估</a>
                        <span class="text-muted">亿林数据</span>
<a class="tag" taget="_blank" href="/search/%E7%89%A9%E8%81%94%E7%BD%91/1.htm">物联网</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a><a class="tag" taget="_blank" href="/search/%E7%AD%89%E4%BF%9D%E6%B5%8B%E8%AF%84/1.htm">等保测评</a>
                        <div>随着物联网(IoT)技术的飞速发展,物联网设备已经广泛应用于智能家居、智慧城市、工业自动化等多个领域,极大地提升了社会生产力和生活便利性。然而,随着IoT设备数量的激增,其安全性问题也日益凸显,成为我们必须面对的重要课题。在这一背景下,等级保护(等保)测评中的物联网设备安全评估显得尤为重要,它为我们提供了一个有效的安全评估和管理机制。一、物联网设备安全评估的重要性物联网设备的核心理念是实现物物相连</div>
                    </li>
                    <li><a href="/article/1943958981944864768.htm"
                           title="传统检测响应慢?陌讯多模态引擎提速90+FPS实战" target="_blank">传统检测响应慢?陌讯多模态引擎提速90+FPS实战</a>
                        <span class="text-muted">2501_92473147</span>
<a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/1.htm">计算机视觉</a><a class="tag" taget="_blank" href="/search/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/1.htm">目标检测</a>
                        <div>开篇痛点:实时目标检测在安防监控中的核心挑战在安防监控领域,实时目标检测是保障公共安全的关键技术。然而,传统算法如YOLOv5或开源框架MMDetection常面临两大痛点:误报率高(复杂光照或遮挡场景下检测不稳定)和响应延迟(高分辨率视频流处理FPS低于30)。实测数据显示,城市交通监控系统误报率达15%,导致安保资源浪费;客户反馈表明,延迟超100ms时,目标跟踪可能失效。这些问题源于算法泛化</div>
                    </li>
                    <li><a href="/article/1943958982632730624.htm"
                           title="反光衣识别漏检率 30%?陌讯多尺度模型实测优化" target="_blank">反光衣识别漏检率 30%?陌讯多尺度模型实测优化</a>
                        <span class="text-muted"></span>

                        <div>在建筑工地、交通指挥等场景中,反光衣是保障作业人员安全的重要装备,对其进行精准识别是智能监控系统的核心功能之一。但传统视觉算法在实际应用中却屡屡碰壁:强光下反光衣易与背景混淆、远距离小目标漏检率高达30%、复杂场景下模型泛化能力不足[实测数据来源:某智慧工地项目2024年Q1日志]。这些问题直接导致安全监控系统预警滞后,给安全生产埋下隐患。一、技术解析:反光衣识别的核心难点与陌讯算法创新反光衣识别</div>
                    </li>
                    <li><a href="/article/1943949028848889856.htm"
                           title="系统迁移从CentOS7.9到Rocky8.9" target="_blank">系统迁移从CentOS7.9到Rocky8.9</a>
                        <span class="text-muted"></span>

                        <div>我有两台阿里云上的服务器是CentOS7.9,由于CentOS7已经停止支持,后续使用的话会有安全漏洞,所以需要尽快迁移,个人使用的话目前兼容性好的还是RockyLinux8,很多脚本改改就能用了。一、盘点系统和迁移应用查看当前系统发行版版本cat/etc/os-release盘点迁移清单服务器应用部署方式docker镜像来源v1wordpressdockerdockerhubv1zdirdock</div>
                    </li>
                    <li><a href="/article/1943936553428512768.htm"
                           title=".NET中的强名称和签名机制" target="_blank">.NET中的强名称和签名机制</a>
                        <span class="text-muted"></span>

                        <div>.NET中的强名称(StrongName)和签名机制是.NETFramework引入的一种安全性和版本控制机制。以下是关于.NET中强名称和签名机制的详细解释:强名称定义:强名称是由程序集的标识加上公钥和数字签名组成的。程序集的标识包括简单文本名称、版本号和区域性信息(如果提供的话)。作用:强名称主要用于确保程序集的唯一性和完整性。通过签发具有强名称的程序集,可以确保名称的全局唯一性,防止名称冲突</div>
                    </li>
                    <li><a href="/article/1943930501668597760.htm"
                           title=".NET中的安全性之数字签名、数字证书、强签名程序集、反编译" target="_blank">.NET中的安全性之数字签名、数字证书、强签名程序集、反编译</a>
                        <span class="text-muted">hezudao25</span>
<a class="tag" taget="_blank" href="/search/NET/1.htm">NET</a><a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/assembly/1.htm">assembly</a><a class="tag" taget="_blank" href="/search/%E5%8A%A0%E5%AF%86/1.htm">加密</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/reference/1.htm">reference</a><a class="tag" taget="_blank" href="/search/header/1.htm">header</a>
                        <div>本文将探讨数字签名、数字证书、强签名程序集、反编译等以及它们在.NET中的运用(一些概念并不局限于.NET在其它技术、平台中也存在)。1.数字签名数字签名又称为公钥数字签名,或者电子签章等,它借助公钥加密技术实现。数字签名技术主要涉及公钥、私钥、非对称加密算法。1.1公钥与私钥公钥是公开的钥匙,私钥则是与公钥匹配的严格保护的私有密钥;私钥加密的信息只有公钥可以解开,反之亦然。在VisualStud</div>
                    </li>
                    <li><a href="/article/1943929866940379136.htm"
                           title=".NET 一款基于BGInfo的红队内网渗透工具" target="_blank">.NET 一款基于BGInfo的红队内网渗透工具</a>
                        <span class="text-muted">dot.Net安全矩阵</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/.netcore/1.htm">.netcore</a><a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a><a class="tag" taget="_blank" href="/search/%E7%9F%A9%E9%98%B5/1.htm">矩阵</a>
                        <div>01阅读须知此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他方面02基本介绍在内网渗透过程中,白名单绕过是红队常见的技术需求。Sharp4Bginfo.exe是一款基于微软签名工具</div>
                    </li>
                    <li><a href="/article/1943929614720102400.htm"
                           title="程序员必看!如何破解数据篡改与逆向工程的双重困境" target="_blank">程序员必看!如何破解数据篡改与逆向工程的双重困境</a>
                        <span class="text-muted">深盾科技</span>
<a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98%E5%88%9B%E5%AF%8C/1.htm">程序员创富</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a>
                        <div>作为一名程序员,你是否曾遇到过这样的噩梦?辛苦开发的程序,数据被篡改,代码被轻易破解,所有的努力瞬间化为泡影!别怕,今天就来教你如何绝地反击,让黑客们望而却步!数据篡改:黑客的“拿手好戏”在程序开发中,数据安全性是重中之重。然而,黑客们却总能找到漏洞,篡改传输中的数据,导致程序运行出错,甚至引发严重的安全问题。那么,如何才能防止数据被篡改呢?数字签名:数据安全的“守护神”数字签名是一种基于密码学的</div>
                    </li>
                    <li><a href="/article/1943929487947264000.htm"
                           title="如何为加壳保护后的程序提供调试支持" target="_blank">如何为加壳保护后的程序提供调试支持</a>
                        <span class="text-muted">深盾科技</span>
<a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>在软件开发领域,加壳保护是一种常见的安全手段,用于防止程序被逆向分析。然而,当程序崩溃时,开发人员需要定位原始错误位置,这就与加壳保护产生了天然的矛盾。本文将从加壳原理出发,为大家介绍兼容调试的解决方案。一、加壳的基本功能1.加密/压缩加壳最常见的功能就是对程序的整个代码段和数据段进行压缩或加密。这样做的目的是防止静态反编译,但在程序运行过程中,代码段和数据段是明文状态,所以不会对调试造成影响。2</div>
                    </li>
                    <li><a href="/article/1943929488433803264.htm"
                           title=".NET nupkg包的深度解析与安全防护指南" target="_blank">.NET nupkg包的深度解析与安全防护指南</a>
                        <span class="text-muted">深盾科技</span>
<a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a>
                        <div>在.NET开发领域,nupkg包是开发者们不可或缺的工具。它不仅是代码分发和资源共享的核心载体,还贯穿了开发、构建、部署的全流程。今天,我们将深入探讨nupkg包的核心功能、打包发布流程以及安全防护措施,帮助你在.NET开发中更加得心应手。nupkg包的核心功能nupkg是NuGet包的文件格式,本质上是一个ZIP压缩包,包含编译后的程序集(.dll文件)、调试符号(.pdb文件)、描述文件(.n</div>
                    </li>
                    <li><a href="/article/1943927347526823936.htm"
                           title="HashMap的Get(),Put()源码解析" target="_blank">HashMap的Get(),Put()源码解析</a>
                        <span class="text-muted">Ttang23</span>
<a class="tag" taget="_blank" href="/search/%E5%93%88%E5%B8%8C%E7%AE%97%E6%B3%95/1.htm">哈希算法</a><a class="tag" taget="_blank" href="/search/%E6%95%A3%E5%88%97%E8%A1%A8/1.htm">散列表</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a>
                        <div>1、什么是HashMap?HashMap是Java中用于存储键值对(Key-Value)的集合类,它实现了Map接口。其核心特点是:无序性:不保证元素的存储顺序,也不保证顺序恒定不变。唯一性:键(Key)不能重复,若插入重复键会覆盖原有值。允许null:允许一个null键和任意数量的null值。非线程安全:相比HashTable,HashMap不支持同步,性能更高。2.核心数据结构:哈希表(Has</div>
                    </li>
                    <li><a href="/article/1943926592141062144.htm"
                           title="Flutter——数据库Drift开发详细教程之迁移(九)" target="_blank">Flutter——数据库Drift开发详细教程之迁移(九)</a>
                        <span class="text-muted">怀君</span>
<a class="tag" taget="_blank" href="/search/flutter/1.htm">flutter</a><a class="tag" taget="_blank" href="/search/flutter/1.htm">flutter</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>迁移入门引导式迁移配置用法例子切换到make-migrations开发过程中手动迁移迁移后回调导出模式导出架构下一步是什么?调试导出架构的问题修复这个问题架构迁移助手自定义分步迁移转向逐步迁移手动生成测试迁移编写测试验证数据完整性在运行时验证数据库模式迁移器API一般提示迁移视图、触发器和索引复杂的迁移更改列的类型更改列约束删除列重命名列合并列添加新列入门Drift通过严格的架构确保查询类型安全。</div>
                    </li>
                    <li><a href="/article/1943926212090982400.htm"
                           title=".NET 程序的强名称签名与安全防护技术干货" target="_blank">.NET 程序的强名称签名与安全防护技术干货</a>
                        <span class="text-muted">深盾科技</span>
<a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a>
                        <div>在.NET开发领域,保障程序的安全性和完整性至关重要。强名称签名和有效的安全防护措施是实现这一目标的关键手段。下面将详细介绍.NET程序的强名称签名以及相关的安全防护方法。一、什么是强名称签名强名称签名是.NET框架提供的一种安全机制,其主要作用是唯一标识程序集、验证程序集的完整性以及解决版本冲突问题。它本质上是通过加密技术为程序集创建数字签名,确保程序集在分发和运行过程中的安全性。二、签名文件要</div>
                    </li>
                    <li><a href="/article/1943921676257390592.htm"
                           title="iOS 多个线程对数组操作(遍历,插入,删除),实现一个线程安全的NSMutabeArray" target="_blank">iOS 多个线程对数组操作(遍历,插入,删除),实现一个线程安全的NSMutabeArray</a>
                        <span class="text-muted"></span>

                        <div>//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄一、概念1.含义:@synchronized(self){}//这个其实就是一个加锁。如果self其他线程访问,则会阻塞。这样做一般是用来对单2.重写构造方法@interfaceSHSafetyArray:NSObject{@privateNSMutableArray*_mutableArray;//声明数组}//遍历加锁-(void)m</div>
                    </li>
                    <li><a href="/article/1943920035919622144.htm"
                           title="2025年渗透测试面试题总结-2025年HW(护网面试) 43(题目+回答)" target="_blank">2025年渗透测试面试题总结-2025年HW(护网面试) 43(题目+回答)</a>
                        <span class="text-muted">独行soc</span>
<a class="tag" taget="_blank" href="/search/2025%E5%B9%B4%E6%8A%A4%E7%BD%91/1.htm">2025年护网</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E8%81%8C%E5%9C%BA%E5%92%8C%E5%8F%91%E5%B1%95/1.htm">职场和发展</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E7%A7%91%E6%8A%80/1.htm">科技</a><a class="tag" taget="_blank" href="/search/%E6%B8%97%E9%80%8F%E6%B5%8B%E8%AF%95/1.htm">渗透测试</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a><a class="tag" taget="_blank" href="/search/%E6%8A%A4%E7%BD%91/1.htm">护网</a>
                        <div>安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。目录2025年HW(护网面试)431.自我介绍与职业规划2.Webshell源码级检测方案3.2025年新型Web漏洞TOP54.渗透中的高价值攻击点5.智能Fuzz平台架构设计6.堆栈溢出攻防演进7.插桩技术实战应用8.二进制安全能力矩阵9.C语言内存管理精要10.Pyth</div>
                    </li>
                    <li><a href="/article/1943919531676200960.htm"
                           title="iOS线程安全数组" target="_blank">iOS线程安全数组</a>
                        <span class="text-muted"></span>

                        <div>iOS-SDK只提供了非线程安全的数组。如果要多线程并发的使用一个数组对象就必须要加锁,平凡的加锁使得代码的调用非常的麻烦。我们需要多线程的读写锁在类的内部实现,所以需要对NSMutableArray进行封装,封装后的对象负责接受所有事件并将其转发给真正的NSMutableArrayiOS-SDK只提供了非线程安全的数组。如果要多线程并发的使用一个数组对象就必须要加锁,平凡的加锁使得代码的调用非常</div>
                    </li>
                    <li><a href="/article/1943913603195269120.htm"
                           title="【个人笔记】负载均衡" target="_blank">【个人笔记】负载均衡</a>
                        <span class="text-muted">撰卢</span>
<a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/1.htm">负载均衡</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>文章目录nginx反向代理的好处负载均衡负载均很的配置方式均衡负载的方式nginx反向代理的好处提高访问速度进行负载均衡保证后端服务安全负载均衡负载均衡,就是把大量的请求按照我们指定的方式均衡的分配给集群中的每台服务器负载均很的配置方式upstreamwebservers{server192.168.100.128:8080server192.168.100.129:8080}server{lis</div>
                    </li>
                    <li><a href="/article/1943898986985353216.htm"
                           title="不同行业的 AI 数据安全与合规实践:7 大核心要点全解析" target="_blank">不同行业的 AI 数据安全与合规实践:7 大核心要点全解析</a>
                        <span class="text-muted">观熵</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/DeepSeek/1.htm">DeepSeek</a><a class="tag" taget="_blank" href="/search/%E7%A7%81%E6%9C%89%E5%8C%96%E9%83%A8%E7%BD%B2/1.htm">私有化部署</a>
                        <div>不同行业的AI数据安全与合规实践:7大核心要点全解析关键词AI数据安全、行业合规、私有化部署、数据分类分级、国产大模型、隐私保护、DeepSeek部署摘要随着国产大模型在金融、医疗、政务、教育等关键领域的深入部署,AI系统对数据安全与行业合规提出了更高要求。本文结合DeepSeek私有化部署实战,系统梳理当前各行业主流的数据安全合规标准与落地策略,从数据分类分级、访问控制、审计追踪到敏感信息识别与</div>
                    </li>
                    <li><a href="/article/1943888397881896960.htm"
                           title="计算机科学与技术" target="_blank">计算机科学与技术</a>
                        <span class="text-muted">柳依依@</span>
<a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/c4%E5%89%8D%E7%AB%AF/1.htm">c4前端</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>计算机科学是一个庞大且关联性强的学科体系,初学者常面临以下痛点:-**知识点零散**:容易陷入"只见树木不见森林"的学习困境-**方向不明确**:面对海量技术栈不知从何入手-**体系缺失**:难以建立完整的知识网络1.计算机基础-计算机组成原理-冯·诺依曼体系-CPU/内存/IO设备-操作系统-进程与线程-内存管理-文件系统-计算机网络-TCP/IP模型-HTTP/HTTPS-网络安全2.编程能力</div>
                    </li>
                                <li><a href="/article/91.htm"
                                       title="java解析APK" target="_blank">java解析APK</a>
                                    <span class="text-muted">3213213333332132</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/apk/1.htm">apk</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%A7%A3%E6%9E%90APK/1.htm">解析APK</a>
                                    <div>解析apk有两种方法 
1、结合安卓提供apktool工具,用java执行cmd解析命令获取apk信息 
2、利用相关jar包里的集成方法解析apk 
 
这里只给出第二种方法,因为第一种方法在linux服务器下会出现不在控制范围之内的结果。 
 
 

public class ApkUtil
{
	/**
	 * 日志对象
	 */
	private static Logger	 </div>
                                </li>
                                <li><a href="/article/218.htm"
                                       title="nginx自定义ip访问N种方法" target="_blank">nginx自定义ip访问N种方法</a>
                                    <span class="text-muted">ronin47</span>
<a class="tag" taget="_blank" href="/search/nginx+%E7%A6%81%E6%AD%A2ip%E8%AE%BF%E9%97%AE/1.htm">nginx 禁止ip访问</a>
                                    <div>   因业务需要,禁止一部分内网访问接口, 由于前端架了F5,直接用deny或allow是不行的,这是因为直接获取的前端F5的地址。 
   所以开始思考有哪些主案可以实现这样的需求,目前可实施的是三种: 
   一:把ip段放在redis里,写一段lua 
          二:利用geo传递变量,写一段</div>
                                </li>
                                <li><a href="/article/345.htm"
                                       title="mysql timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性" target="_blank">mysql timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a>
                                    <div>timestamp有两个属性,分别是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP两种,使用情况分别如下: 
  
1. 
  
CURRENT_TIMESTAMP  
  
当要向数据库执行insert操作时,如果有个timestamp字段属性设为 
  
CURRENT_TIMESTAMP,则无论这</div>
                                </li>
                                <li><a href="/article/472.htm"
                                       title="struts2+spring+hibernate分页显示" target="_blank">struts2+spring+hibernate分页显示</a>
                                    <span class="text-muted">171815164</span>
<a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a>
                                    <div>分页显示一直是web开发中一大烦琐的难题,传统的网页设计只在一个JSP或者ASP页面中书写所有关于数据库操作的代码,那样做分页可能简单一点,但当把网站分层开发后,分页就比较困难了,下面是我做Spring+Hibernate+Struts2项目时设计的分页代码,与大家分享交流。 
 
  1、DAO层接口的设计,在MemberDao接口中定义了如下两个方法: 
 
 
 
 
 
public in</div>
                                </li>
                                <li><a href="/article/599.htm"
                                       title="构建自己的Wrapper应用" target="_blank">构建自己的Wrapper应用</a>
                                    <span class="text-muted">g21121</span>
<a class="tag" taget="_blank" href="/search/rap/1.htm">rap</a>
                                    <div>        我们已经了解Wrapper的目录结构,下面可是正式利用Wrapper来包装我们自己的应用,这里假设Wrapper的安装目录为:/usr/local/wrapper。 
  
        首先,创建项目应用 
  
&nb</div>
                                </li>
                                <li><a href="/article/726.htm"
                                       title="[简单]工作记录_多线程相关" target="_blank">[简单]工作记录_多线程相关</a>
                                    <span class="text-muted">53873039oycg</span>
<a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a>
                                    <div>     最近遇到多线程的问题,原来使用异步请求多个接口(n*3次请求)     方案一 使用多线程一次返回数据,最开始是使用5个线程,一个线程顺序请求3个接口,超时终止返回     缺点       测试发现必须3个接</div>
                                </li>
                                <li><a href="/article/853.htm"
                                       title="调试jdk中的源码,查看jdk局部变量" target="_blank">调试jdk中的源码,查看jdk局部变量</a>
                                    <span class="text-muted">程序员是怎么炼成的</span>
<a class="tag" taget="_blank" href="/search/jdk+%E6%BA%90%E7%A0%81/1.htm">jdk 源码</a>
                                    <div>转自:http://www.douban.com/note/211369821/ 
  
 学习jdk源码时使用-- 
    学习java最好的办法就是看jdk源代码,面对浩瀚的jdk(光源码就有40M多,比一个大型网站的源码都多)从何入手呢,要是能单步调试跟进到jdk源码里并且能查看其中的局部变量最好了。 
 
可惜的是sun提供的jdk并不能查看运行中的局部变量</div>
                                </li>
                                <li><a href="/article/980.htm"
                                       title="Oracle RAC Failover 详解" target="_blank">Oracle RAC Failover 详解</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a>
                                    <div>Oracle RAC 同时具备HA(High Availiablity) 和LB(LoadBalance). 而其高可用性的基础就是Failover(故障转移). 它指集群中任何一个节点的故障都不会影响用户的使用,连接到故障节点的用户会被自动转移到健康节点,从用户感受而言, 是感觉不到这种切换。 
 
 Oracle 10g RAC 的Failover 可以分为3种: 
 1. Client-Si</div>
                                </li>
                                <li><a href="/article/1107.htm"
                                       title="form表单提交数据编码方式及tomcat的接受编码方式" target="_blank">form表单提交数据编码方式及tomcat的接受编码方式</a>
                                    <span class="text-muted">antonyup_2006</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/%E6%B5%8F%E8%A7%88%E5%99%A8/1.htm">浏览器</a><a class="tag" taget="_blank" href="/search/%E4%BA%92%E8%81%94%E7%BD%91/1.htm">互联网</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a>
                                    <div>原帖地址:http://www.iteye.com/topic/266705 
 
form有2中方法把数据提交给服务器,get和post,分别说下吧。 
(一)get提交 
1.首先说下客户端(浏览器)的form表单用get方法是如何将数据编码后提交给服务器端的吧。 
   
对于get方法来说,都是把数据串联在请求的url后面作为参数,如:http://localhost:</div>
                                </li>
                                <li><a href="/article/1234.htm"
                                       title="JS初学者必知的基础" target="_blank">JS初学者必知的基础</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/js%E5%87%BD%E6%95%B0/1.htm">js函数</a><a class="tag" taget="_blank" href="/search/js%E5%85%A5%E9%97%A8%E5%9F%BA%E7%A1%80/1.htm">js入门基础</a>
                                    <div>JavaScript是网页的交互语言,实现网页的各种效果, 
JavaScript 是世界上最流行的脚本语言。

JavaScript 是属于 web 的语言,它适用于 PC、笔记本电脑、平板电脑和移动电话。

JavaScript 被设计为向 HTML 页面增加交互性。

许多 HTML 开发者都不是程序员,但是 JavaScript 却拥有非常简单的语法。几乎每个人都有能力将小的 </div>
                                </li>
                                <li><a href="/article/1361.htm"
                                       title="iBatis的分页分析与详解" target="_blank">iBatis的分页分析与详解</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/ibatis/1.htm">ibatis</a>
                                    <div>        分页是操作数据库型系统常遇到的问题。分页实现方法很多,但效率的差异就很大了。iBatis是通过什么方式来实现这个分页的了。查看它的实现部分,发现返回的PaginatedList实际上是个接口,实现这个接口的是PaginatedDataList类的对象,查看PaginatedDataList类发现,每次翻页的时候最</div>
                                </li>
                                <li><a href="/article/1488.htm"
                                       title="精通Oracle10编程SQL(15)使用对象类型" target="_blank">精通Oracle10编程SQL(15)使用对象类型</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/plsql/1.htm">plsql</a>
                                    <div>/*
 *使用对象类型
 */
--建立和使用简单对象类型
--对象类型包括对象类型规范和对象类型体两部分。
--建立和使用不包含任何方法的对象类型
CREATE OR REPLACE TYPE person_typ1 as OBJECT(
  name varchar2(10),gender varchar2(4),birthdate date
);

drop type p</div>
                                </li>
                                <li><a href="/article/1615.htm"
                                       title="【Linux命令二】文本处理命令awk" target="_blank">【Linux命令二】文本处理命令awk</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/linux%E5%91%BD%E4%BB%A4/1.htm">linux命令</a>
                                    <div>awk是Linux用来进行文本处理的命令,在日常工作中,广泛应用于日志分析。awk是一门解释型编程语言,包含变量,数组,循环控制结构,条件控制结构等。它的语法采用类C语言的语法。 
  awk命令用来做什么? 
1.awk适用于具有一定结构的文本行,对其中的列进行提取信息 
2.awk可以把当前正在处理的文本行提交给Linux的其它命令处理,然后把直接结构返回给awk 
3.awk实际工</div>
                                </li>
                                <li><a href="/article/1742.htm"
                                       title="JAVA(ssh2框架)+Flex实现权限控制方案分析" target="_blank">JAVA(ssh2框架)+Flex实现权限控制方案分析</a>
                                    <span class="text-muted">白糖_</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>  
目前项目使用的是Struts2+Hibernate+Spring的架构模式,目前已经有一套针对SSH2的权限系统,运行良好。但是项目有了新需求:在目前系统的基础上使用Flex逐步取代JSP,在取代JSP过程中可能存在Flex与JSP并存的情况,所以权限系统需要进行修改。 
【SSH2权限系统的实现机制】 
权限控制分为页面和后台两块:不同类型用户的帐号分配的访问权限是不同的,用户使</div>
                                </li>
                                <li><a href="/article/1869.htm"
                                       title="angular.forEach" target="_blank">angular.forEach</a>
                                    <span class="text-muted">boyitech</span>
<a class="tag" taget="_blank" href="/search/AngularJS/1.htm">AngularJS</a><a class="tag" taget="_blank" href="/search/AngularJS+API/1.htm">AngularJS API</a><a class="tag" taget="_blank" href="/search/angular.forEach/1.htm">angular.forEach</a>
                                    <div>angular.forEach   描述:   循环对obj对象的每个元素调用iterator, obj对象可以是一个Object或一个Array. Iterator函数调用方法: iterator(value, key, obj), 其中obj是被迭代对象,key是obj的property key或者是数组的index,value就是相应的值啦. (此函数不能够迭代继承的属性.)   </div>
                                </li>
                                <li><a href="/article/1996.htm"
                                       title="java-谷歌面试题-给定一个排序数组,如何构造一个二叉排序树" target="_blank">java-谷歌面试题-给定一个排序数组,如何构造一个二叉排序树</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%8C%E5%8F%89%E6%8E%92%E5%BA%8F%E6%A0%91/1.htm">二叉排序树</a>
                                    <div>
import java.util.LinkedList;

public class CreateBSTfromSortedArray {

	/**
	 * 题目:给定一个排序数组,如何构造一个二叉排序树
	 * 递归
	 */

	public static void main(String[] args) {
		int[] data = { 1, 2, 3, 4, </div>
                                </li>
                                <li><a href="/article/2123.htm"
                                       title="action执行2次" target="_blank">action执行2次</a>
                                    <span class="text-muted">Chen.H</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a><a class="tag" taget="_blank" href="/search/XHTML/1.htm">XHTML</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/Webwork/1.htm">Webwork</a>
                                    <div>xwork 写道   <action name="userTypeAction" 
class="com.ekangcount.website.system.view.action.UserTypeAction"> 
<result name="ssss" type="dispatcher"> </div>
                                </li>
                                <li><a href="/article/2250.htm"
                                       title="[时空与能量]逆转时空需要消耗大量能源" target="_blank">[时空与能量]逆转时空需要消耗大量能源</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E8%83%BD%E6%BA%90/1.htm">能源</a>
                                    <div> 
 
        无论如何,人类始终都想摆脱时间和空间的限制....但是受到质量与能量关系的限制,我们人类在目前和今后很长一段时间内,都无法获得大量廉价的能源来进行时空跨越..... 
 
        在进行时空穿梭的实验中,消耗超大规模的能源是必然</div>
                                </li>
                                <li><a href="/article/2377.htm"
                                       title="oracle的正则表达式(regular expression)详细介绍" target="_blank">oracle的正则表达式(regular expression)详细介绍</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a>
                                    <div>    正则表达式是很多编程语言中都有的。可惜oracle8i、oracle9i中一直迟迟不肯加入,好在oracle10g中终于增加了期盼已久的正则表达式功能。你可以在oracle10g中使用正则表达式肆意地匹配你想匹配的任何字符串了。 
正则表达式中常用到的元数据(metacharacter)如下: 
^ 匹配字符串的开头位置。 
$ 匹配支付传的结尾位置。 
* </div>
                                </li>
                                <li><a href="/article/2504.htm"
                                       title="报表工具与报表性能的关系" target="_blank">报表工具与报表性能的关系</a>
                                    <span class="text-muted">datamachine</span>
<a class="tag" taget="_blank" href="/search/%E6%8A%A5%E8%A1%A8%E5%B7%A5%E5%85%B7/1.htm">报表工具</a><a class="tag" taget="_blank" href="/search/birt/1.htm">birt</a><a class="tag" taget="_blank" href="/search/%E6%8A%A5%E8%A1%A8%E6%80%A7%E8%83%BD/1.htm">报表性能</a><a class="tag" taget="_blank" href="/search/%E6%B6%A6%E4%B9%BE%E6%8A%A5%E8%A1%A8/1.htm">润乾报表</a>
                                    <div>在选择报表工具时,性能一直是用户关心的指标,但是,报表工具的性能和整个报表系统的性能有多大关系呢? 
要回答这个问题,首先要分析一下报表的处理过程包含哪些环节,哪些环节容易出现性能瓶颈,如何优化这些环节。 
  
一、报表处理的一般过程分析 
1、用户选择报表输入参数后,报表引擎会根据报表模板和输入参数来解析报表,并将数据计算和读取请求以SQL的方式发送给数据库。 
  
2、</div>
                                </li>
                                <li><a href="/article/2631.htm"
                                       title="初一上学期难记忆单词背诵第一课" target="_blank">初一上学期难记忆单词背诵第一课</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/word/1.htm">word</a><a class="tag" taget="_blank" href="/search/english/1.htm">english</a>
                                    <div>what 什么  
your 你 
name 名字 
my 我的 
am 是 
one 一 
two 二 
three 三 
four 四 
five 五 
class 班级,课 
  
six 六 
seven 七 
eight 八 
nince 九 
ten 十 
zero 零 
how 怎样 
old 老的 
eleven 十一 
twelve 十二 
thirteen </div>
                                </li>
                                <li><a href="/article/2758.htm"
                                       title="我学过和准备学的各种技术" target="_blank">我学过和准备学的各种技术</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/%E6%8A%80%E6%9C%AF/1.htm">技术</a>
                                    <div>语言VB https://msdn.microsoft.com/zh-cn/library/2x7h1hfk.aspxJava http://docs.oracle.com/javase/8/C# https://msdn.microsoft.com/library/vstudioPHP http://php.net/manual/en/Html </div>
                                </li>
                                <li><a href="/article/2885.htm"
                                       title="struts2中token防止重复提交表单" target="_blank">struts2中token防止重复提交表单</a>
                                    <span class="text-muted">蕃薯耀</span>
<a class="tag" taget="_blank" href="/search/%E9%87%8D%E5%A4%8D%E6%8F%90%E4%BA%A4%E8%A1%A8%E5%8D%95/1.htm">重复提交表单</a><a class="tag" taget="_blank" href="/search/struts2%E4%B8%ADtoken/1.htm">struts2中token</a>
                                    <div>struts2中token防止重复提交表单 
  
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
蕃薯耀 2015年7月12日 11:52:32 星期日 
ht</div>
                                </li>
                                <li><a href="/article/3012.htm"
                                       title="线性查找二维数组" target="_blank">线性查找二维数组</a>
                                    <span class="text-muted">hao3100590</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84/1.htm">二维数组</a>
                                    <div>1.算法描述 
  
有序(行有序,列有序,且每行从左至右递增,列从上至下递增)二维数组查找,要求复杂度O(n) 
  
2.使用到的相关知识: 
结构体定义和使用,二维数组传递(http://blog.csdn.net/yzhhmhm/article/details/2045816) 
  
3.使用数组名传递 
这个的不便之处很明显,一旦确定就是不能设置列值 
  
//使</div>
                                </li>
                                <li><a href="/article/3139.htm"
                                       title="spring security 3中推荐使用BCrypt算法加密密码" target="_blank">spring security 3中推荐使用BCrypt算法加密密码</a>
                                    <span class="text-muted">jackyrong</span>
<a class="tag" taget="_blank" href="/search/Spring+Security/1.htm">Spring Security</a>
                                    <div>spring security 3中推荐使用BCrypt算法加密密码了,以前使用的是md5, 
Md5PasswordEncoder 和 ShaPasswordEncoder,现在不推荐了,推荐用bcrpt 
Bcrpt中的salt可以是随机的,比如: 
 
 
 

int i = 0;
	while (i < 10) {
		String password = "1234</div>
                                </li>
                                <li><a href="/article/3266.htm"
                                       title="学习编程并不难,做到以下几点即可!" target="_blank">学习编程并不难,做到以下几点即可!</a>
                                    <span class="text-muted">lampcy</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E8%AF%AD%E8%A8%80/1.htm">编程语言</a>
                                    <div>不论你是想自己设计游戏,还是开发iPhone或安卓手机上的应用,还是仅仅为了娱乐,学习编程语言都是一条必经之路。编程语言种类繁多,用途各 异,然而一旦掌握其中之一,其他的也就迎刃而解。作为初学者,你可能要先从Java或HTML开始学,一旦掌握了一门编程语言,你就发挥无穷的想象,开发 各种神奇的软件啦。 
1、确定目标 
学习编程语言既充满乐趣,又充满挑战。有些花费多年时间学习一门编程语言的大学生到</div>
                                </li>
                                <li><a href="/article/3393.htm"
                                       title="架构师之mysql----------------用group+inner join,left join ,right join 查重复数据(替代in)" target="_blank">架构师之mysql----------------用group+inner join,left join ,right join 查重复数据(替代in)</a>
                                    <span class="text-muted">nannan408</span>
<a class="tag" taget="_blank" href="/search/right+join/1.htm">right join</a>
                                    <div>1.前言。 
  如题。 
2.代码 
(1)单表查重复数据,根据a分组 
  


SELECT m.a,m.b, INNER   JOIN (select a,b,COUNT(*) AS rank FROM test.`A` A   GROUP BY a HAVING rank>1 )k ON m.a=k.a



 
(2)多表查询 , 
 使用改为le</div>
                                </li>
                                <li><a href="/article/3520.htm"
                                       title="jQuery选择器小结 VS 节点查找(附css的一些东西)" target="_blank">jQuery选择器小结 VS 节点查找(附css的一些东西)</a>
                                    <span class="text-muted">Everyday都不同</span>
<a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/name%E9%80%89%E6%8B%A9%E5%99%A8/1.htm">name选择器</a><a class="tag" taget="_blank" href="/search/%E8%BF%BD%E5%8A%A0%E5%85%83%E7%B4%A0/1.htm">追加元素</a><a class="tag" taget="_blank" href="/search/%E6%9F%A5%E6%89%BE%E8%8A%82%E7%82%B9/1.htm">查找节点</a>
                                    <div>最近做前端页面,频繁用到一些jQuery的选择器,所以特意来总结一下: 
  
测试页面: 
<html>
	<head>
		<script src="jquery-1.7.2.min.js"></script>
		<script>
		/*$(function() {
			$(documen</div>
                                </li>
                                <li><a href="/article/3647.htm"
                                       title="关于EXT" target="_blank">关于EXT</a>
                                    <span class="text-muted">tntxia</span>
<a class="tag" taget="_blank" href="/search/ext/1.htm">ext</a>
                                    <div>  
ExtJS是一个很不错的Ajax框架,可以用来开发带有华丽外观的富客户端应用,使得我们的b/s应用更加具有活力及生命力。ExtJS是一个用 javascript编写,与后台技术无关的前端ajax框架。因此,可以把ExtJS用在.Net、Java、Php等各种开发语言开发的应用中。 
  
  
  
ExtJs最开始基于YUI技术,由开发人员Jack </div>
                                </li>
                                <li><a href="/article/3774.htm"
                                       title="一个MIT计算机博士对数学的思考" target="_blank">一个MIT计算机博士对数学的思考</a>
                                    <span class="text-muted">xjnine</span>
<a class="tag" taget="_blank" href="/search/Math/1.htm">Math</a>
                                    <div> 在过去的一年中,我一直在数学的海洋中游荡,research进展不多,对于数学世界的阅历算是有了一些长进。为什么要深入数学的世界?作为计算机的学生,我没有任何企图要成为一个数学家。我学习数学的目的,是要想爬上巨人的肩膀,希望站在更高的高度,能把我自己研究的东西看得更深广一些。说起来,我在刚来这个学校的时候,并没有预料到我将会有一个深入数学的旅程。我的导师最初希望我去做的题目,是对appe</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>