In der modernen PHP -Entwicklung ist Sicherheit eines der Probleme, die wir Prioritäten setzen müssen, insbesondere bei der Behandlung von Datenbankabfragen. Die SQL -Injektion ist eine gemeinsame Angriffsmethode, bei der Angreifer Datenbanken durch Injektion böswilliger SQL -Code manipulieren können. Daher kann die rationale Verwendung vorbereiteter Aussagen und Pdostatement :: FetchObject -Methoden solche Risiken effektiv verhindern.
PDO (PHP -Datenobjekte) ist eine von PHP bereitgestellte Datenbankzugriffsabstraktionsschicht, mit der Sie konsistent auf mehrere verschiedene Datenbanken zugreifen können.
Vorbereitete Aussagen sind ein von PDO bereitgestellter Mechanismus, mit dem Sie zuerst SQL -Strukturen definieren und anschließend die Parameter binden, sodass der Benutzer, selbst wenn der Benutzer einen böswilligen Code eingibt, nicht als SQL ausgeführt wird, wodurch Injektionsangriffe verhindert werden.
Beispiel:
<?php
// erstellen PDO Beispiel
$pdo = new PDO('mysql:host=localhost;dbname=testdb;charset=utf8mb4', 'username', 'password');
// Abfrage mit Vorverarbeitungsanweisung
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute(['id' => $_GET['id']]);
// Holen Sie sich das Ergebnis als Objekt
$user = $stmt->fetchObject();
if ($user) {
echo "Benutzername: " . htmlspecialchars($user->username, ENT_QUOTES, 'UTF-8');
} else {
echo "Benutzer nicht gefunden。";
}
?>
In diesem Beispiel wird der Platzhalter : ID verwendet, um die Parameter zu binden, und PDO behandelt automatisch das Fluchtproblem, wodurch die SQL -Injektion vermieden wird.
Mit der FetchObject -Methode können wir das Abfrageergebnis direkt als Objekt zurückgeben. Standardmäßig wird ein anonymer STD -Class -Objekt zurückgegeben. Sie können jedoch auch eine benutzerdefinierte Klasse angeben, um die Daten zu hosten.
Angenommen, wir haben eine Benutzerklasse :
<?php
class User {
public $id;
public $username;
public $email;
}
?>
Geben Sie den Klassennamen an, wenn Sie FetchObject verwenden:
<?php
$stmt = $pdo->prepare('SELECT id, username, email FROM users WHERE id = :id');
$stmt->execute(['id' => $_GET['id']]);
$user = $stmt->fetchObject('User');
if ($user) {
echo "Willkommen, " . htmlspecialchars($user->username, ENT_QUOTES, 'UTF-8');
}
?>
Der Vorteil davon ist, dass die Struktur später klarer und leichter zu erweitern ist. Beispielsweise können Sie der Benutzerklasse Methoden zur logischen Verarbeitung hinzufügen.
Auch wenn PDO und FetchObject verwendet werden, sollten die folgenden Punkte immer noch beachtet werden:
Niemals direkt von den Benutzern eingegebene SQL -Anweisungen.
Verwenden Sie immer Platzhalter (genannte Platzhalter oder Fragemarke -Platzhalter) und binden Sie Parameter.
Verwenden Sie HTMLSpecialChars , um die Ausgabe von Inhalten auf Webseiten ordnungsgemäß zu entkommen, um XSS -Angriffe zu verhindern.
Legen Sie beispielsweise die entsprechenden Fehlerbehandlungsmodi ein:
<?php
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
?>
Unterscheiden Sie zwischen Entwicklungs- und Produktionsumgebungen. Die Produktionsumgebung sollte die direkte Anzeige von Fehlermeldungen verbieten, um zu verhindern, dass die Datenbankstruktur durchgesickert wird.
Ein robustes System sollte in der Lage sein, Datenbankfehler anmutig zu behandeln. Zum Beispiel:
<?php
try {
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$stmt->execute(['id' => $_GET['id']]);
$user = $stmt->fetchObject('User');
if (!$user) {
header('Location: https://gitbox.net/not-found');
exit;
}
echo "Hallo, " . htmlspecialchars($user->username, ENT_QUOTES, 'UTF-8');
} catch (PDOException $e) {
error_log($e->getMessage());
header('Location: https://gitbox.net/error');
exit;
}
?>
In diesem Beispiel fangen wir den Abfragefehler durch Ausnahmebehandlung an und springen in die Situation zur freundlichen Fehlerseite.