插入方法中的 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")
]);
我在 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")
]);