Является ли DB :: raw в методе вставки уязвимым для SQL Injection? - PullRequest
1 голос
/ 08 апреля 2020

У меня есть упрощенный код, подобный этому, в 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 Injection? И почему? Если так, как я могу предотвратить это?

Ответы [ 3 ]

3 голосов
/ 08 апреля 2020

Да, он уязвим для SQL Внедрения, поскольку необработанное содержимое $uid будет добавлено в ваш запрос sql.

Хотя DB::raw() принимает подготовленные параметры, его нельзя использовать внутри метод вставки правильно.

Для этого вам нужно будет написать запрос на вставку вручную:

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

DB::statement('INSERT INTO users (uid, created_at) VALUES (CONV(?, 16, 10), ?)', [
    $uid,
    date("Y-m-d H:i:s")
]);
1 голос
/ 08 апреля 2020

Да, копирование входных данных запроса непосредственно в необработанный запрос 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 () .


0 голосов
/ 08 апреля 2020

Использование create метод

Изменение вашей пользовательской модели

<?php

namespace App;


use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;


class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password' , 'uid'
    ];


}

И в вашем контроллере

$uid = $request->input('uid');
User::create([
    'uid' => DB::raw("CONV('$uid', 16, 10)"),
    'created_at' =>  date("Y-m-d H:i:s")
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...