插入方法中的 DB::raw 是否容易受到 SQL 注入的攻击?

Is DB::raw in insert method vulnerable to SQL Injection?

我在 Laravel 中有这样的简化代码:

$uid = $request->input('uid');
DB::table('users')->insert([
    'uid' => DB::raw("CONV('$uid', 16, 10)"),
    'created_at' =>  date("Y-m-d H:i:s")
]);

我的代码容易受到 SQL 注入攻击吗?为什么?如果是这样,我该如何预防?

是的,它容易受到 SQL 注入攻击,因为 $uid 的原始内容将被注入到您的 sql 查询中。

虽然DB::raw()接受准备参数,但不能在insert方法中正确使用。

为此,您需要手动编写插入查询:

$uid = $request->input('uid');

DB::statement('INSERT INTO users (uid, created_at) VALUES (CONV(?, 16, 10), ?)', [
    $uid,
    date("Y-m-d H:i:s")
]);

是的,将请求输入直接复制到原始 SQL 查询中是 SQL 注入漏洞的一个示例。

我建议这个替代方案:

$uid = base_convert($request->input('uid'), 16, 10);
DB::table('users')->insert([
    'uid' => $uid,
    'created_at' =>  date("Y-m-d H:i:s")
]);

参见base_convert()