Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 04.01.2019 11:28:01

Защита от SQL-инъекций в сырых запросах

Хай юзаю я whereRaw вот в таком запросе -

DB::table('news')
            ->select('title', 'url', 'desc', 'text', 'created_at', 'image')
            ->where('delete', 0)
            ->where('enable', 2)
            /* || ---> отсеивание новостей у которых срок публикаций еще не подошел | */
            ->where(function ($query) {
                $query->whereNull('created_at')
                    ->orWhere('created_at', '<=', Carbon::now()->toDateTimeString());
            })
            /* || ---> |*/
            ->whereRaw('MATCH (`title`, `desc`, `text`) AGAINST (\''.$q.'\')')
            ->orderBy('created_at', 'desc')
            ->offset($offest)
            ->limit($paginate)
            ->get();

С переменной $q приходит поисковая слова - типа "машина", "видео" и т.п. Тут запросто можно отправить sql инъекцию.

https://laravel.ru/posts/250
Читал я эту документацию  где написано - "Будьте внимательны и не допускайте возможностей для SQL-инъекций! при сырых запросах". Аха, понял. Теперь вопрос - а как я буду собственно защищаться? Такое уже не описано.
Тут я свою переменную $q хочу положить в mysqli_real_escape_string($database, $q)
НО тут есть одно проблема - я в mysqli_real_escape_string должен передать идентификатор соединение с базой mysql. Как это в laravel получить? smile

Изменено evilgoogle (04.01.2019 11:30:33)

Не в сети

#2 04.01.2019 12:20:07

Re: Защита от SQL-инъекций в сырых запросах

сами по себе "сырые" запросы не исключают использование плейсходеров. Посмотри здесь: https://stackoverflow.com/q/38488926/272885

$my_query = "select *, MATCH (name) AGAINST (?) from users 
    where MATCH (hobbies) AGAINST (? IN BOOLEAN MODE) limit 10 OFFSET ?"

$hobbies = DB::select($my_query, array($search_term, $search_term, (($page-1)*10)));

There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#3 04.01.2019 12:23:49

Re: Защита от SQL-инъекций в сырых запросах

Вот ещё годный по-моему пример как организовать полнотекстовый поиск в Eloquent через трейт. В трейте параметры через плейсхолдер реализованы.
https://arianacosta.com/php/laravel/tut … laravel-5/

    public function scopeSearch($query, $term)
    {
        $columns = implode(',',$this->searchable);
 
        $query->whereRaw("MATCH ({$columns}) AGAINST (? IN BOOLEAN MODE)" , $this->fullTextWildcards($term));
 
        return $query;
    }

здесь $this->searchable задаётся программистом в коде, поэтому может считаться безопасным, а $term происходит из пользовательского ввода и подставляется через плейсхолдер.

Изменено artoodetoo (04.01.2019 12:27:21)


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#4 04.01.2019 12:35:45

Re: Защита от SQL-инъекций в сырых запросах

Спасибо 2 пример с трейтом понравился. Тут в laravel используется pdo как бы и у него нет типа такой функций mysqli_real_escape_string, правильно?

Не в сети

#5 04.01.2019 13:31:43

Re: Защита от SQL-инъекций в сырых запросах

Ну если покопаться, то в PDO есть аналог. Но его не рекомендуется использовать. Тем более, что ты не используешь PDO напрямую, а только через прослойку Eloquent.


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

Подвал раздела