什么是BUG

漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。具体举例来说,比如在Intel Pentium芯片中存在的逻辑错误,在Sendmail早期版本中的编程错误,在NFS协议中认证方式上的弱点,在Unix系统管理员设置匿名Ftp服务时配置不当的问题都可能被攻击者使用,威胁到系统的安全。因而这些都可以认为是系统中存在的安全漏洞。bug狭义的概念是指软件程序漏洞或缺陷,广义的概念还包括测试工程师或用户所发现和提出的软件可更改的细节、或与需求文档存在差异的功能实现等。

简单点说就是 程序不按照你的预期执行,或者程序直接报错了。在每个程序员的职业生涯中都会碰到或多或少的bug,有人写的程序bug就是少,有人写的程序bug就是很多。这是因为每个人的对技术的广度和深度都不同。知道技术的原理写起来代码肯定bug会少些,不懂原理写起来肯定错误百出。但是即便你精通各种技术还是会出现bug,这是不可避免的。

对待BUG的态度

我见过无数程序员一看到程序出错了就很紧张,仿佛报错要他命似的。乱了阵脚,其实报错不可怕,报错都是可以处理的。你看到哪里报错找哪里,找到哪一行想想那一行为啥会报错。直接debug不就可以了。报错没事,心态放平慢慢找,一点一点debug,找到为什么报错就可以了。其实做久了才知道,报错的bug一点都不可怕,不报错的bug才可怕,逻辑完全正确,但就是不按照你预期的走。这种bug往往搞得你怀疑人生。

如何找BUG

找bug的前提是复现问题,很多bug都是在特定的情况下才会出现的,就像我们经常碰到的在自己电脑上没问题在别人电脑上就有问题,或者在外网环境没问题,在内网环境就不行。我们碰到这种情况要第一时间复现问题,如果复现不了问题你肯定解决不了。切记不能自己闷着头瞎调试。你的环境没问题你还在你电脑上调试,能调试出来才怪了。你要去有问题的环境找问题,内网有毛病你就去内网复现问题,复现了再比较和外网有啥区别慢慢解决,切不可产生畏战心理,其实好多问题只要找到根源就豁然开朗了。

一个不太好找的BUG

去年冬天公司安排我去哈尔滨培训,培训前我们把要培训的功能测试了一遍,其他有问题的很快改了,偏偏我就遇到了一个问题,有一个接口请求后台,后台从session里面拿数据,但是后台的session对象一直为null,这就让人很费解。session默认过期时间是30分钟而我一直在请求后台,session是不可能失效的。我在本地怎么测怎么没问题。先说一下我们的环境,开发的时候我们是前端一个项目后端一个项目,前端系统配置菜单,前端直接请求后端拿数据。而我们发布后就成了,前端加页面需要去另一个系统加,另一个系统是一套.net的系统,我们在.net系统里面配置前端页面地址,菜单名,权限等。经常做后台管理系统的同学应该知道一般是上边一栏菜单,左边一栏菜单。中间是功能页面。中间页面是iframe,是一个系统。而我们就不一样了,上边和左边的菜单栏是一个系统,中间的功能页是嵌的我们前端系统的页面地址,中间功能页也是iframe。开始我感觉和这些没问题,既然功能页都是iframe应该没区别。但是我在本地怎么也复现不了。这就很无奈,找bug你一定要找到蛛丝马迹。我就看前端页面发送的请求,看了半天才发现问题。

我们看响应头有一个 Set-Cookie 这里给浏览器了一个Cookie 。看似没啥毛病,但是我发现每一次请求后端都会给浏览器一个key为JSESSIONID的Cookie,而且每次请求时请求头都不会把这个Cookie发送到后台。这就让人很费解。这样我也就明白了为啥后台用Session对象的时候为null了。现在我们就找为啥请求的时候不将Cookie发送给后台,知道了为啥不发送也就知道了问题所在。后台给浏览器Cookie的时候别的都挺正常的但是SameSite=lax这个东西我看不懂。

