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

PHP MySQLI Zabránit SQL Injection

Lze vložit jakýkoli dotaz, ať už je čtení nebo zápis, trvalý nebo přechodný. Injekce lze provést ukončením jednoho dotazu a spuštěním samostatného (možné pomocí mysqli ), což činí zamýšlený dotaz irelevantním.

Jakýkoli vstup do dotazu z externího zdroje, ať už od uživatelů nebo dokonce interní, by měl být považován za argument dotazu a parametr v kontextu dotazu. Každý parametr v dotazu musí být parametrizován. To vede ke správně parametrizovanému dotazu, ze kterého můžete vytvořit připravený příkaz a spustit jej s argumenty. Například:

SELECT col1 FROM t1 WHERE col2 = ?

? je zástupný symbol pro parametr. Pomocí mysqli , můžete vytvořit připravený výpis pomocí prepare , svázat proměnnou (argument) s parametrem pomocí bind_param a spusťte dotaz pomocí execute . Hádku nemusíte vůbec sanovat (ve skutečnosti je to na škodu). mysqli dělá to pro vás. Celý proces by byl:

$stmt = $mysqli->prepare("SELECT col1 FROM t1 WHERE col2 = ?");
$stmt->bind_param("s", $col2_arg);
$stmt->execute();

Existuje také důležitý rozdíl mezi parametrizovaným dotazem a připravené prohlášení . Toto prohlášení, i když je připraveno, není parametrizováno, a je tedy náchylné na injekci:

$stmt = $mysqli->prepare("INSERT INTO t1 VALUES ($_POST[user_input])");

Abych to shrnul:

  • Vše Dotazy by měly být správně parametrizovány (pokud nemají žádné parametry)
  • Vše s argumenty dotazu by se mělo zacházet co nejvíce nepřátelsky bez ohledu na jejich zdroj



  1. Analytické funkce LEAD a LAG

  2. Nejrychlejší způsob importu velkého souboru CSV do MySql pomocí MySql CLI

  3. Implementace vlastního řazení

  4. Získávání výsledků mezi dvěma daty v PostgreSQL