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"); $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 '; SET @jmeno = 'vstup '; ', password=PASSWORD('heslo'), @x=' ', password=PASSWORD('heslo'), @x=' SET @jmeno = '', 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: 12 let
|
Toto vlákno je staré, již dlouho do něj nikdo nepřispíval.
Informace a odkazy zde uváděné už nemusejí být aktuální. Nechcete-li řešit zde uvedenou konkrétní otázku, založte si vlastní vlákno, nepište do tohoto. Vložíte-li sem nyní příspěvek, upoutáte pozornost mnoha lidí a někteří z nich si jen kvůli vám přečtou i všechny předcházející příspěvky. Předpokládáte-li, že váš text skutečně bude hodnotný, stiskněte následující tlačítko:
Běda vám, jestli to bude blábol.
0