重现你的bug(但是要怎么做?) 接下来在这篇文章里,我将尝试整理大家针对我的关于代码调试的推文发来的各种不同的观点和看法。...我对如何做到这一点有直觉,但是对于怎样才能从“我看到这个bug两次”跨越到“我可以根据需要在笔记本电脑上持续地再现这个bug”这一点,我不知道怎么解释,而且我想知道你用来调试的技术是否依赖于这些不同的开发领域...我花了10分钟试图让它编译,但迄今为止失败了,但它看起来很有趣,我想继续尝试它!! 这里我想重点强调一下:信息是最重要的,你需要做任何必要的事情来获取信息。...每当我的程序有问题并且报告这样的错误信息“Error:无法连接到某个IP的端口443:连接超时”时,我都想说:“谢谢,这就是我想知道的事情”。...结语 当我在谈到代码调试技巧时,我总感觉我遗漏了一件重要的事情,那就是对人们在代码调试中哪里会遇到困难的一种更深入的理解。通常我们很容易说:“好吧,你需要重现这个问题。
重现你的bug(但是要怎么做?) 接下来在这篇文章里,我将尝试整理大家针对我的关于代码调试的推文发来的各种不同的观点和看法。...我对如何做到这一点有直觉,但是对于怎样才能从“我看到这个bug两次”跨越到“我可以根据需要在笔记本电脑上持续地再现这个bug”这一点,我不知道怎么解释,而且我想知道你用来调试的技术是否依赖于这些不同的开发领域...我花了10分钟试图让它编译,但迄今为止失败了,但它看起来很有趣,我想继续尝试它!! 这里我想重点强调一下:信息是最重要的,你需要做任何必要的事情来获取信息。 ?...每当我的程序有问题并且报告这样的错误信息“Error:无法连接到某个IP的端口443:连接超时”时,我都想说:“谢谢,这就是我想知道的事情”。...结束语 当我在谈到代码调试技巧时,我总感觉我遗漏了一件重要的事情,那就是对人们在代码调试中哪里会遇到困难的一种更深入的理解。通常我们很容易说:“好吧,你需要重现这个问题。
它运行良好,但是使用了已弃用的Manifest V2。当我让 Claude 将其更新到 V3 时,我想要绘制一些架构更改图。因此,在这篇文章中,我将回顾一下这个绘图过程。...第二次尝试:Whimsical 的自定义 GPT 当我打开chatgpt.com/gpts时,Whimsical Diagrams 正好作为特色 GPT 出现在那里。...第五次尝试:交给ChatGPT 现在我把不断发展的 Mermaid 代码展示给 ChatGPT,并请求改进建议。它提出一个不错的建议。...虽然我从未使用过 JavaScript MutationObserver,但我现在已经在一个对我来说有意义的上下文中看到了它的应用。当我需要它时,我可能会记住这个例子。...有趣的是,这两种格式都不是它的优势。当我问 ChatGPT 如何渲染表格时,它编写了一个 Python 程序来执行此操作,经过几次迭代后,我得到了一个可用的结果。
4.每一行新代码必须至少执行一次 在你真正完成一个功能之前,你必须对它进行测试。不然,你怎么知道它是不是按照你的想法在执行呢?通常情况下,最好的方法是通过自动测试,但并非总是如此。...故障排除 9.bug总是难免的 我不喜欢那些宣称软件开发可以“一蹴而就”的高谈阔论。不论你再怎么费尽心机,bug总是难免的。最好能够做成可以快速故障排除、修复bug和部署修复的系统。...14.关联时间戳 在故障排除时,事件的时间戳可以作为你的好帮手。寻找偶数增量。例如,如果系统重启了,并且刚刚发出过一个3000毫秒左右的请求,那么可能是触发了某个定时器,才导致出现重启的动作。...当我在重启系统时,如果服务当掉,会发生什么?以此来研究它的工作原理。 20.带着问题睡觉 如果你正在解决一个很难的问题,那么不妨带着问题睡觉。...你可以尝试不同的编程语言和工具,阅读软件开发的书籍,接受MOOC课程。相信我,量变才能达到质的飞跃,这些小小的学习积累,终有一天会大大地提高你的知识和能力。 希望这些经验能对大家有用。
故事的开端是复测的时候,当我用Google浏览器复现CSRF的时候,已经无法复现成功的时候,复测报告对CSRF的漏洞就填写了已修复。然后客户提出了疑问。如下: 既然并没有修复,那为什么复现不了了呢?...和客户同步了相关情况后,客户提出了新的疑问: 这里重新使用Google浏览器进行了测试,打开F12查看数据流观察一下: 这里我们发现,当我们去轻轻的点击了我们构造的测试链接时,浏览器发了四个请求:...最后一次请求用获取的Cookie在次向接口请求,但是请求方法变成了GET,而删除操作的参数是在POST数据包中,并没有提交过来,所以即使接口返回成功,但是并没有删除。...当我正准备提交测试结果,并说明无法复现的时候,老大叫到了我说:“这不是CSRF可以删除吗?你为什么删不掉呢”,我过去瞅了一眼,确实执行并成功删除了,这接口看眼缘?...SameSite 属性有三个值可以设置 Strict Lax None Strict最为严格,完全禁止第三方 Cookie,跨站点时,任何情况下都不会发送 Cookie。
4.每一行新代码必须至少执行一次 在你真正完成一个功能之前,你必须对它进行测试。不然,你怎么知道它是不是按照你的想法在执行呢?通常情况下,最好的方法是通过自动测试,但并非总是如此。...故障排除 9.bug总是难免的 我不喜欢那些宣称软件开发可以“一蹴而就”的高谈阔论。不论你再怎么费尽心机,bug总是难免的。最好能够做成可以快速故障排除、修复bug和部署修复的系统。...14.关联时间戳 在故障排除时,事件的时间戳可以作为你的好帮手。寻找偶数增量。例如,如果系统重启了,并且刚刚发出过一个3000毫秒左右的请求,那么可能是触发了某个定时器,才导致出现重启的动作。...当我在重启系统时,如果服务当掉,会发生什么?以此来研究它的工作原理。 20.带着问题睡觉 如果你正在解决一个很难的问题,那么不妨带着问题睡觉。...你可以尝试不同的编程语言和工具,阅读软件开发的书籍,接受MOOC课程。相信我,量变才能达到质的飞跃,这些小小的学习积累,终有一天会大大地提高你的知识和能力。
可靠性:系统应该准确地处理数据并返回正确的结果。一个可靠的系统不会静默失败或返回不正确的结果或创建损坏的数据。...一个可靠的系统以一种努力避免故障的方式构建,当它不可能时,它会检测、报告,甚至可能尝试自动修复它们。...由于这种性质,我无法深入研究每个主题,而只是提供一个概述。也就是说,在每个主题中,我都尝试添加有用的链接,指向关于该主题的更全面的资源。 所以让我们深入研究吧!...拥抱异步 当我们进行同步调用时,执行路径会被阻塞,直到返回响应。这种阻塞有资源开销,主要是内存和上下文切换的成本。我们不能总是只使用异步调用来设计我们的系统,但是当我们可以让我们的系统更高效时。...当一个依赖不可达时,所有对它的请求都会失败。 根据 Fail Fast 原则,当我们尝试调用时,我们希望我们的系统快速失败,而不是等到超时。
当客户端发送一个包含较大请求体的请求时,它可以先发送请求头部,服务器如果返回 100 Continue 状态码,就表示客户端可以继续发送请求体,这有助于提高网络传输的效率,避免不必要的数据传输。...例如,当我们在浏览器中访问一个网页,服务器成功地找到并返回了页面的 HTML、CSS、JavaScript 等文件时,就会返回 200 OK 状态码。...(三)3xx 重定向类状态码当服务器需要客户端进行进一步的操作才能完成请求时,会返回 3xx 系列的状态码。...还有 304 Not Modified,它比较特殊,当客户端使用条件请求(如 If-Modified-Since 或 If-None-Match 头信息)时,如果服务器发现资源自上次客户端请求后并未发生改变...200 OK 状态码会在响应体中包含请求所对应的资源内容,例如当我们请求一个网页时,服务器返回 200 OK 并在响应体中提供 HTML 页面的代码。
,它通常发生在尝试使用不兼容的类型进行操作时。...特别是,当我们尝试将一个整数与NoneType(即None)进行乘法操作时,就会触发这种错误。 这种错误通常表明代码中的某些部分没有按照预期的方式处理数据类型。...函数返回None:调用的函数可能在某些条件下返回None,而调用者未进行适当的检查。 错误的数据类型转换:在类型转换过程中可能产生了错误,导致期望的整数类型变成了None。...错误的逻辑判断:在条件判断中可能存在逻辑错误,导致在不应该使用None的地方使用了它。...代码审查:定期进行代码审查,以识别和修复可能导致TypeError的潜在问题。
charles 在我眼前没有秘密 程序员喜欢把自己的东西加密加密再加密,而面对别人的东西,总喜欢能够看的一清二楚,然后从中学习一些经验。 比如通过观察别人的app请求流程,可以看一下返回什么样的数据?...有些接口如何组织请求流程等。 要完成上面的任务, charles 真的是不二之选。 ? 截图我是监控到的某电商的请求数据,左边部分显示的是请求接口,右边是响应的结果。...我就通过这款工具学习过如何对api进行版本维护,如何有效组织首页数据的返回(到底是一个接口搞定所有还是多个接口,前端多次调用?) 当然上面仅仅是它的一个作用。...另外一个效果就是,自己的应用出了问题,可以方便的通过它看到请求的数据,以此来进行一些判断,修复bug。特别是强烈推荐测试人员使用,有很多bug是有前后的因果关系,需要看到数据开发人员更容易进行修正。...如果你在开发中被各个第三方支付提供的demo搞得焦头烂额,我相信它能够帮助到你。 ---- 本文写作时间:3小时(这效率……我也是醉了!)
引言 我经常遇到一些开发者,他们对Python的错误处理机制了如指掌,但当我查看他们的代码时,却发现代码质量远远不够。...如果您每次调用函数时都在捕获并忽略所有异常,那么您很可能会错过那些本不应该发生的异常,也就是那些需要修复的bug所导致的异常。...即使你对“先检查再执行”(LBYL)和“请求宽恕比请求许可更容易”(EAFP)了如指掌,并且对try和except的使用烂熟于心,很多时候你可能仍然不确定该怎么做,或者觉得你编写的错误处理代码还有改进的空间...可恢复错误是指处理它的代码可以在继续之前纠正的错误。例如,如果一段代码尝试删除一个文件,却发现文件不存在,这不是什么大问题,它可以选择忽略这个错误并继续执行。...我们现在该怎么办? 答案可能会让你感到惊讶。在这种情况下我们什么都不做! 我之前提到过,不处理错误可以是一种极佳的错误处理策略,这正是我的意思。
17.如果你来到我们公司,你会怎么开展测试工作? 18.你封装了 requests 请求库,发送请求后如何获取相应报文? 接口发生异常你如何去分析定位问题 测试流程如何改进?...自动化和功能测试时并行进行吗?占比多少? 答案 selenium 中 hidden 或者是 display=none 的元素可以定位到,但无法进行交互操作。...针对对接需求和接口规范,需要开发和维护特定的对接逻辑和接口协议,以实现数据交换和流程协同。 内连接(INNER JOIN) 是 SQL 中最简单的连接类型,它只返回两个表中键值匹配的行。...而 外连接 则可以返回在至少一个表中没有对应值的行, 性能测试的数据集是由测试人员根据系统业务场景编写的测试脚本,并通过运行这些脚本,在不同的负载场景下采集到的系统性能数据。...我的劣势则是缺乏项目管理经验,在承担一些复杂项目时可能需要更多的训练和支持。
4.每一行新代码必须至少执行一次 在你真正完成一个功能之前,你必须对它进行测试。不然,你怎么知道它是不是按照你的想法在执行呢?通常情况下,最好的方法是通过自动测试,但并非总是如此。...故障排除 9.bug总是难免的 我不喜欢那些宣称软件开发可以“一蹴而就”的高谈阔论。不论你再怎么费尽心机,bug总是难免的。最好能够做成可以快速故障排除、修复bug和部署修复的系统。...14.关联时间戳 在故障排除时,事件的时间戳可以作为你的好帮手。寻找偶数增量。例如,如果系统重启了,并且刚刚发出过一个3000毫秒左右的请求,那么可能是触发了某个定时器,才导致出现重启的动作。...其他 19.尝试 如果你不知道某种编程语言功能的工作原理,那么不妨写一个小程序来理解它是如何工作的。这同样适用于测试你正在开发的系统。如果我将参数设置为-1,会发生什么?...当我在重启系统时,如果服务当掉,会发生什么?以此来研究它的工作原理。 20.带着问题睡觉 如果你正在解决一个很难的问题,那么不妨带着问题睡觉。
虽然我之前从没听过Oracle Advanced Support,但是当我很快的google完之后,我了解到它似乎是一个允许oracle的技术支持在外部登入,并且在oracle系统环境下进行任何技术支持需要的操作的服务...当我们把”test”加到请求url的末尾,服务器返回了404。同时服务器也返回了这样一个信息:Named SQL not found。如果我们尝试”test”之外的其他字符串,得到了同样的返回信息。...我们把name的值放进先前尝试的GET请求中。 Hey!我们得到一些返回!但是我们少了一个参数,让我们加进来! 虽然没有从服务器获得任何返回,但是也没有返回任何错误!...SQL Execution 这就是createNamedSQL中在包体里面包含一个空json对象的POST请求: 我们得到一个关于SQL_NAME列的错误,当我们在包体中包含空的json对象时这不是很意外...结论 关于这个匿名sql执行我联系了oracle,他们很快的回复并且修复了这个问题。
并没有出现动画,非常生硬的出来了,有一些场景我又要性能,比如初始化不渲染,但是当它出现又要有动画的时候,就有可能使用这行代码 test.onclick = function () {...因为我读取dom的这些特殊属性时,浏览器就会强制清空渲染队列一次,让我拿到最新的值。也就是说读取的时候,其实已经是display为"block"了,因此。我们出现了过渡动画 效果如下所示: ? ?...其实display是不能出现动画的,所以标题+了引号 怎么才能有过渡? 有数字的变化,例如透明度,从0-1....,框架本身要做优化,合并一段时间的数据更新再去真正更新dom,等这些事情都做完了,才能去更新dom节点,然后我们才能看到最新数据对应的节点 当我们真的要去更新dom节点的时候,也存在一个队列。...app.style.display = "block"这行代码时候,dom节点此时并没有更新,js解析引擎是聪明的,它发现你后面马上有代码要修改dom节点,会先存入队列中集中一次性操作 当我们执行了app.offsetHeight
漏洞测试 2019年底的时候,我参与了YouTube的漏洞众测,在此过程中我尝试去测试对他人未授权视频的获取。当用户上传视频到YouTube时,可以对上传视频选择三种隐私权限。...Youtube主站点会对请求中的视频执行权限检查,因此,最后的响应一直返回’This video is private’。 因此,这里需要转变一下思路。...广告制作完成后,我看了一下Google Ads的各种功能,发现它当中的功能非常全面,为此我着重看了一下它其中与YouTube相当的功能。...当我标记视频的时候,从burp抓包流量中发现了以下包含视频ID的请求包: POST /aw_video/_/rpc/VideoMomentService/GetThumbnails HTTP/1.1 Host...果然,让我吃惊的是,这种视频ID替换之后,竟然能成功返回相关视频的base64编码!
众所周知,HTTP请求是无状态的,这意味着当我们发送登录请求时,我们有一个有效的用户名和密码,没有默认机制来知道我与发送下一个请求的是同一个人。...如果我们发送一个包含有效会话的请求(该会话存在于我们的会话存储中 - 在我们的例子中是内存),我们不会在响应中返回 Set-Cookie 标头: 当用户登录时,我们可以将用户信息存储在序列化的 cookie...但是,如果攻击者有自己的有效会话并尝试将其与其他用户关联,该怎么办?在这种情况下,他可以代表受害者采取行动。 当我们没有在登录等操作上生成新的 sessionIds(唯一标识符)时,就会出现问题。...因此,如果攻击者 (Bob) 向 /me 发送请求,他将返回 Joe 的数据: 我们能够通过使用 Bob 的会话来获取 Joe Data。...是的,在 0.6.0 之前的版本中,问题就在那里,Passport 维护者认为会话重新生成应该在应用程序端完成,但一段时间后他们意识到问题的重要性,并在 0.6.0 版本中修复了它。
我们仔细的阅读一下这个简单的缓存资源请求流程,发现其中有几个重要的节点。首先,服务器在返回该资源时,要标记该资源的有效期。...基本上和max-age=0差不多一样的效果,但是含义肯定是不一样的,就看服务器要怎么理解和处理不同的字段。 那么什么时候缓存才能派上用场呢?...当我们点击浏览器的前进后退按钮的时候,就会直接从缓存中获取数据,另外,重定向的时候,也可能会使用到缓存。那这两类操作有啥区别呢。...: 大家还可以自己尝试设置no-store,no-cache等字段。...并且我们还学习了条件请求以及强弱Etag,大家要着重了解下。然后呢,本篇没有问题,但是有个遗留的小例子我没写,就是条件请求的例子。大家可以参照我上面的小例子,试着在这里玩一下条件请求。
从表面上看,这个页面只不过是一个简单的登录页面而已,看起来这个页面貌似是给Google的员工自己准备的… 每当我访问这个页面时,该页面便会直接从https://static.corp.google.com...下面是一张图片样本的URL地址: https://static.corp.google.com/corpsso/images/PICT0004.jpg 好吧…在进行了一堆乱七八糟的尝试之后,我感觉剩下唯一能做的就是去尝试触发一些错误了...只不过我现在仍然不知道这个“SFFE”到底是个什么鬼,但看起来它像是Google后台用于处理Bigtable查询请求的某种请求处理引擎。...,请各位见谅): 这些查询数据中包含表名以及不同Bigtables的路径地址,而正是我的请求让后台服务器返回了这些查询数据。...年2月19日:Google告诉我他们采用了一个临时的修复策略,并忘记给我发送报告了… 2017年3月10日:5000美金到手 2017年3月16日:Google永久修复了该问题
我将描述数据结构,列出你应该实现的所有操作,并给你实现需要通过的单个测试。你应该首先尝试使用此数据结构,然后再观看我的实现和审计视频,以便你了解该过程。 警告 这些都不是数据结构的高效实现。...如果你在行业工作中尝试使用这些数据结构,就会有性能问题。 描述 在面向对象语言(如 Python)中处理许多数据结构时,你需要理解三个常见概念: “节点”,通常是数据结构的容器或存储单元。...测试 我现在要向你提供测试,实现这个类时,你必须使其能够工作。你会看到我已经遍历了每一个操作,并试图覆盖大部分的边界情况,但是当我进行审计时,你会发现实际上我可能错过了一些。...我建议当你尝试在SingleLinkeList中实现一个函数时,首先写一些注释来描述它做了什么,然后填充 Python 代码来使这些注释工作。你会看到我在视频中这样做。...当你花了一两个 45 分钟的会话来 Hack 它并试图让它工作时,现在是观看视频的时候了。你首先需要尝试它,以便更好地了解我正在尝试的事情,这样可以使视频更容易理解。
领取专属 10元无门槛券
手把手带您无忧上云