OWASP (Open Web Application Security Project) est un projet qui enregistre les menaces actuelles contre les applications Web. J'ai suivi leur site et je vois des similitudes dans les rapports de 2010, 2013 et 2017, avec SQL ou d'autres types de menaces d'injection en tête de liste.
C'est un problème sérieux.
Cela vous entraînera à la faillite, cette question est donc une question de vie ou de mort. Votre entreprise doit se concentrer sur la résolution de ce genre de problème pour l'éviter.
Qu'est-ce que l'injection ?
La soi-disant injection signifie que les données ne sont pas filtrées et que le contenu non fiable est écrit directement dans l'interpréteur système. Ce comportement entraînera une injection SQL dans le site. autorisations complètes sur le système.
Par exemple :
Regardez l'instruction de requête malveillante suivante, qui placera l'instruction SQL contenant un comportement malveillant dans la variable $name, puis permettra à l'utilisateur de La méthode pass POST est transmise au script PHP, afin d'atteindre l'objectif ultime d'utiliser le code malveillant entrant pour mener des attaques.
// 将恶意代码,DROP TABLE 写入 $name 变量 $name = "Mark';DROP TABLE users; -- ";\ $query = "SELECT * FROM users WHERE name='$name'";
Après avoir été analysé par le script PHP, cela finira par générer une instruction SQL comme celle-ci :
SELECT * FROM users WHERE name='Mark';DROP TABLE users; -- '
Comme vous pouvez le deviner, l'instruction ci-dessus supprimera l'intégralité de la table de données des utilisateurs de la base de données. .
Comme Yoda l'a dit :
C'est trop dangereux, oui, trop dangereux.
Comment empêcher les injections malveillantes dans les applications PHP ?
Tout d'abord, rien n'est réellement injecté dans la base de données. Cette erreur est simplement due à un formatage incorrect de l'instruction de requête. La solution est simple, à condition de formater correctement l'instruction SQL ou de traiter directement l'instruction de requête et les données séparément.
Comment faire ? Utilisez des requêtes paramétrées pour formater les données et séparer les instructions de requête des données.
L'utilisation de requêtes paramétrées peut garantir que le programme est à l'écart du risque d'injection.
Les exemples sont les suivants :
$statement = $db->prepare('SELECT * FROM table WHERE id = ? and name = ? ');\ $statement->execute([1, "Mark"]);
De plus, il existe un moyen sûr d'utiliser ORM (Object Relational Mapping) ou un générateur de requêtes dans le projet.
Ce que je voudrais recommander, c'est Eloquent, qui est également utilisé par le célèbre framework PHP Laravel. Ensuite, je vais vous apprendre à l'installer et à l'utiliser, ce qui peut nous aider à formater les données pour éviter efficacement les risques d'injection.
Installation d'Eloquent
Préparation
Veuillez vous assurer que PHP et Composer sont installés.
Démarrage officiel
Il est préférable d'installer l'ORM au début du projet.
Supposons que nous souhaitions créer une application de blog, comprenant une table de publications et une table d'utilisateurs.
Configuration initiale
La première chose à faire est de créer le fichier composer.json pour le programme. Vous pouvez exécuter composer init sur le terminal et suivre les invites sur le terminal.
Lorsqu'il vous demande de définir des dépendances, écrivez illuminate/database . Le résultat final devrait ressembler à l'image ci-dessus. Vous pouvez maintenant installer les dépendances correspondantes dans le projet en exécutant composer install .
Ou, si vous disposez déjà du fichier composer.json, vous pouvez directement saisir composer require illuminate/database dans le terminal pour installer les dépendances correspondantes.
Nous devons maintenant créer le fichier start.php dans le répertoire racine de l'application et coller le code suivant dans le fichier. J'expliquerai leur rôle ci-dessous.
require "vendor/autoload.php"; //If you want the errors to be shown *是否显示错误 error_reporting(E_ALL); ini_set('display_errors', '1'); use Illuminate\Database\Capsule\Manager as Capsule; $capsule = new Capsule; $capsule->addConnection([ "driver" => "mysql", "host" =>"127.0.0.1", "database" => "test", "username" => "root", "password" => "root" ]); //Make this Capsule instance available globally. *要让 capsule 能在全局使用 $capsule->setAsGlobal(); // Setup the Eloquent ORM. $capsule->bootEloquent();
Dans la première ligne, nous devons importer le fichier supplier/autoload.php. De cette façon, nous pouvons charger tous les packages dans le répertoire du fournisseur.
Ensuite, nous introduisons l'utilisation d'IlluminateDatabaseCapsuleManager comme Capsule et lui donnons un alias afin que nous puissions utiliser éloquent.
Ensuite, nous créons un objet Capsule et initialisons notre connexion à la base de données comme ci-dessus avec bootEloquent() .
Maintenant, évidemment, la première chose que nous devons faire est de créer une base de données nommée test. Veuillez vous assurer de saisir le nom d'utilisateur et le mot de passe corrects localement.
Migrations / Migration de données
L'un des plus grands avantages de l'utilisation d'Eloquent est que vous pouvez utiliser des migrations.
Si vous ne comprenez pas ce que sont les migrations, vous pouvez lire l'explication ci-dessous :
La migration est un moyen de créer des tables de données via du code PHP.
Créer une migration dans le fichier migrations.php :
require "start.php"; use Illuminate\Database\Capsule\Manager as Capsule; Capsule::schema()->create('users', function ($table) { $table->increments('id'); $table->string('name'); $table->string('email')->unique(); $table->string('password'); $table->timestamps(); }); Capsule::schema()->create('posts', function ($table) { $table->increments('id'); $table->string('title'); $table->text('body'); $table->integer('created_by')->unsigned(); $table->timestamps(); });
Le code ci-dessus crée deux tables de données via la classe Capsule, l'une est la table des utilisateurs et l'autre est la table des publications, et respectivement Field des noms leur sont définis.
Exécutez ce fichier. Si vous voyez un écran blanc, cela signifie que les migrations s'exécutent avec succès. Vous pouvez maintenant ouvrir la base de données pour voir si ces deux tables ont été générées.
Modèles
Maintenant, il ne reste plus qu'à créer la classe Model correspondant à la table de données.
用了 Eloquent,你就可以在 Model 类里操作相应的数据表,执行查询语句了。
创建一个 Models 文件夹,然后在其中分别创建 User.php 和 Post.php 文件:
namespace Models; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * 对应的数据表 * * @var string */ protected $table = "users"; /** * 允许插入的字段 * * @var array */ protected $fillable = [ 'name', 'email', 'password' ]; /** * 需要被隐藏的字段 * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; /* * 给 User 类添加方法 * */ public function posts() { return $this->hasMany(Post::class, 'created_by'); } } And namespace Models; use Illuminate\Database\Eloquent\Model; class Post extends Model { /** * 对应的数据表 * * @var string */ protected $table = "posts"; /** * 允许插入的字段 * * @var array */ protected $fillable = [ 'title', 'body', 'created_by' ]; } 在 composer.json 文件中加入如下代码,以确保上面创建的类文件能够被自动加载。 "autoload": { "classmap": [ "Models" // Folder where all your models are ] }
然后执行 composer dump-autoload。
通过 Eloquent 操作数据库
基本大功告成了。 测一下吧,在根目录创建 index.php 文件,添加如下代码:
require "start.php"; use Models\User; use Models\Post; User::create( [ 'name' => 'Mark Mike', 'email' => 'temp-email-1@mark.com', 'password' => '1234' ] ); Post::create( [ 'title' => 'New Blog Post', 'body' => 'New Blog Content', 'created_by' => 1 ] ); print_r(User::all()); print_r(Post::all()); print_r(User::find(1)->posts);
如你所见,用 Eloquent 操作数据库就是这么简单。除此之外,Eloquent 还提供了很多方法供你使用,而且很安全。
结语:
Eloquent 就像是给你的 SQL 查询加了一道安全层,它可以过滤掉我们在执行 SQL 查询时所犯的错误。如果你想用它,但是又不想安装 Laravel 框架,那么我想你已经从这篇文章中学到了该如何去做。这个优雅的 SQL 助手,将帮助你写出更干净且更安全的代码。
更多PHP相关知识,请访问PHP中文网!
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!