Autor Zpráva
Leo
Profil
Je nutné k prevenci SQL injection použít prepared statement (PREPARE... EXECUTE), nestačí jen použít uživatelskou proměnnou v běžném SQL dotazu?

SELECT jmeno FROM osoby WHERE id_osoba = 5; -- Pepa

SELECT jmeno FROM osoby WHERE id_osoba = 5 OR '1'; -- všichni

kde 5 OR '1' je vstup od uživatele

PREPARE prikaz FROM 'SELECT jmeno FROM osoby WHERE id_osoba = ?';
SET @id = 5;
EXECUTE prikaz USING @id; -- Pepa
SET @id = "5 OR '1'";
EXECUTE prikaz USING @id; -- taky jen Pepa

ale Pepu vrátí i jen prostý dotaz s proměnnou

SELECT jmeno FROM osoby WHERE id_osoba = @id;

a to v případě, že hodnota @id je 5 OR '1'
juriad
Profil
Obvykle stačí při vytváření dotazu prohnat hodnotu přes funkci, která to zařídí.
Přiklad pro mysql:
$sql = "SELECT jmeno FROM osoby WHERE id_osoba = " . mysql_real_escape_string("5; -- Pepa");
Leo
Profil
Já ale nemluvím o PHP, ale o MySQL.
Joker
Profil
Leo:
Podle mě to nestačí a myšlenka, že přiřazení do proměnné skousne neescapovaná data, je chybná.

Příklad:
Systémem připravená konstrukce:
SET @jmeno = 'vstup ';
Vstup:
', password=PASSWORD('heslo'), @x='
Výsledek:
SET @jmeno = '', password=PASSWORD('heslo'), @x=' ';
→ Pokud to dovolí nastavení práv, změní heslo pro připojení k databázi na „heslo“.

Možná ještě doplním vysvětlivku, kdyby někomu nebylo jasné, co se tam děje: Příkaz SET umožňuje řetězit nastavení několika proměnných, oddělených čárkami. A password je systémová proměnná pro uživatelovo heslo, takže SET password nastaví heslo.
Leo
Profil
Joker: Zajímavá myšlenka, šlo mi sice hlavně o ten rozdíl mezi proměnnou a prepared statement, ale prozkoumám...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: