Aktueller Standort: Startseite> Neueste Artikel> Wie verhindern Sie die SQL -Injektion effektiv beim Löschen von Datenbankdatensätzen mithilfe der PHP -Löschfunktion? Sicherheitsleitfaden

Wie verhindern Sie die SQL -Injektion effektiv beim Löschen von Datenbankdatensätzen mithilfe der PHP -Löschfunktion? Sicherheitsleitfaden

gitbox 2025-06-15

Was ist die SQL -Injektion?

Die SQL -Injektion ist eine Angriffsmethode. Ein Angreifer manipuliert die Datenbank, um nicht autorisierte Operationen auszuführen, indem er böswilligen SQL -Code in SQL -Abfragen eingefügt wird. Bei Löschen von Anweisungen können Angreifer Daten löschen, die nicht durch SQL -Injektion gelöscht werden sollten, und können sogar die gesamte Datenbanktabelle löschen, wodurch schwerwiegende Sicherheitsrisiken eingebracht werden können.

1. Verwenden Sie vorbereitete Aussagen

Um die SQL -Injektion effektiv zu verhindern, besteht der am meisten empfohlene Ansatz darin, vorbereitete Aussagen zu verwenden. PHP liefert MySQLI- und PDO -Erweiterungen, die bei der Interaktion mit MySQL -Datenbanken verwendet werden und beide vorbereiteten Aussagen unterstützt werden. Auf diese Weise können SQL -Abfrage- und Eingabebenutzerdaten getrennt werden, wodurch verhindert werden, dass bösartige Eingaben in SQL -Anweisungen injiziert werden.

Verwenden Sie die MySQLI -Erweiterung, um zu löschen
 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// Datenbankverbindung</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"username"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database_name"</span></span><span>);

</span><span><span class="hljs-comment">// Überprüfen Sie die Verbindung</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Connection failed: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error);
}

</span><span><span class="hljs-comment">// Angenommen, wir wollen löschenIDAufzeichnungen von Werten, die einem Benutzer zur Verfügung gestellt wurden</span></span><span>
</span><span><span class="hljs-variable">$user_id</span></span><span> = </span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>];  </span><span><span class="hljs-comment">// ausURLLassen Sie den vom Benutzer bereitgestellten Benutzer erhaltenID</span></span><span>

</span><span><span class="hljs-comment">// Verwenden Sie vorbereitete Aussagen, um dies zu verhindernSQLInjektion</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"DELETE FROM users WHERE id = ?"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bind_param</span></span><span>(</span><span><span class="hljs-string">"i"</span></span><span>, </span><span><span class="hljs-variable">$user_id</span></span><span>);  </span><span><span class="hljs-comment">// "i" Gibt an, dass der Parameter ein ganzzahliger Typ ist</span></span><span>

</span><span><span class="hljs-comment">// Ausführungsanweisung</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();

</span><span><span class="hljs-comment">// Überprüfen Sie, ob die Löschung erfolgreich ist</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;affected_rows &gt; </span><span><span class="hljs-number">0</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Datensätze wurden gelöscht。"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Der Datensatz wurde nicht gefunden oder die Löschung fehlgeschlagen。"</span></span><span>;
}

</span><span><span class="hljs-comment">// Schließen Sie die Verbindung</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

Im obigen Code wird $ stmt-> bind_param () verwendet, um die ID- Eingabe vom Benutzer als Parameter zu binden. Ich meine, dass der Parameter ein ganzzahliger Typ ist. Dies kann die SQL -Injektion effektiv verhindern, da die vom Benutzer eingegebene ID sicher als Parameter an die SQL -Anweisung übergeben wird und nicht direkt in die SQL -Anweisung eingebettet wird.

