某云办公应用api存在IP白名单绕过风险

最近在做一个消息推送企业某信的需求,使用的不是官方的api,而是和企业某信可以集成的云办公平台的api。由于api有ip白名单限制,导致我必须在特定化网络环境下发请求,测试很麻烦,所以想测试一下能不能绕过限制。 想要绕过限制,首先要知道服务器如何获取发送者的ip。 服务器如何获取请求者ip 获取请求者 IP 本质上就两个来源: 直接从 IP 数据包获取 这就是 HttpServletRequest的getRemoteAddr() 的工作原理,获取的是直接与服务器建立 TCP 连接的客户端 IP,在没有代理的情况下,这就是真实的客户端 IP 从 HTTP 请求头获取 常见的请求头有: X-Forwarded-For X-Real-IP Proxy-Client-IP WL-Proxy-Client-IP 测试 这里我使用了postman伪造了请求头X-Forwarded-For,经过测试,理论上只要知道正确的ip,就可以让ip白名单功能失效。 如果你有服务器的访问权限,但是只知道服务器的内网ip,可以尝试 curl ifconfig.me 然后就能得到服务器的公网ip了 安全建议 改用网络层的源IP地址(TCP/IP报文中的source IP)进行验证 如果必须使用代理转发,建议只信任内部代理服务器传递的XFF头 吐槽 某云办公平台必须付费才能获得访问api的密钥,并且密钥只有一个,测试只能直接在正式系统测

January 8, 2025 · 1 min · LLP2333

用go写了个简化hugo文章创建的小工具

