📌 一、路径遍历攻击是什么? 路径遍历(Path Traversal)攻击是一种安全漏洞,攻击者通过控制程序访问文件的路径,使程序打开了原本未授权访问的敏感文件。 📌 二、典型漏洞示例(易受攻击的代码) 存在漏洞的代码通常长这样: // baseDirectory 是受信任的固定目录 // filename 是用户可控制的输入 f, err := os.Open(filepath.Join(baseDirectory, filename)) 为什么这段代码有漏洞? 假设: baseDirectory := "/var/www/data" filename := "../../../../etc/passwd" 执行后: filepath.Join("/var/www/data", "../../../../etc/passwd") // 实际路径:"/etc/passwd" 攻击者成功跳出了本来限定的目录(/var/www/data),访问到了敏感文件。 📌 三、为什么传统路径检查不够安全? 你可能会想自己手动验证,比如: // 手动检查路径安全性(不推荐) if strings.Contains(filename, "..") { return errors.New("路径不安全") } f, err := os.Open(filepath.Join(baseDirectory, filename)) 但这种检查方式不安全,原因如下:
📌 一、理解背景:Go语言泛型(Generics)的引入 在 Go 1.18(2022年3月发布)以前,Go语言并没有泛型功能(generics)。所谓泛型就是写函数或数据结构时,可以不指定具体类型,而用类型参数代替,然后调用时再填入具体类型,这样函数可以用于很多不同类型的情况。 比如: // 没有泛型之前,得为每种类型写一个函数 func SumInt(a, b int) int { return a + b } func SumFloat(a, b float64) float64 { return a + b } // 泛型后,可以只写一个函数: func Sum[T int | float64](a, b T) T { return a + b } 泛型的引入使Go语言更灵活、更强大。但随之而来,语言内部实现变得复杂了。 📌 二、理解类型参数、类型约束和类型集 泛型中出现了一些重要概念: 类型参数(Type Parameter) 就是泛型函数或泛型结构体中用来代替具体类型的占位符,类似函数参数。 func Example[T any](value T) T { return value } 这里T就是一个类型参数。 类型约束(Type Constraint) 表示一个类型参数能取哪些具体类型的限制。用接口表示: type MyConstraint interface { ~string | ~[]byte Hash() uint64 } 这个约束表示任何底层类型是string或[]byte,并且实现了Hash()方法的类型都可以满足。
🧠 一、背景:为什么并发测试很难? Go 的并发编程很强大(goroutine + channel),但并发测试却非常难写、难维护。 1. 负面条件不好测试 比如你想测试某个函数 “还没有被调用” —— 你没法断言某事“没有发生”。 常见写法是等待一段时间: select { case <-calledCh: return true case <-time.After(10 * time.Millisecond): return false // 没被调用 } 这种测试方式: 速度慢:每个测试都等 10ms,几百个测试下来就很久了。 不稳定(flaky):在 CI 上容易失败,比如系统卡顿,10ms 不够就误判失败。 不优雅:测试中必须人为引入等待时间,还可能产生 race。 🌟 二、解决方案:synctest 包 Go 1.24 引入了 testing/synctest 实验包,让并发测试变得快速、稳定、无 race 条件。
📌 背景与动机 在过去,Go 语言提供了 runtime.SetFinalizer 方法来处理对象被垃圾回收时的清理操作(Finalizer)。 但 Finalizer 存在一些固有问题: 如果对象之间有循环引用,Finalizer 可能永远不会被调用,导致内存泄漏。 Finalizer 会延迟对象的回收,至少需要两个垃圾回收周期才能彻底清除对象。 Finalizer 有可能让对象“复活”(Resurrection),导致原本应被释放的对象意外存活下来,造成内存浪费。 因此,Go 在 1.24 版本推出了两个新功能: runtime.AddCleanup:更安全的对象清理方法。 weak.Pointer:弱引用指针类型,可以引用对象但不会阻止对象被回收。 这两个功能结合使用,能有效解决传统 Finalizer 的问题,并构建更高效、更安全的数据结构,比如缓存或去重机制。 📌 一、runtime.AddCleanup(安全清理函数) runtime.AddCleanup 允许给一个对象附加一个“清理函数”,当该对象变得不可达(即垃圾回收后)时,清理函数将被执行。 示例:使用内存映射文件(memory-mapped file)
随笔 最近有点迷茫,要学的东西很多,但是没有动力学习
随笔 不知道写点什么,就随便写写
前置知识 对比度 对比度是图像中最亮和最暗区域之间的亮度差异,决定了画面的视觉冲击力和层次感 高对比度: 图像中的亮部非常亮,暗部非常暗,中间的灰阶较少。常见于戏剧性或剪影风格的摄影,可以带来强烈的视觉冲击力 优点:突出主体、创造戏剧效果 缺点:可能丢失细节,特别是在亮部或暗部 低对比度: 图像中的亮暗区域差异较小,过渡柔和,通常用于表现柔美、平静或细腻的氛围 优点:细节丰富,适合表现复杂的纹理和场景 缺点:可能显得平淡,不够有力 饱和度 饱和度是用来描述色彩的鲜艳程度 高饱和度: 色彩鲜艳、明亮,适合表现活力、热情 低饱和度: 色彩柔和甚至趋于灰色,适合表达宁静、怀旧或低调的氛围 曝光 曝光是指传感器接收到的光线总量。它由光圈、快门速度和感光度(ISO)共同决定 曝光过度: 图像整体偏亮,亮部可能失去细节 曝光不足: 图像整体偏暗,暗部细节可能丢失 对比度与曝光的关系: 曝光过度会减少对比度,尤其是高光区域 曝光不足也会降低对比度,特别是在暗部区域 色调 (Tones) 色调描述的是图像中明暗关系的分布 高调摄影: 图像整体偏亮,适合表现柔和、梦幻或优雅的主题 低调摄影: 图像整体偏暗,适合表现神秘、戏剧性或压抑的情绪 清晰度 调整图像中中间调区域的对比度,增强纹理和细节