前端传数字ID到后端,做类型检查能防SQL注入吗?

a'ゞ翌菡 阅读 37

我在写一个用户信息查询功能,前端传了个用户ID给后端接口。听说只要确保这个ID是数字就能防止SQL注入,是真的吗?

我试过在前端用typeof id === 'number'判断,但发现用户还是可以通过抓包工具直接发字符串过来。那是不是说光靠前端类型检查根本没用?

后端是用PHP写的,现在拼SQL语句像这样:

$sql = "SELECT * FROM users WHERE id = " . $_GET['id'];

这种写法即使前端传的是数字,是不是依然有注入风险?该怎么正确防护?

我来解答 赞 7 收藏
二维码
手机扫码查看
2 条解答
迷人的东宁
前端的类型检查确实没什么用,用户完全可以通过抓包工具绕过。你得在后端做严格校验。

直接拼接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
南宫翠翠
前端检查就是个摆设,抓包工具一改啥都白搭,防注入必须得后端来。你那拼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