拼接SQL字符串等于给黑客递刀子,因user_input直接嵌入SQL会导致注入攻击;参数化查询是唯一安全方式,变量值不参与SQL解析,须用驱动原生占位符(如sqlite3用?或:name,psycopg2用%s),参数必须为tuple或dict,IN子句需手动展开占位,ORM的raw query或字符串拼接同样危险,动态SQL片段必须白名单校验。为什么拼接 SQL 字符串等于给黑客递刀子因为 user_input 一旦进到 "SELECT * FROM users WHERE name = '" + user_input + "'" 这种字符串里,攻击者输个 ' OR '1'='1 就能绕过登录。数据库不区分“你是想查名字还是想删表”,它只认语法合法的语句。参数化查询不是“更安全的写法”,它是唯一被主流驱动/ORM 实现为底层隔离机制的方式——变量值根本不会参与 SQL 解析阶段,而是作为独立数据传给数据库执行器。Python 中用 sqlite3 或 psycopg2 写参数化查询的硬性姿势必须用驱动原生支持的占位符,不能自己 replace、format 或 f-string 拼接。sqlite3 只认 ?(位置占位)或 :name(命名占位),%s 会直接报错psycopg2 只认 %s,哪怕你用 ? 也会当成字面量处理,查不到数据还无报错参数必须是 tuple(单值也要加逗号:(user_id,))或 dict(命名方式),不能是 list 或 str示例:cursor.execute("SELECT * FROM posts WHERE author_id = %s AND status = %s", (author_id, "published"))Node.js 里 pg 和 mysql2 的参数写法差异容易翻车两者都支持数组式传参,但命名参数行为不同,且错误提示极不友好。 ARTi.PiCS ARTi.PiCS是一款由AI驱动的虚拟头像生产器,可以生成200多个不同风格的酷炫虚拟头像

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