Verwenden Sie die PDO -Erweiterung, um zu löschen
 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-comment">// Datenbankverbindung</span></span><span>
    </span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=database_name'</span></span><span>, </span><span><span class="hljs-string">'username'</span></span><span>, </span><span><span class="hljs-string">'password'</span></span><span>);
    </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">setAttribute</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">ATTR_ERRMODE</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">ERRMODE_EXCEPTION</span></span><span>);

    </span><span><span class="hljs-comment">// Angenommen, wir wollen löschenIDAufzeichnungen von Werten, die einem Benutzer zur Verfügung gestellt wurden</span></span><span>
    </span><span><span class="hljs-variable">$user_id</span></span><span> = </span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>];  </span><span><span class="hljs-comment">// ausURLLassen Sie den vom Benutzer bereitgestellten Benutzer erhaltenID</span></span><span>

    </span><span><span class="hljs-comment">// Verwenden Sie vorbereitete Aussagen</span></span><span>
    </span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"DELETE FROM users WHERE id = :id"</span></span><span>);
    </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">bindParam</span></span><span>(</span><span><span class="hljs-string">':id'</span></span><span>, </span><span><span class="hljs-variable">$user_id</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">PARAM_INT</span></span><span>);

    </span><span><span class="hljs-comment">// Ausführungsanweisung</span></span><span>
    </span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>();

    </span><span><span class="hljs-comment">// Überprüfen Sie, ob die Löschung erfolgreich ist</span></span><span>
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">rowCount</span></span><span>() &gt; </span><span><span class="hljs-number">0</span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Datensätze wurden gelöscht。"</span></span><span>;
    } </span><span><span class="hljs-keyword">else</span></span><span> {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Der Datensatz wurde nicht gefunden oder die Löschung fehlgeschlagen。"</span></span><span>;
    }

} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Fehler: "</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

In PDO wird BindParam () verwendet, um die vom Benutzer eingegebenen Parameter in eine SQL -Anweisung zu binden und seinen Typ als ganzzahliger Typ über PDO :: param_int anzugeben. Dies verhindert auch die SQL -Injektion.

2. Überprüfen Sie die Benutzereingabe mit regulären Ausdrücken oder Filtern

Zusätzlich zur Verwendung vorbereiteter Aussagen besteht ein weiterer effektiver Sicherheitsschutz darin, Benutzereingaben zu überprüfen und zu filtern. Bei Löschvorgängen, insbesondere für ID -Felder, ist es erforderlich, sicherzustellen, dass es sich um eine rechtliche Ganzzahl handelt.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$user_id</span></span><span> = </span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>];

</span><span><span class="hljs-comment">// Stellen Sie sicher, dass die Eingabe eine legale Ganzzahl ist</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">filter_var</span></span><span>(</span><span><span class="hljs-variable">$user_id</span></span><span>, FILTER_VALIDATE_INT)) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Ungültiger BenutzerID"</span></span><span>);
}

</span><span><span class="hljs-comment">// Führen Sie die Datenbank -Löschungsoperation durch</span></span><span>
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

Verwenden Sie die Funktion filter_var (), um zu überprüfen, ob die vom Benutzer bereitgestellte ID eine rechtliche Ganzzahl ist. Wenn nicht, wird die Ausführung direkt gestoppt. Diese zusätzliche Überprüfung kann die Sicherheit verbessern.

3. Verwenden Sie das Prinzip der geringsten Berechtigungen

Folgen Sie immer dem Prinzip der geringsten Berechtigungen, wenn Sie mit einer Datenbank interagieren. Das Datenbankkonto sollte nur die Erlaubnis haben, die erforderlichen Aktionen auszuführen. Beispielsweise sollte der Löschvorgang nur die Ausführung spezifischer Datenbankkonten ermöglichen, anstatt den Datenbankkonten vollständige Berechtigungen zu geben. Auf diese Weise werden die Maßnahmen, die ein Angreifer ausführen kann, auf diese Weise begrenzt, selbst wenn eine SQL -Injektionsanfälligkeit auftritt.

4. Verwenden Sie SQL -Protokolle und Überwachung

Um potenzielle SQL -Injektionsangriffe rechtzeitig zu erkennen, wird empfohlen, die SQL -Protokollierungsfunktion der Datenbank zu aktivieren und die Datenbank zu überwachen. Dies hilft, eine abnormale Aktivität zu verfolgen, wenn ein Angriff auftritt, und schnell vorbeugende Maßnahmen zu ergreifen.

5. Regelmäßige Updates und Patches

Schließlich ist die Aufrechterhaltung von PHP, Datenbanken und allen zugehörigen Komponenten der Schlüssel zur Verhinderung von Sicherheitslücken. Überprüfen Sie die Sicherheitshinweise häufig, um sicherzustellen, dass alle Systeme mit den neuesten Sicherheitspatches geladen werden.

  • Verwandte Tags:

    SQL