目前使用hugo作为博客系统,使用typora作为博客的编辑器。书接上文Hugo使用技巧,之前每次都需要在博客根目录执行 hugo new posts/文章标题/index.md 创建新的文章。感觉很麻烦。所以想写个工具简化这个过程。 思路 输入文件标题后执行创建文章的命令,然后生成新的文章的快捷方式,方便使用typora进行编辑。 代码 使用Claude生成的,很方便。 如果是windows平台,使用 go build -o HugoHelper.exe main.go 进行编译。 使用前需要配置blog环境变量,key为blog,value为你的项目的根路径 比如我的根目录是C:\UGit\qvqw.date 代码 package main import ( "bufio" "fmt" "os" "os/exec" "path/filepath" "strings" ) func main() { // 获取当前程序执行路径 execPath, err := os.Getwd() if err != nil { fmt.Printf("错误: 获取当前路径失败: %v\n", err) os.Exit(1) } // 从环境变量获取博客路径 blogPath := os.Getenv("blog") if blogPath == "" { fmt.Println("错误: 环境变量 'blog' 未设置") os.Exit(1) } // 验证博客路径是否存在 if _, err := os.Stat(blogPath); os.IsNotExist(err) { fmt.Printf("错误: 博客路径不存在: %s\n", blogPath) os.Exit(1) } // 获取用户输入的文章标题 reader := bufio.NewReader(os.Stdin) fmt.Print("请输入文章标题: ") title, err := reader.ReadString('\n') if err != nil { fmt.Printf("错误: 读取输入失败: %v\n", err) os.Exit(1) } // 清理标题(移除空白字符和换行符) title = strings.TrimSpace(title) if title == "" { fmt.Println("错误: 标题不能为空") os.Exit(1) } // 构建 hugo 命令 cmd := exec.Command("hugo", "new", fmt.Sprintf("posts/%s/index.md", title)) cmd.Dir = blogPath cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr // 执行命令 if err := cmd.Run(); err != nil { fmt.Printf("错误: 创建文章失败: %v\n", err) os.Exit(1) } // 源文件路径(Hugo 创建的文件) sourceFile := filepath.Join(blogPath, "content", "posts", title, "index.md") // 目标软链接路径(在当前目录) linkName := filepath.Join(execPath, fmt.Sprintf("%s.md", title)) // 删除已存在的软链接(如果有的话) _ = os.Remove(linkName) // 创建软链接 err = os.Symlink(sourceFile, linkName) if err != nil { fmt.Printf("警告: 创建软链接失败: %v\n", err) } else { fmt.Printf("成功创建软链接: %s -> %s\n", linkName, sourceFile) } fmt.Printf("成功创建文章: %s\n", sourceFile) // 等待用户按回车键后退出 waitExit := bufio.NewReader(os.Stdin) fmt.Print("按回车键退出...") waitExit.ReadString('\n') } 注意 如果无法创建软链接,请使用管理员权限运行。 ...

January 7, 2025 · 1 min · LLP2333

Spring Boot 快速上手 JPA

非原创,原文地址https://github.com/CodingDocs/springboot-guide/blob/master/docs/basis/springboot-jpa.md JPA 这部分内容上手很容易,但是涉及到的东西还是挺多的,网上大部分关于 JPA 的资料都不是特别齐全,大部分用的版本也是比较落后的。另外,我下面讲到了的内容也不可能涵盖所有 JPA 相关内容,我只是把自己觉得比较重要的知识点总结在了下面。我自己也是参考着官方文档写的,官方文档非常详细了,非常推荐阅读一下。这篇文章可以帮助对 JPA 不了解或者不太熟悉的人来在实际项目中正确使用 JPA。 项目代码基于 Spring Boot 最新的 2.1.9.RELEASE 版本构建(截止到这篇文章写完),另外,新建项目就不多说了,前面的文章已经很详细介绍过。 1.相关依赖 我们需要下面这些依赖支持我们完成这部分内容的学习: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> 2.配置数据库连接信息和JPA配置 由于使用的是 h2 内存数据库,所以你直接运行项目数据库就会自动创建好。 下面的配置中需要单独说一下 spring.jpa.hibernate.ddl-auto=create这个配置选项。 这个属性常用的选项有四种: create:每次重新启动项目都会重新创新表结构,会导致数据丢失 create-drop:每次启动项目创建表结构,关闭项目删除表结构 update:每次启动项目会更新表结构 validate:验证表结构,不对数据库进行任何更改 但是,一定要不要在生产环境使用 ddl 自动生成表结构,一般推荐手写 SQL 语句配合 Flyway 来做这些事情。 # 数据库url地址 spring.datasource.url=jdbc:h2:mem:jpa-demo spring.datasource.username=root spring.datasource.password=123456 spring.datasource.platform=h2 spring.datasource.driverClassName =org.h2.Driver spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true # 打印出 sql 语句 spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=update spring.jpa.open-in-view=false server.port=8080 #H2控制台 spring.h2.console.enabled=true 3.实体类 我们为这个类添加了 @Entity 注解代表它是数据库持久化类,还配置了主键 id。 ...

November 18, 2024 · 3 min · LLP2333

使用cpolar为rock5A进行内网穿透

使用 cpolar 为 rock 5A 进行内网穿透 github 上有开源的 frp 项目,如果有一台云服务器的话,用来内网穿透很不错。但是,使用云服务+frp 的方案,开放某个端口,还需要去修改云服务的安全组,比较麻烦。考虑到方便性,我用了 cpolar 做内网穿透。 注:rock 5A 为 arm 开发板,系统为 debian12(和树莓派、香橙派等 arm 计算机的教程理论上通用) 安装 我这里使用的官方的一键安装脚本 curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash 授权 执行下面 的命令进行授权(授权码在 cpolar 验证页面获取) cpolar authtoken xxxxxxxxxxxxxxxxxx 设置开机自启动并启动 cpolar 服务 systemctl enable cpolar systemctl start cpolar 完成上面的内容就基本上配置好了,你可以在 cpolar 官网的状态页面看到你的 ssh 隧道,可以通过该域名和端口远程访问本地的 rock 5A 注意:cpolar 默认会配置本地机器 ssh 的 内网穿透,如需定制自己的内网穿透,请尝试根据官网文档修改配置文件。免费的内网穿透会在机器重启后变更域名和端口,重启后可以从 cpolar 官网状态页面获取,也可以考虑升级付费用户。 配置文件 默认的配置文件在 /usr/local/etc/cpolar/cpolar.yml 补充说明 使用过程中,我发现 cpolar 代理 http 导致了 rock 5A 的 cpu 占用飙升。后续我用了阿里云的服务器+frp 代理了 ssh,cloudflare tunnel 代理 http,cpu 占用几乎忽略不计。因此,建议 cpolar 内网穿透方案仅作备选。 ...

April 13, 2024 · 1 min · LLP2333

记录一次系统迁移

记录一次系统迁移 开发板为 rock 5a,使用的为 Debian 系统。最近买了一个香橙派 5plus 的 64G 的 emmc(和 rock5A 通用并且比官方的更便宜),打算将系统从内存卡迁移到 emmc。 查看当前磁盘情况 fdisk -l 得到新磁盘名字为/dev/mmcblk0,原内存卡设备为/dev/mmcblk1 使用 dd 命令迁移 系统 sudo dd if=/dev/mmcblk1 of=/dev/mmcblk0 bs=4M status=progress dd:待执行的命令,即复制和转换命令。 if=/dev/mmcblk1:if 表示输入文件(input file)。/dev/mmcblk1 是源设备的文件路径,也就是数据的来源。 of=/dev/mmcblk0:of 表示输出文件(output file)。/dev/mmcblk0 是目标设备的文件路径,也就是数据要写入的地方。 bs=4M:bs 表示块大小(block size)。设置为每次读写 4M 数据。设定一个适当的块大小可以提高数据的复制速度。 status=progress:这是一个可选参数,它可以实时显示dd命令的进度信息。这对于一些需要花费长时间的复制任务来说非常有用,可以让用户知道复制过程的进度。 使用 parted 命令调整磁盘大小 如果不进行调整,系统可用大小还是默认的 32G 先查看磁盘情况 parted /dev/mmcblk0 print #查看指定设备的磁盘大小 然后我对第 3 个分区进行了调整,使其扩容到 emmc 最大能支持的容量 parted /dev/mmcblk0 resizepart 3 100% 最后用 resize2f 命令调整文件系统大小

April 11, 2024 · 1 min · LLP2333