插入方法中的DB::raw易受SQL注入攻击吗



我在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((。


最新更新