Autor Zpráva
Tomashekk
Profil
Když něco ukládám do MySQL, tak to neošetřuju, prostě o tam uložím, ale potřeboval bych to tedy teď zabezpečit alespoň na tom výpisu. Jakýma funkcema to tedy ošetřit? Potřeboval bych to udělat tak, aby když je tam HTML kod, tak ho nevypsal či "nespustil", vše to mám ukládané pomocí BB tagů (jak celé forum, tak i články)

a také, jak udělat to, když uložím data z textarea do mysql, tak aby se mi zachovalo odřádkování. toto už udělat u zápisu? Popř. trochu nastínit způsoby, zda-li by to šlo. Děkuji
Str4wberry
Profil
Viz htmlspecialchars a nl2br.
Tomashekk
Profil
Str4wberry:
a při ukládání také prohnat nějakou funkcí?
Joker
Profil
Tomashekk:
Když něco ukládám do MySQL, tak to neošetřuju, prostě o tam uložím
To se doufám týká jen HTML. Nebo se snad neošetřuje vůbec nic?
Tj. když uživatel řekněme zadá text: ' where 1=1--, provede se dotaz UPDATE tabulka SET sloupec='' WHERE 1=1--' WHERE id=1 a vymaže to text ve všech řádcích?
Tomashekk
Profil
Joker:
No já to neošetřuju zatím nijak... zatím to píšu, proto se ptám, jak to vše nejlépe ošetřit, jak při zápisu, tak i při výpisu
Takže zápis stačí ošetřovat pomocí mysql_real_escape_string() a výpis pomocí htmlspecialchars() ??
Takže toto by mělo být ok ne?
<?
function safe_zapis($value){ //ošetření při zápisu do MySQL
   return mysql_real_escape_string($value);
}
function safe_vypis($value){ //ošetření při výpisu z MySQL
   return htmlspecialchars($value,ENT_NOQUOTES);
}
function safe_vypis_bb($value){ //ošetření při výpisu z MySQL + konvert BB na HTML + /n na <br>
   return bb2html(nl2br(htmlspecialchars($value,ENT_NOQUOTES)));
} ?>
AM_
Profil
Tomashekk:
Co se týče escapování je to správně (po dlouhé době vidím na fóru někoho /z tazatelů/, kdo escapování správně pochopil).

První funkce (safe_zapis) není OK. je totiž úplně zbytečná. "přejmenovávat" vestavěné funkce je ošklivý zlozvyk, který dodává autorovi falešný pocit používání (pro něj) přehlednějšího jména, a dokonale znemožňuje práci člověka, který po tobě jednou kód bude číst.
Druhá funkce (safe_vypis) také není OK.
- má podobné jméno jako safe_zapis. Na první pohled jsem si nevšiml rozdílu. Za týden nebudeš vědět, která je která, a to bude teprva hokej.
- nejenže je k ničemu, ale máš nějaký důvod používat ENT_NOQUOTES? Chápal bych, že gurmáni používají ENT_QUOTES, aby se korektně oescapovaly i apostrofy, což by dle mého názoru měl být default (autoři PHP zvolili jako default kompatibilitu s dřívějšími verzemi, což také není špatná volba). Ale psát vlastní funkci na to, abys zavolal vestavěnou a ještě jí vypnul chování, které je užitečné, to není moc moudré.
Třetí funkci nemůžu vytknout nic tak zásadního, já bych ale stejně ani pro tři do sebe vnořené funkce nepsal svojí vlastní, která je vnořeně zavolá, ze stejného důvodu jako jsem uvedl u safe_zapis.
Snad jen, když už jsi si tak užíval psaní vlastních funkcí, měla by vypadat takto:
return bb2html(nl2br(safe_vypis($value)));

ale vlastně neměla, protože jak jsem říkal, safe_vypis je hloupost. Jen to poukazuje na to, že v těchto třech funkcích není nic chytrého.
Alphard
Profil
Tomashekk:
Takže zápis stačí ošetřovat pomocí mysql_real_escape_string()
Pro MySQL ano.

ýpis pomocí htmlspecialchars()
Záleží na kontextu.

Tip:
function safe_zapis($value)
Pro ladění aplikace se hodí možnost vypsat hned i chybu. Když k tomu dodáte pár dalších nápadů, zjistíte, že by se vám třeba líbila nějaká vyšší vrstva. Třeba vás zaujem dibi.
Tomashekk
Profil
AM:
takže u zápisu mám volat mysql_real_escape_string()?

a u výpisů to mám tedy vypisovat? takže bb2html(nl2br(htmlspecialchars($aa))); ??


Alphard:
Pro MySQL ano.
tím myslíte co? toto mám u všech atributů při zápisu do MySQL

Záleží na kontextu.
jedná se jen o hloupej výpis obyčejného fora a článků (jsou tam maximálně BB kody), ale zase aby mi to nevypsalo ani PHP skript (kdyby někdo chtěl škodit a napsal ho tam), prostě aby to nemohlo nějak nabourat web

Pro ladění aplikace se hodí možnost vypsat hned i chybu. Když k tomu dodáte pár dalších nápadů, zjistíte, že by se vám třeba líbila nějaká vyšší vrstva. Třeba vás zaujem dibi.
toto už asi jde mimo mne.. ale snad k tomu jednou dojdu
AM_
Profil
Tomashekk:
takže u zápisu mám volat mysql_real_escape_string()?
ano, snad je vidět, že technicky v tom není rozdíl. a je to jednoznačně přehlednější.

a u výpisů to mám tedy vypisovat? takže bb2html(nl2br(htmlspecialchars($aa))); ??
je to na tobě, pro tři vnořené funkce už je dobré téma diskuse zda je obalit vlastní funkcí, já osobně bych to asi nedělal, předpokládám, že funkci nevoláš víc jak na 5ti různých místech. Pokud bys ji volal často, tak už by to stálo za zvážení do té funkce dát.
Tomashekk
Profil
AM:
ano, snad je vidět, že technicky v tom není rozdíl. a je to jednoznačně přehlednější.
ano to je pravda.

předpokládám, že funkci nevoláš víc jak na 5ti různých místech. Pokud bys ji volal často, tak už by to stálo za zvážení do té funkce dát.
No tyhle funkce volám u každého výpisu datovýho typu TEXT. To vždy obsahuje BB kody (články -3x [jsou u toho i komentáře], forum -1x, fotogalerie -1x[popis fotky], kdekolik kde maj uživatelé svůj podpis)
_________________________________________________________________
sečteno podtrženo. toto teda stačí? pro zapís escapovat a při výpisu teda special chars?
Joker
Profil
Tomashekk:
toto mám u všech atributů při zápisu do MySQL
K tomu dodám, že to zase není nejlepší řešení úplně vždycky.
Například pokud vstup je číslo, je lepší zajistit, že to opravdu bude číslo (třeba přes intval) a pak už není třeba escapovat.
Přesněji jestliže vstupní data byla už předtím nějak zvalidovaná a nemohou obsahovat nebezpečné znaky, není třeba escapovat. Ovšem escapování „navíc“ asi uškodit nemůže (s výjimkou případu, kdy by vstupní data byla přímo část/celý SQL dotaz, ale to začátečník vůbec nebude potřebovat).

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: