Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Ist $_SESSION sicher vor SQL-Injektionen?

Sie müssen nicht wirklich testen, ob die Eingabe numerisch ist, da in MySQL jede Zeichenfolge, z. '123abc' in einem numerischen Kontext (wie ein Vergleich mit einer ganzzahligen Spalte id ) nimmt implizit nur die Ziffern und ignoriert den Rest. Eine nicht numerische Zeichenfolge wie 'abc' hat einfach den ganzzahligen Wert 0, weil es keine führenden Ziffern gibt.

Der Punkt ist, dass Werte vor SQL-Injektion sicher sind, wenn Sie Abfrageparameter verwenden. Ob die Eingaben von $_SESSION oder einer anderen Quelle stammen, spielt keine Rolle. $_SESSION ist in Bezug auf SQL-Injection weder sicher noch unsicher, es kommt darauf an, wie Sie die Daten an Ihre Abfrage übergeben.

Ich würde auch den Code vereinfachen, um die Liste der Parameterplatzhalter zu formatieren:

$placeholders = implode(',', array_fill(1, count((array)$_SESSION['story']), '?'));

Und vergessen Sie bindParam(), übergeben Sie einfach das Array an execute() .

//Collect all data needed
$storyQuery = openConnection() -> prepare("SELECT * FROM `stories` 
    WHERE `id` IN ({$placeholders})");
$storyQuery -> execute((array)$_SESSION['story']);
$story = $storyQuery -> fetchAll();

Zu Ihrem Kommentar:

In PDO können Sie entweder benannte Parameter wie :id verwenden , oder Sie können Positionsparameter verwenden, die immer ? sind (Aber mischen Sie diese beiden Typen nicht in einer bestimmten Abfrage, verwenden Sie den einen oder den anderen).

Übergeben eines Arrays an execute() bindet die Array-Elemente automatisch an die Parameter. Ein einfaches Array (d. h. durch Ganzzahlen indiziert) lässt sich leicht an Positionsparameter binden.

Wenn Sie benannte Parameter verwenden, müssen Sie ein assoziatives Array übergeben, bei dem die Schlüssel des Arrays mit den Parameternamen übereinstimmen. Den Arrayschlüsseln kann optional : vorangestellt werden aber es ist nicht erforderlich.

Wenn Sie neu bei PDO sind, lohnt es sich wirklich, die Dokumentation zu lesen . Es gibt Codebeispiele und alles!