Ochranenie sql vstupu

Programovacie jazyky, rady, poradňa...
ehm123
King
King
Príspevky: 1658
Registrovaný: 27 feb 2006, 6:45
Bydlisko: PD / Praha

Ochranenie sql vstupu

Príspevok od používateľa ehm123 »

mno pisem,pisem blogacky system ale zabudol som na ochranu sql vstupu...

mno riesim to nejak takto

Kód: Vybrať všetko

'SELECT * FROM `kategorie` WHERE CONVERT(`ID` USING utf8) = "' . quote_smart($id_blogu) . '"'

+funkcia

// Quote variable to make safe
function quote_smart($value)
{
    // Stripslashes
    if (get_magic_quotes_gpc()) {
        $value = stripslashes($value);
    }
    // Quote if not integer
    if (!is_numeric($value)) {
        $value = "'" . mysql_real_escape_string($value) . "'";
    }
    return $value;
}
vydel som to na php.net tak povedzte ci je to bezpecne...skor nez prepisem do toho cely system...ak existuje nieco lepsie ... pisnite
turtlak69
Guru
Guru
Príspevky: 2896
Registrovaný: 10 máj 2007, 15:58
Bydlisko: /dev/null

Príspevok od používateľa turtlak69 »

ked toho zatial nemas vela spraveneho, tak radsej si osetri vstup ako vystup. pre istotu. ja som si vsetup do DB osetril klasicky htmlspecialchars, ale obcas mi treba aj nejake to br vlozit a tak mozem pouzit aj funkciu nl2br a stale je to bezpecne. takze obcas sa aj nejaky ten tag moze primiesat ;) radsej osetrit vstup ako vystup ;)
ehm123
King
King
Príspevky: 1658
Registrovaný: 27 feb 2006, 6:45
Bydlisko: PD / Praha

Príspevok od používateľa ehm123 »

turtlak69 napísal:ked toho zatial nemas vela spraveneho, tak radsej si osetri vstup ako vystup. pre istotu. ja som si vsetup do DB osetril klasicky htmlspecialchars, ale obcas mi treba aj nejake to br vlozit a tak mozem pouzit aj funkciu nl2br a stale je to bezpecne. takze obcas sa aj nejaky ten tag moze primiesat ;) radsej osetrit vstup ako vystup ;)
mno ja do vstupu vkladam vsetko...len ho potrebujem osetrit kvoli sql injection...

pretoze keby to upravim bol by problem pri uprave clankov pretoze by som dostal z sql query tagy...ktore by som po zmene previedol na entili a bolo by to v ****

ja mam clanky atd robene v takzvanom bb kode....podobne (niektore detaili aj z) phpbb
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

ta funkcia nie je dobra. pretoze je pouzitelna len pre veci zo superglobalnych poli GET,POST a COOKIE. Ak by si chcel escapnut premennu ktora ti vznikla v skripte tak to fungovat nebude. prave kvoli tomu ze pri zapnutom magic_quotes to bude povazovat za automaticky osetrene. cele magic_quotes je jedna obroska chyba vo vyvoji php.
najlepsie co mozete urobit je na zaciatok kazdeho skriptu vlozit funkciu ktora tieto superglobalne polia vrati do povodneho stavu. nebudem to tu pisat lebo v komentoch na php.net to urcite je.
co sa tyka osetrovania htmlcharacters uz pri vkladani do databazy => hlupost. Databaza ma sluzit ako zdroj udajov. to ze jeden z prostriedkov ako tieto udaje prezentujete je HTML neznamena ze nemoze byt iny sposob. Ak by nastala situacia ze by ste tie udaje chceli pouzit vo worde, exceli, latexe pripadne importnut ich do nejakej inej aplikacie mate problem, pretoze v DB uz nie su originalne data, ale data upravene a prisposobene na jeden jediny sposob zobrazovania.
Preto htmlspecialchars davajte stale pri zobrazovani udajov z DB alebo z ineho zdroja udajov.
ehm123
King
King
Príspevky: 1658
Registrovaný: 27 feb 2006, 6:45
Bydlisko: PD / Praha

Príspevok od používateľa ehm123 »

a keby som to takto

Kód: Vybrať všetko

'SELECT * FROM `kategorie` WHERE CONVERT(`ID` USING utf8) = "' . mysql_real_escape_string($id_blogu) . '"'
??

alebo este taketo riesenie som nasiel na php.net

Kód: Vybrať všetko

function query($query) {
  $args  = func_get_args();
  $query = array_shift($args);
  $query = str_replace("?", "%s", $query);
  $args  = array_map('mysql_real_escape_string', $args);
  array_unshift($args,$query);
  $query = call_user_func_array('sprintf',$args);
  $result = mysql_query($query) or die('Query failed: ' . mysql_error());
  return $result;
}

query("SELECT * FROM `kategorie` WHERE CONVERT(`ID` USING utf8) = '?'", $id_blogu);
Napísať odpoveď