【问题标题】:Is DB::raw in insert method vulnerable to SQL Injection?插入方法中的 DB::raw 是否容易受到 SQL 注入的影响?
【发布时间】:2020-07-20 07:21:00
【问题描述】:

我在 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 注入攻击?为什么?如果是这样,我该如何预防?

【问题讨论】:

  • 您正在使用$uid 进行注入,所以是的,您已经创建了一个注入漏洞。
  • 提示:在 PHP 中进行转换,然后传入不带DB::raw 的普通旧参数。
  • @tadman 我不得不处理无符号的 64 位整数,这就是为什么我更喜欢 mysql 的方式来转换十六进制值。

标签: php mysql laravel sql-injection query-builder


【解决方案1】:

是的,因为$uid 的原始内容将被注入到您的 sql 查询中,所以它很容易受到 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")
]);

【讨论】:

  • 不幸的是,这对我不起作用,它给了我这个错误:Next Illuminate\Database\QueryException: SQLSTATE[22007]: Invalid datetime format: 1292 Truncated incorrect DECIMAL value: ':uid' (SQL: insert into 'users' ('uid', 'created_at') values (CONV(':uid', 16, 10), 2020-04-08 20:39:33)) in vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
  • 参数不能放在 SQL 引号内。您必须使用"CONV(:uid, 16, 10)"
  • @BillKarwin 遗憾的是它仍然给我错误:SQLSTATE[HY093]: Invalid parameter number: mixed named and positional parameters (SQL: insert into users (uid, created_at) values (CONV(:uid, 16, 10), 2020-04-08 20:59:41))。看起来它根本没有将 uid 值传递给原始查询!
  • Laravel 好像不支持这个:laravel.io/forum/…
  • 请尝试更新后的代码。不确定,我现在正在用手机写信。如果不起作用,明天我会用正确的代码更新我的答案。对不起。
【解决方案2】:

是的,将请求输入直接复制到原始 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()


【讨论】:

  • 这实际上不是我的答案。由于 PHP 无法处理无符号大整数,我无法将 ffffffffffffffff 转换为十进制 18446744073709551615 当然我可以使用自定义函数,但这与易受 SQL 注入攻击无关。
  • MySQL 的 CONV() 函数也仅限于 64 位。如果您需要更大的数字,请使用 PHP 的 base_convert()。我已经更新了我的答案以显示这一点。
  • 谢谢,但 base_convert()ffffffffffffffff 返回 18446744073709552046,这是不正确的。正确的值为18446744073709551615
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 2015-10-06
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 2020-03-02
相关资源
最近更新 更多