J'ai un code simplifié comme celui-ci dans 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")
]);

Mon code est-il vulnérable aux attaques par injection SQL? Et pourquoi? Si oui, comment puis-je l'empêcher?

1
Sky 8 avril 2020 à 02:50

3 réponses

Meilleure réponse

Oui, il est vulnérable à l'injection SQL car le contenu brut de $uid sera injecté dans votre requête SQL.

Bien que DB::raw() accepte les paramètres préparés, il ne peut pas être utilisé correctement dans la méthode d'insertion.

Pour ce faire, vous devrez écrire la requête d'insertion manuellement:

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

DB::statement('INSERT INTO users (uid, created_at) VALUES (CONV(?, 16, 10), ?)', [
    $uid,
    date("Y-m-d H:i:s")
]);
3
Elias Soares 8 avril 2020 à 01:43

Oui, la copie d'une entrée de demande directement dans votre requête SQL brute est un exemple de vulnérabilité d'injection SQL.

Je suggère cette alternative:

$uid = base_convert($request->input('uid'), 16, 10);
DB::table('users')->insert([
    'uid' => $uid,
    'created_at' =>  date("Y-m-d H:i:s")
]);

Voir base_convert ().


1
Bill Karwin 8 avril 2020 à 19:45

Utilisez la méthode create

Changement dans votre modèle d'utilisateur

<?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'
    ];


}

Et dans votre contrôleur

$uid = $request->input('uid');
User::create([
    'uid' => DB::raw("CONV('$uid', 16, 10)"),
    'created_at' =>  date("Y-m-d H:i:s")
]);
0
Vikas Katariya 8 avril 2020 à 03:33