经过我的百度查到了问题知道了这个属性是啥意思。

简单点来说就是谷歌为了安全性,在浏览器80版本以后就不允许不同站点的原页面和iframe页面请求时发送Cookie,因为我们内网发布的菜单栏和iframe是俩系统也就是俩站点,所以iframe的页面发送的请求都不带着Cookie,自然也就导致后台拿不到Session了。而外网开发环境菜单栏和iframe是一个系统所以iframe页面发送的请求都带着cookie,也就不会导致后台取不到Session了。至此我们发现问题所在。接着想办法解决就可以了。

其实这个BUG将出来看似很简单,其实不然,首先你要复现问题,其次你一定要知道Session和Http协议的工作原理,如果你不懂这俩技术的原理是肯定找不到问题所在的。

系统不存在一会行一会不行

还有一个问题,就是我们一台服务器上部署了两个后台系统,一个是A系统占用80端口,一个是B系统占用8080端口。有些前端页面请求了A系统的后台,有些前端页面请求了B系统的后台。别人给我反映经常丢Session(也就是上面说的后台拿不到Session对象)一会好使一会不好使,好几个人都没找到咋回事,找到我了,其实我也很懵。但是我不认同别人的说法,系统绝对不存在一会可以一会不可以,可以的时候一定有可以的原因,不可以的时候一定有不可以的原因。有因必有果。经过我的测试如果一直使用请求A系统的页面是没问题的,一直使用请求B系统的页面也是可以的。但是打开过请求B系统的页面再打开请求A系统的页面必报错。然后我发现了问题所在,第一次打开请求B系统的页面B系统会响应给浏览器一个key为JSESSIONID的Cookie,因为这个浏览器第一次请求B系统。但是JSESSIONID的Path属性为/ 而且Cookie作用域和端口没关系,如果这时候我们打开请求A系统的页面也会把这个JSESSIONID带过去,而这个值和A系统没关系,A系统也就会重新给浏览器一个JSESSIONID,自然A系统也就拿不到Session了。出现BUG第一步一定是要复现,如果复现不了肯定找不到,其次要找痕迹想办法找到哪里不正常,懂原理。如果我不懂Cookie的作用域和端口没关系肯定找不到原因所在。

如果喜欢本篇文章不妨关注点赞收藏,有什么困惑欢迎评论。

欢迎关注接地气程序员,公众号,掘金,博客园,简书,CSDN同名。

