Autour de Laravel

Petit sondage, fillable ou guarded ?

Avatar de FrédéricAmary
FrédéricAmary

Hello ! J'aimerai avoir votre avis sur les variables model que sont $fillable et $guarded. Pour ma part, j'ai tendance à mettre $guarded = [] partout car pour moi, à partir du moment où on crée un champ en base, c'est pour le remplir, du coup, je ne vois pas l’intérêt de ne pas le mettre dans $fillable, et du coup, autant mettre $guarded vide partout, parce que bon, le mass assigment, c'est un grand mot pour pas grand chose en fait, où alors, je n'ai pas tout compris, ce qui est très possible 😂 Le seul intérêt de remplir $fillable, pour moi, c'est de pouvoir connaitre les champs disponible en regardant le model. Vous en pensez quoi ?

Posté il y a 2 mois
Avatar de jeromeborg1
jeromeborg1

Guarded est l'inverse de fillable fillable -> ce que tu as le droit d'assigné guarded -> ce que tu n'as pas le droit d'assigné si tu as une table de 50 champs, c'est plus rapide de mettre dans guarded ce que tu n'as pas le droit d'assigner

et pour repondre a ton sondage : fillable

Posté il y a 2 mois
Avatar de bestmomo
bestmomo

Salut,

Personnellement j'aime bien utiliser plutôt $fillable pour bien visulaliser ce que j'autorise. POur en venir à ta remarque sur la pertinence de cette propriété et donc de l'assignement de masse il faut bien comprendre le problème.

Si on crée un enregistrement avec un create en envoyant un tableau de données tout est pris en compte (sauf à utiliser $fillable justement). Imaginons la création d'un enregistrement lié à un user et qui contient donc un user_id dans la table. On n'a pas spécialement envie par exemple qu'une requête arrivant sur le serveur renseigne cette colonne. Au niveau du formulaire en place on ne prévoit pas cette information. Mais... Un petit malin peut très bien envoyer une requête identique en ajoutant des choses et avec l'assignement de masse tout passe sans filtre. D'où l'intérêt de la propriété $fillable qui empêche ce genre de pratique.

Posté il y a 2 mois
Avatar de CinquièmeDimension
CinquièmeDimension

Perso j'utilise $filable comme ça j'ai la liste de mes champs avec un petit commentaire pour chacun.

Posté il y a 2 mois
Avatar de ElgiftBambi
ElgiftBambi

$guarded est mieux , si non pourquoi mettre des champa dans une table si on ne vas pas les utilisés?

Posté il y a 2 mois
Avatar de bestmomo
bestmomo

C'est pas parce qu'on ne précise pas un champ dans $guarded ou $fillable qu'on ne peut pas s'en servir. Il ne faut pas passer à côté de la bonne raison à tout ça que j'explique plus haut.

Posté il y a 2 mois
Avatar de Valerie
Valerie

Je préfère aussi $fillable Même pour une table avec de nombreuses colonnes c'est rapide de renseigner au fur et à mesure $fillable et on voit en un coup d'oeil la liste des colonnes autorisées en assignement de masse, ça permet de repérer des erreurs possibles en cours de dev.

Posté il y a 2 mois
Avatar de Nicolus
Nicolus

Si on crée un enregistrement avec un create en envoyant un tableau de données tout est pris en compte (sauf à utiliser $fillable justement). Imaginons la création d'un enregistrement lié à un user et qui contient donc un user_id dans la table. On n'a pas spécialement envie par exemple qu'une requête arrivant sur le serveur renseigne cette colonne. Au niveau du formulaire en place on ne prévoit pas cette information. Mais... Un petit malin peut très bien envoyer une requête identique en ajoutant des choses et avec l'assignement de masse tout passe sans filtre. D'où l'intérêt de la propriété $fillable qui empêche ce genre de pratique.

Oui alors non... Pour moi c'est justement l'effet pervers de ces propriétés $fillable et $guarded, elles corrigent au niveau du modèle un problème qui devrait être traité bien en amont, au niveau de la couche HTTP, avec une validation des requêtes. Pour moi si le paramètre $user_id arrive jusqu'au modèle depuis une requête http, c'est déjà pas bon (même carrément mauvais).

Si la validation est bien faite $fillable n'apporte rien, et j'ai peur que ce ne soit utilisé comme prétexte pour dire "nan mais j'ai pas besoin de valider la requête, de toutes façons j'ai mis que les champs qu'il faut dans $fillable". Le problème c'est qu'un an plus tard, un collègue va avoir besoin de renseigner $user_id en passant un tableau et se dira "j'ai qu'à l'ajouter dans le tableau $fillable, de toutes façons on valide les requêtes en amont". et paf... ça fait une grosse faille de sécurité.

Bref, jusqu'à récemment j'utilisais l'un ou l'autre ou l'autre un peu indifféremment, et ->forceFill() ou ->forceCreate quand je sais ce qu'il y a dans mon tableau, mais je pense que sur mes prochains projets ce sera $guarded = []; et rejet systématique des PR sans validation des requêtes.

Posté il y a 2 mois

Vous ne pouvez pas répondre à ce sujet.