前端传数字ID到后端,做类型检查能防SQL注入吗? a'ゞ翌菡 提问于 2026-03-03 20:25:18 阅读 37 安全 我在写一个用户信息查询功能,前端传了个用户ID给后端接口。听说只要确保这个ID是数字就能防止SQL注入,是真的吗? 我试过在前端用typeof id === 'number'判断,但发现用户还是可以通过抓包工具直接发字符串过来。那是不是说光靠前端类型检查根本没用? 后端是用PHP写的,现在拼SQL语句像这样: $sql = "SELECT * FROM users WHERE id = " . $_GET['id']; 这种写法即使前端传的是数字,是不是依然有注入风险?该怎么正确防护? 我来解答 赞 7 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 2 条解答 迷人的东宁 Lv1 前端的类型检查确实没什么用,用户完全可以通过抓包工具绕过。你得在后端做严格校验。 直接拼接SQL语句很危险,即使ID是数字型也存在风险。比如说0x31就是字符'1'的十六进制表示,可能会被某些数据库引擎识别为数字。 推荐的做法是使用预处理语句和参数化查询。PHP里可以用PDO来实现,代码大概长这样: $pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass"); $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id"); $id = $_GET['id']; if(filter_var($id, FILTER_VALIDATE_INT) !== false) { $stmt->bindParam(':id', $id, PDO::PARAM_INT); $stmt->execute(); } else { // 处理错误 } 先用filter_var验证确实是整数,然后用绑定参数的方式传入值。这种方式能有效防止SQL注入。 顺便说下,这种写法虽然多几行代码,但安全多了。别嫌麻烦,数据安全马虎不得,不然真出事就晚了。 回复 点赞 2026-03-26 09:04 南宫翠翠 Lv1 前端检查就是个摆设,抓包工具一改啥都白搭,防注入必须得后端来。你那拼SQL的写法只要传个 1 OR 1=1 就能查光全表,太危险了。省事的话直接把ID强转成整型,或者用预处理语句,代码给你。 // 最偷懒的写法:强转类型,非数字直接变0 $id = (int)$_GET['id']; $sql = "SELECT * FROM users WHERE id = " . $id; // 或者稍微正经点用PDO预处理(推荐) $stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id'); $stmt->execute(['id' => $_GET['id']]); 回复 点赞 5 2026-03-04 10:54 加载更多 相关推荐 1 回答 43 浏览 前端如何防止SQL注入时意外暴露敏感信息? 我在做用户登录功能时,后端用了参数化查询防SQL注入,但前端错误提示写得太详细,比如直接显示“用户名或密码错误”,担心被用来暴力探测账户。想隐藏具体错误,但又不能让用户完全不知道哪里出错,这该怎么平衡... Newb.培聪 安全 2026-03-10 20:42:24 2 回答 33 浏览 前端用 Prepared Statement 能防 SQL 注入吗? 我最近在学安全防护,看到说用 Prepared Statement 可以防止 SQL 注入。但我是在写前端代码(比如用 fetch 发请求),那我在前端拼 SQL 字符串然后发给后端,是不是照样会被注... 东方晓萌 安全 2026-02-27 04:52:17 2 回答 62 浏览 在前端用模板字符串拼接SQL时,怎么防OWASP Top 10的注入漏洞? 我在做用户搜索功能时,后端让前端传原始搜索词,用模板字符串拼接SQL查询。但测试时发现这属于A03注入漏洞。虽然改用了参数化查询,但后端报错说参数顺序不对... 具体场景是用户输入框内容拼接到"SEL... 佳沫的笔记 安全 2026-01-26 15:59:27 1 回答 43 浏览 前端请求后端接口时,错误信息会不会导致SQL注入风险? 我最近在做登录功能,后端用的是Node.js + MySQL。之前听说如果错误信息暴露太多,可能会被用来做SQL注入攻击。我现在catch到数据库错误就直接把err.message返回给前端了,这样是... Des.红辰 安全 2026-03-27 18:08:27 1 回答 51 浏览 SQLMap测试时怎么判断是否存在SQL注入? 我用 SQLMap 测试一个登录接口,但返回结果不太确定是不是真的有注入点。比如运行 sqlmap -u "http://example.com/login" --data="username=adm... 司空俊鑫 安全 2026-03-25 14:47:24 1 回答 44 浏览 用ORM框架就真的不会SQL注入了吗? 我最近在Vue项目里用TypeORM做后端数据查询,听说ORM能防SQL注入,但心里还是没底。比如下面这种写法安全吗? <script setup> import { getReposit... 迷人的晨旭 安全 2026-03-24 16:54:22 2 回答 53 浏览 用ORM框架就真的不会SQL注入了吗? 最近在用Sequelize写Node.js后端,听说ORM能自动防SQL注入,但我还是有点不放心。比如我这样写:Model.findAll({ where: { name: userInput } }... 西门仙仙 安全 2026-03-13 11:38:19 2 回答 28 浏览 存储过程真能防住SQL注入吗?我这样写安全吗? 我在用Node.js调用MySQL的存储过程,听说用存储过程能防SQL注入,但我还是有点不放心。比如我这样拼接参数传进去: CALL getUserInfo(${userId}) 会不会有风险?是不是... UX-米阳 安全 2026-03-12 19:37:18 2 回答 97 浏览 TypeORM里用Raw写SQL会有注入风险吗? 我最近在用TypeORM的Raw函数拼接查询条件,但担心这样会不会有SQL注入漏洞?比如下面这段代码: const users = await getRepository(User) .find({ ... 一家淼 安全 2026-03-06 00:28:21 2 回答 32 浏览 用ORM就真的不会SQL注入了吗? 我最近在用 Sequelize 写接口,听说 ORM 能防 SQL 注入,但心里还是不踏实。比如下面这种写法: const user = await User.findOne({ where: { i... 迷人的志红 安全 2026-02-25 09:44:19
直接拼接SQL语句很危险,即使ID是数字型也存在风险。比如说0x31就是字符'1'的十六进制表示,可能会被某些数据库引擎识别为数字。
推荐的做法是使用预处理语句和参数化查询。PHP里可以用PDO来实现,代码大概长这样:
先用filter_var验证确实是整数,然后用绑定参数的方式传入值。这种方式能有效防止SQL注入。
顺便说下,这种写法虽然多几行代码,但安全多了。别嫌麻烦,数据安全马虎不得,不然真出事就晚了。
1 OR 1=1就能查光全表,太危险了。省事的话直接把ID强转成整型,或者用预处理语句,代码给你。