Laravel, le framework de développement PHP bien connu, a précédemment signalé une vulnérabilité d'injection SQL à haut risque sur le blog officiel. Voici une brève analyse.
Tout d'abord, cette vulnérabilité appartient au codage irrégulier du site Web. Le responsable a donné un indice :
Mais le responsable l'a quand même fait. Il a été corrigé et peut être corrigé en mettant à niveau vers la dernière version V5.8.7. Localisons d'abord ici :Illuminate\Validation\RuleLa méthode d'écriture officiellement recommandée est :
Rule::unique('users')->ignore($id),Si le codage du site Web ne traite pas la valeur de $id à l'avance, l'utilisateur peut transmettez-le directement Donner des données malveillantes à la fonction ignore provoquera une injection SQL. Suivons la fonction :
\Illuminate\Validation\Rules\Unique.php class Unique { ... public function ignore($id, $idColumn = null) { if ($id instanceof Model) { return $this->ignoreModel($id, $idColumn); } $this->ignore = $id; $this->idColumn = $idColumn ?? 'id'; return $this; }Ici nous n'envisageons pas d'écrire $id comme une instance Si $id est contrôlable par l'utilisateur, $idColumn peut être écrit directement comme vide, et enfin. attribué La situation est la suivante :
$this->ignore = $id; $this->idColumn = 'id';Si le code du site Web est structuré ainsi, la valeur saisie par le hacker est contrôlable :
$id = $request->input('id');Enfin, nous arriverons ici :
Illuminate\Validation\Rules\Unique.php public function __toString() { ... ... }Nous examinons les modifications du code clé :
Illuminate\Validation\Rules\Unique.php V5.8.7【最新版】 public function __toString() { $this->ignore ? '"'.addslashes($this->ignore).'"' : 'NULL', } Illuminate\Validation\Rules\Unique.php V5.8.4 public function __toString() { $this->ignore ? '"'.$this->ignore.'"' : 'NULL', }Le dernier code ici est la v5.8.7, qui donne directement $this->ignore aux addlashes. Il n'y avait aucune protection ici auparavant. Ce qui est intéressant, c'est que l'auteur a comparé les diffs, au cours desquels le responsable a également essayé de filtrer d'autres lieux cités. Enfin, un filtrage unifié a été effectué sur __toString. Enfin, le code suivant entrera dans DatabaseRule pour la correspondance ultérieure des règles SQL.
Illuminate\Validation\Rules\DatabaseRule.phpIl n'y a eu aucun autre traitement après cela et une injection SQL a été formée. Pour plus d'articles techniques liés à Laravel, veuillez visiter la colonne
Tutoriel d'introduction au framework Laravel pour apprendre !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!