为什么 MyBatis 的 `${}` 会导致 SQL 注入

MyBatis 里的 `${}` 之所以危险,不在于语法本身少见,而在于它会把变量原样拼进 SQL,直接绕开 JDBC 预编译。本文从执行机制、典型注入方式和高危使用场景三部分说明问题,并给出项目里可落地的排查与约束思路。

为什么 MyBatis 的 `${}` 会导致 SQL 注入

C++ 程序在 Linux 上如何调试

在 Linux 上调试 C++,核心不只是会下断点,更重要的是按问题类型选对工具。本文把 GDB、LLDB、VS Code、CLion、Valgrind 和 AddressSanitizer 的定位拆开说明,并保留常用命令与编译参数,方便你快速判断该先看控制台、IDE,还是直接查内存错误。

C++ 程序在 Linux 上如何调试

如何抑制不需要的编译器消息

C++ 编译器警告不该一股脑全部关掉,也不必被海量提示牵着走。本文从警告的类型与作用讲起,梳理 GCC、Clang、MSVC 中常见的抑制手段,并给出更稳妥的判断原则:什么时候该修代码,什么时候才适合定向关闭警告。

如何抑制不需要的编译器消息

Ubuntu 安装 Python 依赖库指南:apt、pip3 与虚拟环境怎么选

在 Ubuntu 上安装 Python 依赖,常见做法主要是 `apt`、`pip3` 和虚拟环境三种。本文按使用场景拆解命令、验证方式与常见坑,帮助你判断什么时候装到系统里,什么时候放进项目环境里。 在 Ubuntu 上安装 Python 依赖,表面上只是选一条命令,实际却关系到版本是否够新、系统环境会不会被污染,以及多个项目能不能长期共存。

Ubuntu 安装 Python 依赖库指南:apt、pip3 与虚拟环境怎么选

Go 里为什么 nil 接口不等于 nil?把底层结构和常见陷阱一次讲清

Go 里常见的“nil 接口不等于 nil”并不是语言反常,而是接口底层表示决定的结果。关键点在于:接口值同时保存类型信息和数据指针,只有两者都为 nil,接口本身才等于 nil。理解这一点后,错误返回、类型断言和反射判断这些常见场景就更容易避坑。

Go 里为什么 nil 接口不等于 nil?把底层结构和常见陷阱一次讲清

Go 生态里的 AI 库盘点:SDK、开源与选型指南

Go 接入大模型并不缺方案,难点在于生态分散、库的定位不同。本文按云端模型、MCP、本地推理和 RAG 四类场景梳理主流 Go 库,保留各自适用边界,并给出新项目与存量项目的选型建议,方便快速判断该直接上官方 SDK,还是走兼容接口或自建链路。

Go 生态里的 AI 库盘点:SDK、开源与选型指南

如何防止动态 SQL 存储过程发生注入攻击?

在 SQL Server 里,`sp_executesql` 只能保护值参数,挡不住列名、表名、排序方向这类动态语法片段的注入风险。要把动态 SQL 存储过程写安全,关键是把对象名、枚举值、执行权限分别收紧,并彻底放弃“过滤关键字”这类伪防护。

如何防止动态 SQL 存储过程发生注入攻击?

Python 调用 FFmpeg 处理音视频文件的几种方式

在 Python 里调用 FFmpeg 并不难,真正麻烦的是卡住、没进度、批量任务中断和 Windows 环境问题。本文按“一次性执行、实时进度、批量处理、常见报错”四个场景重组做法,保留可直接使用的命令与代码,并说明什么情况下该选 `run`、`Popen` 或 `pathlib` 组合。

Python 调用 FFmpeg 处理音视频文件的几种方式