sql >> Databáze >  >> RDS >> Mysql

Je $_SESSION bezpečný před SQL injects?

Opravdu nemusíte testovat, zda je vstup číselný, protože v MySQL je jakýkoli řetězec, např. '123abc' v číselném kontextu (jako při srovnání s celočíselným sloupcem id ) implicitně bere pouze číslice a zbytek ignoruje. Nečíselný řetězec jako 'abc' má jednoduše celočíselnou hodnotu 0, protože zde nejsou žádné úvodní číslice.

Jde o to, že hodnoty jsou v bezpečí před SQL injection, pokud používáte parametry dotazu. Zda vstupy pocházejí z $_SESSION nebo jiného zdroje, je irelevantní. $_SESSION není ani bezpečný, ani nebezpečný s ohledem na SQL injection, záleží na tom, jak předáte data vašemu dotazu.

Také bych zjednodušil kód pro formátování seznamu zástupných symbolů parametrů:

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

A zapomeňte na bindParam(), prostě předejte pole do execute() .

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

K vašemu komentáři:

V PDO můžete použít buď pojmenované parametry jako :id , nebo můžete použít poziční parametry, které jsou vždy ? (ale nesměšujte tyto dva typy v daném dotazu, použijte jeden nebo druhý).

Předání pole do execute() automaticky sváže prvky pole s parametry. Jednoduché pole (tj. indexované celými čísly) lze snadno svázat s pozičními parametry.

Pokud používáte pojmenované parametry, musíte předat asociativní pole, kde se klíče pole shodují s názvy parametrů. Klíče pole mohou být volitelně opatřeny předponou : ale není to povinné.

Pokud s PDO začínáte, opravdu se vyplatí přečíst si dokumentaci . Existují příklady kódu a všechno!



  1. Jak vyhledat přesné číslo v php

  2. rozdíl mezi dvěma po sobě jdoucími řádky v mysql

  3. Nejlepší způsob, jak zjistit chybějící 3 nebo více po sobě jdoucích záznamů

  4. Výstup výsledků dotazu SQLite jako příkaz INSERT