Autor | Zpráva | ||
---|---|---|---|
Leo Profil |
#1 · Zasláno: 14. 7. 2013, 13:26:16
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 |
#2 · Zasláno: 14. 7. 2013, 13:50:10
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 |
#3 · Zasláno: 14. 7. 2013, 14:16:17
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 '; ', password=PASSWORD('heslo'), @x=' SET @jmeno = '', password=PASSWORD('heslo'), @x=' '; 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 |
#5 · Zasláno: 14. 7. 2013, 22:08:28
Joker: Zajímavá myšlenka, šlo mi sice hlavně o ten rozdíl mezi proměnnou a prepared statement, ale prozkoumám...
|
||
Časová prodleva: 11 let
|
0