2017-07-06 1 views
0

ich php lernen und wurden im Anschluss an die OOP eine Datenklasse Tutorial Erstellung bei phpbridge.orgPhp Einfügen von Daten zu MySQL von Web Form sicher

Im Tutorial Daten, die sie nehmen Form von einem Pfosten und in die Datenbank einfügen. Hier

ist der Code:

Schritt 1: Das Formular

<h2>New Topic</h2> 
<form action="add.php" method="POST"> 
    <label> 
     Title: <input type="text" name="title"> 
    </label> 
    <br> 
    <label> 
     Description: 
     <br> 
     <textarea name="description" cols="50" rows="20"></textarea> 
    </label> 
    <br> 
    <input type="submit" value="Add Topic"> 
</form> 

Schritt 2 Php Datei

<?php 
require 'TopicData.php'; 

if (isset($_POST) && sizeof($_POST) > 0) { 
    $data = new TopicData(); 
    $data->add($_POST); 
} 
?> 

Schritt 3

Die Funktion in TopicData.php enthalten

public function add($data) 
{ 
    $query = $this->connection->prepare(
     "INSERT INTO topics (
      title, 
      description 
     ) VALUES (
      :title, 
      :description 
     )" 
    ); 

    $data = [ 
     ':title' => $data['title'], 
     ':description' => $data['description'] 
    ]; 

    $query->execute($data); 
} 

Meine Frage ist in Bezug auf Sicherheit. Bevor diese Daten in eine Datenbank eingefügt werden, wäre es nicht empfehlenswert, jedes Feld des Formulars über die Funktion filter_input() auszuführen. Sollten diese auch durch filter_var() laufen?

Wenn dies erforderlich ist, wie genau würde der Filtercode aussehen?

Danke!

+0

Der einzige Grund, den Sie filtern, ist, wenn Sie Einschränkungen haben, was passieren kann in einem bestimmten Bereich. Hast du irgendwelche Grenzen, was ein Titel oder eine Beschreibung enthalten kann? – tadman

+0

@tadman - Ich habe keine Beschränkungen für den Titel oder die Beschreibung. Ich hatte jedoch den Eindruck, niemals direkt aus Sicherheitsgründen auf $ _Post zuzugreifen, sondern benutze immer die Funktion filter_input(). Beschrieben hier: https://www.phparch.com/2010/07/never-use-_get-again/ – user1609391

+0

Dieser Artikel kann auch aus der Steinzeit stammen, aber es ist nicht alles falsch. Die Sache ist, dass Sie auf einen Typ beschränken müssen, wie Integer oder Float oder E-Mail, aber für einfache alte Strings ist es komplizierter. Was ist "gültig"? Normalerweise müssen Sie das genauer in Ihrem Code definieren. – tadman

Antwort

0

Die Datei TopicData.php verwendet vorbereitete SQL-Abfragen. Der Vorteil der Verwendung von vorbereiteten Abfragen besteht darin, dass die Möglichkeit einer SQL-Injection ausgeschlossen wird, sofern die SQL-Abfrage nicht auf externen Eingaben basiert. Bei Verwendung vorbereiteter Abfragen wird die Vorlage der Abfrage getrennt von den Daten gesendet. Dies hat viele Vorteile, die hier beschrieben werden: https://www.w3schools.com/php/php_mysql_prepared_statements.asp

Es beseitigt die Notwendigkeit, Formulardaten zu desinfizieren. Allerdings müssen die Formulardaten möglicherweise noch mit den Funktionen filter_var gefiltert werden, wenn eine Validierung erforderlich ist, z. B. maximale Stringlänge, maximale und minimale Werte usw.

+0

@Nadir_Latif, Sie haben angegeben, "vorausgesetzt, die SQL-Abfrage basiert nicht auf externen Eingaben.". Was meinst du damit? Wäre es auch sicher zu sagen, wenn ich PDO mit dem Attribut attr_emulate_prepares verwende, false für alle Formulardaten, die an MySQL übergeben werden, das ist die beste Methode, um die sql-Injektion zu verhindern? – user1609391

+0

Wenn die SQL-Abfrage Variablen enthält. Zum Beispiel: '" INSERT INTO $ table_name ($ field_name1, $ field_name2) VALUES ($ title_value, $ description) "', dann erhöht sich die Möglichkeit der SQL-Injektion. Wenn eine der in der Abfrage verwendeten Variablen, z. B. $ table_name oder $ title_value, vom Benutzer gesendet wird, kann er bösartigen Code in die SQL-Abfrage einfügen. Bei Verwendung vorbereiteter Abfragen sollte die Abfrage keine Variablen enthalten. Stattdessen sollten Platzhalter verwendet werden wie: Titel oder? wie du es getan hast. –

+0

Nun bestimmt das Attribut attr_emulate_prepares, ob der Datenbanktreiber immer emulierte vorbereitete Anweisungen verwenden soll. Einige Datenbanktreiber unterstützen keine vorbereiteten Anweisungen. In solchen Fällen emuliert das PDO die vorbereitete Abfrage, so dass es eine konsistente Schnittstelle für den Zugriff auf Datenbanktreiber gibt. Sie sollten den Standardwert für attr_emulate_prepares nicht ändern müssen –