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

Injekční útok, který uspěje s mysql_query, ale selže s mysqli_query

Byl jsem přiveden k přesvědčení, že:

$selection = mysql_query($dblink, "SELECT * FROM table WHERE name='$idValue' ");

lze snadno kompromitovat pomocí hodnot pro $idValue které zavírají ' a poté přidejte další příkazy, například

$idValue = "z'; DELETE * FROM table WHERE name IS NOT NULL";

I když si uvědomuji, že uvádíte, že je zakázáno více příkazů, něco, co není tak hrozné, by bylo vrátit neautorizovaná data namísto přímé úpravy dat v tabulce, jako například:

  $idValue = "z' OR name IS NOT NULL OR name = 'x";

Zatímco u MySQLi existuje možnost že tento přístup lze použít s prepared statements , což by zabránilo tomu, aby se proměnná chovala mimo svůj status pouze jako proměnná. Například:

mysqli->prepare("SELECT * FROM tables WHERE name = ? LIMIT 1");
mysqli->bind_param("s",$idValue);
mysqli->execute();

Jak rozumím bind_param je, že proměnná by měla všechna klíčová slova a klíčové znaky MySQL uniklá, čímž by se zabránilo narušení bezpečnosti a návratu neoprávněných řádků.

Toto je volba, kterou MySQL nemá . Připravená prohlášení pomáhají zlepšovat zabezpečení vstřikování, ale nezabrání injekční útoky samotné, ale programátor by měl použít více jako součást širší strategie.

Stejně jako nošení neprůstřelných vesty vás neučiní neporazitelnými, ale výrazně zvýší vaše šance na přežití. MySQLi není zázračná kulka, stejně jako PDO, ale celkově zlepší úroveň zabezpečení.

MySQL je také zastaralá a jak uvedl Christopher, její neudržování znamená, že počet děr a problémů s ní bude jen narůstat, jak se budou další technologie vyvíjet.

Shrnutí

Pokud napíšete MySQLi příkazy stejným způsobem, jako jste napsali příkazy MySQL, nebudete mít žádnou další ochranu před injekcemi. MySQLi však nabízí Prepared Statements přístup, který výrazně zvyšuje obranu proti SQL injection, ale samotná změna základního databázového rozhraní vám nepřináší žádné výhody ani ochranu pokud se nerozhodnete je nakódovat sami pomocí připravených příkazů .



  1. Jak získám aktuální rok pomocí SQL na Oracle?

  2. duplicitní položky mysql a php

  3. ListView Control s Ms-Access TreeView

  4. Jak exkluzivní zámek mysql databáze?