OWASP (Open Web Application Security Project) ist ein Projekt, das die aktuellen Bedrohungen für Webanwendungen aufzeichnet. Ich verfolge ihre Website und sehe einige Ähnlichkeiten in den Berichten aus den Jahren 2010, 2013 und 2017, wobei SQL oder andere Arten von Injektionsbedrohungen ganz oben auf der Liste stehen.
Das ist ein ernstes Problem.
Es wird dazu führen, dass Sie bankrott gehen, daher ist diese Angelegenheit eine Frage von Leben und Tod. Ihre Organisation sollte sich auf die Bewältigung dieser Art von Problemen konzentrieren, um sie zu vermeiden.
Was ist eine Injektion?
Die sogenannte Injektion bedeutet, dass die Daten nicht gefiltert werden und nicht vertrauenswürdige Inhalte direkt in den Systeminterpreter geschrieben werden. Schlimmer noch, der Angreifer kann davon profitieren volle Berechtigungen auf dem System.
Zum Beispiel:
Sehen Sie sich die folgende böswillige Abfrageanweisung an, die die SQL-Anweisung mit böswilligem Verhalten in die Variable $name einfügt und es dem Benutzer dann ermöglicht Die Pass-POST-Methode wird an das PHP-Skript übergeben, um den ultimativen Zweck zu erreichen, den eingehenden Schadcode für Angriffe zu verwenden.
// 将恶意代码,DROP TABLE 写入 $name 变量 $name = "Mark';DROP TABLE users; -- ";\ $query = "SELECT * FROM users WHERE name='$name'";
Nach der Analyse durch das PHP-Skript wird schließlich eine SQL-Anweisung wie diese generiert:
SELECT * FROM users WHERE name='Mark';DROP TABLE users; -- '
Wie Sie sich vielleicht vorstellen können, löscht die obige Anweisung die gesamte Benutzerdatentabelle aus der Datenbank .
Wie Yoda sagte:
Das ist zu gefährlich, ja, zu gefährlich.
Wie kann man böswillige Einschleusungen in PHP-Anwendungen verhindern?
Erstens wird tatsächlich nichts in die Datenbank eingefügt. Dieser Fehler ist lediglich auf die falsche Formatierung der Abfrageanweisung zurückzuführen. Die Lösung ist einfach, solange Sie die SQL-Anweisung korrekt formatieren oder die Abfrageanweisung und die Daten direkt separat verarbeiten.
Wie geht das? Verwenden Sie parametrisierte Abfragen, um Daten zu formatieren und Abfrageanweisungen von Daten zu trennen.
Durch die Verwendung parametrisierter Abfragen kann sichergestellt werden, dass das Programm nicht dem Risiko einer Injektion ausgesetzt ist.
Beispiele sind wie folgt:
$statement = $db->prepare('SELECT * FROM table WHERE id = ? and name = ? ');\ $statement->execute([1, "Mark"]);
Darüber hinaus gibt es eine sichere Möglichkeit, ORM (Object Relational Mapping) oder den Abfrage-Builder im Projekt zu verwenden.
Was ich empfehlen möchte ist Eloquent, das auch vom berühmten PHP-Framework Laravel verwendet wird. Als Nächstes werde ich Ihnen beibringen, wie Sie es installieren und verwenden. Dies kann uns dabei helfen, Daten zu formatieren, um Injektionsgefahren effektiv zu vermeiden.
Eloquent installieren
Vorbereitung
Bitte stellen Sie sicher, dass Sie PHP und Composer installiert haben.
Offizieller Start
Am besten installieren Sie den ORM zu Beginn des Projekts.
Angenommen, wir möchten eine Blog-Anwendung erstellen, einschließlich einer Beitragstabelle und einer Benutzertabelle.
Erstkonfiguration
Als erstes müssen Sie die Datei „composer.json“ für das Programm erstellen. Sie können Composer Init auf dem Terminal ausführen und den Anweisungen auf dem Terminal folgen.
Wenn Sie aufgefordert werden, Abhängigkeiten zu definieren, schreiben Sie illuminate/database . Die endgültige Ausgabe sollte wie im Bild oben aussehen. Jetzt können Sie die entsprechenden Abhängigkeiten im Projekt installieren, indem Sie „composer install“ ausführen.
Oder, wenn Sie bereits über die Datei „composer.json“ verfügen, können Sie „composer require illuminate/database“ direkt im Terminal eingeben, um die entsprechenden Abhängigkeiten zu installieren.
Jetzt müssen wir die Datei start.php im Stammverzeichnis der Anwendung erstellen und den folgenden Code in die Datei einfügen. Ich werde ihre Rolle unten erklären.
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();
In der ersten Zeile müssen wir die Datei Vendor/autoload.php importieren. Auf diese Weise können wir alle Pakete im Vendor-Verzeichnis laden.
Dann führen wir die Verwendung von IlluminateDatabaseCapsuleManager als Capsule ein und geben ihm einen Alias, damit wir ihn eloquent verwenden können.
Als nächstes erstellen wir ein Capsule-Objekt und initialisieren unsere Datenbankverbindung wie oben mit bootEloquent() .
Jetzt müssen wir natürlich als Erstes eine Datenbank namens test erstellen. Bitte stellen Sie sicher, dass Sie lokal den richtigen Benutzernamen und das richtige Passwort eingeben.
Migrationen / Datenmigration
Einer der größten Vorteile der Verwendung von Eloquent besteht darin, dass Sie Migrationen nutzen können.
Wenn Sie nicht verstehen, was Migrationen sind, können Sie die Erklärung unten lesen:
Migration ist eine Möglichkeit, Datentabellen über PHP-Code zu erstellen.
Migration in der Datei migrations.php erstellen:
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(); });
Der obige Code erstellt zwei Datentabellen über die Capsule-Klasse, eine ist die Benutzertabelle und die andere ist die Beitragstabelle bzw. das Feld Für sie werden Namen definiert.
Führen Sie diese Datei aus. Wenn Sie einen weißen Bildschirm sehen, bedeutet dies, dass die Migrationen erfolgreich ausgeführt werden. Jetzt können Sie die Datenbank öffnen, um zu sehen, ob diese beiden Tabellen generiert wurden.
Models
Jetzt müssen Sie nur noch die Model-Klasse erstellen, die der Datentabelle entspricht.
用了 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中文网!
Das obige ist der detaillierte Inhalt vonVerwenden Sie in Ihrem PHP-Projekt ausschließlich Laravel Eloquent-Abfragen, um SQL-Injection zu vermeiden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!