如何正确的找BUG的更多相关文章

  1. 海王星给你好看!FineUI v4.0公测版发布暨《你找BUG我送书》活动开始(活动已结束!)

    <FineUI v4.0 你找BUG我送书>活动已结束,恭喜如下三位网友获得由 FineUI 作者亲自翻译的图书<jQuery实战 第二版>! 奋斗~ 吉吉﹑ purplebo ...

  2. 第二次作业:找Bug

    引子 我真的想了一个小时,上哪里去找bug.我昨天还留意到一个bug,今天就不见了.灵光不断,我想起来了.我就要找大公司的产品的bug... 第一部分 调研, 评测 体验. <腾讯桌球>是 ...

  3. 附加题程序找bug

    private: void Resize(int sz){ ){ return; } if(maxSize != sz){ T *arr = new T[sz]; if(arr == NULL){ r ...

  4. 在无法单步调试的情况下找Bug的技巧

    比如说你有一个大的模块A,其组成部分有B,C,D这3个小的模块,现在A出了一个BUG,因为某种原因的限制你无法单步调试.怎么较快地定位BUG发生的根源? 这里记录一下刚才我在找BUG的时候采用的思路, ...

  5. 找BUG

    找一找BUG 一段代码,实现一个pop,push,和getmin都是O(1)的方法. 最初源代码 伙伴代码如下,代码的地址可以通过这个访问: Ubuntu Pastebin https://paste ...

  6. 判断空间上三个点是否共线问题【找bug篇】

    判断空间上三个点是否在同一直线上[找bug篇] 作者:Vashon 时间:20150601   发布时间:20150718 一.拿到问题,首先分析并理清思路. 判断三点是否在同一条直线上需满足以下几点 ...

  7. 找bug的过程

    关于昨天程序出差我找bug的过程记录 昨天才程序 https://www.cnblogs.com/pythonywy/p/11006273.html ├── xxxx │ ├── src.py │ └ ...

  8. VSCode 在 Vue 导入路径中使用 @ 符号后无法正确跳转 bug

    VSCode 在 Vue 导入路径中使用 @ 符号后无法正确跳转 bug bug jsconfig.json { // This file is required for VSCode to unde ...

  9. 一起找bug

    帮同学找的一个bug,错误代码如下: package dai_test; public class Test1 { public static void main(String[] args) { / ...

随机推荐

  1. Winfrom 中完美设置webbrowser控件内核版本

    前言 .NET 版本更新了一代又一代,winform中的webbrowser控件的IE内核版本却始终用的IE7,好多网站都对IE7已经不支持.webbrowser这个控件就显得有些鸡肋,经过查找大佬门 ...

  2. MySQL高可用架构-MMM、MHA、MGR、PXC

    主从复制如何工作 在主库把数据记录到binlog(二进制日志). 备库开IO线程把binlog复制到自己的relaylog(中继日志). 备库读取中继日志,重放到备库上. 半同步复制 半同步复制可以确 ...

  3. 国庆总结:echarts自定义颜色主题,保证你看的明明白白

    为什么需要使用颜色主题 随着用户审美越来越高,不再是过去那样只注重功能. 所以对界面的颜色样式都具有一定的审美要求 此时颜色是否好看就非常重要了 因为人都是视觉动物 对界面的第一印象肯定都是颜色. 如 ...

  4. 踩坑系列《七》解决VMware安装完成之后,不能联网的问题

    成功安装CentOS 6.5 好之后,它是默认并不能联网,这时候得需要对root用户进行网络设置 1.先登录root账户 2.命令行输入以下命令,修改配置文件 vim /etc/sysconfig/n ...

  5. 极简SpringBoot指南-Chapter05-SpringBoot中的AOP面向切面编程简介

    仓库地址 w4ngzhen/springboot-simple-guide: This is a project that guides SpringBoot users to get started ...

  6. Spring自动装配歧义性笔记

    Spring自动装配歧义性笔记 如果系统中存在两个都实现了同一接口的类,Spring在进行@Autowired自动装配的时候,会选择哪一个?如下: // 一下两个类均被标记为bean @Compone ...

  7. IL合集

    由于之前写的表达式树合集,未编写任何注释且是以图片的形式展现给大家,在这里向各位看官道歉了,接下来为大家奉上新鲜出炉的香喷喷的IL合集,后面会持续更新,各位看官点关注不迷路,之前答应的手写IOC以及多 ...

  8. Linux中的文件使用FTP进行文件备份

    注意!!! 本文是在linux中进行ftp备份(备份到另一个linux服务器) 上传思路: 1.每次上传文件时, 后台接收文件, 使用transferTo上传到Linux服务器 2.把文件路径 + F ...

  9. k8s学习笔记(1)- 简单部署springboot应用

    前言:k8s全称kubernetes,k8s是为容器服务而生的一个可移植容器的编排管理工具,越来越多的公司正在拥抱k8s,并且当前k8s已经主导了云业务流程,关于更多的k8s知识,可自行学习 1.k8 ...

  10. 利用ps在光污染地图上寻找最近的观星地区

    城市灯光对于天文观测和天文摄影是有害的,进行这两类活动之前应提前规划地点,下面是笔者尝试的一种利用ps在光污染地图上进行规划的方法. 目前大部分的光污染地图都是基于WA 2015绘制的,可以结合VII ...