Zadejte hledaný výraz...
Jakub Glos
Webtrh.cz
Vývoj webových stránek na WordPressu a proklientský přístup pro freelancery
Třídenní infromacemi nabitý prezenční + online kurz v Praze od Webtrhu pouze za 2 871 Kč
Více informací

Escapování znaků php vs Smarty

protected
verified
rating uzivatele
(13 hodnocení)
5. 3. 2017 02:19:06
Ahoj,
řešil už docela dlouho tento problém.
Dělám nový projekt, kde uživatel může psát do konverzace. Konverzace může mít oddělené řádky (prostě odentrování).
Nechci řešit escapování znaků před vložením do dtb, protože samotné záznamy v mysql budou nečitelné.
Když ale řeším escapování na urovni šablony (Smarty), tak se mi znaky vypíší escapované.
Potřebuji je tedy escapovat na urovni PHP, protože pak se vypíší správně.
Ale jak na to, když z mysql dostanu multirozměrné pole a nikde sem nenašel funkční návod, jak escapovat celé pole.
Jsem fakt bezradnej.
Díky za rdy, Petr
---------- Příspěvek doplněn 05.03.2017 v 02:54 ----------
ted sem našel funkční řešení
celá výstup z dtb projedu tímto
$m = $results->getrows();
function myFunc(&$item, $key) {
$item = cstring($item);
}
array_walk_recursive($m,'myFunc');
STemplate::assign('m',$m);
funguje to ok.. máte k tomu nějaké připomínky?
5. 3. 2017 02:19:06
https://webtrh.cz/diskuse/escapovani-znaku-php-vs-smarty/#reply1264726
TomasX
verified
rating uzivatele
(4 hodnocení)
5. 3. 2017 11:40:20
data escapovat do mysql musíš, aby ti tam nevniklo sql injection. Buď ti to dělá DB vrstva, pokud máš něco chytřejšího nebo to obejdi přes prepared statements.
Popravdě nevím o co se snažíš, ale pokud může uživatel přímo zadávat kód pro smarty, byl bych opatrné, je v tom obrovské bezpečnostní riziko, smarty je v tomhle trochu problematické a dají se tam vymyslet konstrukce, které jednak shodí php a jednak spustí to co nechceš.
Pokud chceš do db uložit celé php pole, dá se udělat něco ve stylu json_encode() > save to db > read from db > json_decode(). Použití seralize na vnější objekty nedoporučuji, je tam řada security issue.
5. 3. 2017 11:40:20
https://webtrh.cz/diskuse/escapovani-znaku-php-vs-smarty/#reply1264725
Napsal TomášX;1369580
data escapovat do mysql musíš, aby ti tam nevniklo sql injection. Buď ti to dělá DB vrstva, pokud máš něco chytřejšího nebo to obejdi přes prepared statements.
Popravdě nevím o co se snažíš, ale pokud může uživatel přímo zadávat kód pro smarty, byl bych opatrné, je v tom obrovské bezpečnostní riziko, smarty je v tomhle trochu problematické a dají se tam vymyslet konstrukce, které jednak shodí php a jednak spustí to co nechceš.
Pokud chceš do db uložit celé php pole, dá se udělat něco ve stylu json_encode() > save to db > read from db > json_decode(). Použití seralize na vnější objekty nedoporučuji, je tam řada security issue.
Nechci rypat ale presne pro toto serializace objektu vznikla, ne ? :D Aby se dali rozumne prenaset po siti / ukladat.
Jinak k otazce ... neznam Smarty, ale Nette (resp. Latte) ma na toto filtry, kde lze vypsat string neescapovany, google mi u smarty vyhodil toto, tak mozna to muze :) http://www.smarty.net/docs/en/language.modifier.unescape.tpl
5. 3. 2017 11:50:04
https://webtrh.cz/diskuse/escapovani-znaku-php-vs-smarty/#reply1264724
protected
verified
rating uzivatele
(13 hodnocení)
5. 3. 2017 11:55:49
pro zápis do dtb nepoužívám přece htmlspecialchars ale mysql_real_escape_string
fce unescape je ok, když to escapované píšeš do dtb, což já nechci (přijde mi nesmyslné)
5. 3. 2017 11:55:49
https://webtrh.cz/diskuse/escapovani-znaku-php-vs-smarty/#reply1264723
TomasX
verified
rating uzivatele
(4 hodnocení)
5. 3. 2017 11:57:11
přesný důvod vzniku netuším, ale seralizovat touhle funkcí vnější vstup je problematické, ona ta funkce je tak trochu děravá celou svojí historii, jeden příklad za všechny http://www.securityweek.com/vulnerabilities-plague-php-7s-unserialize-mechanism
No vypisovat neescapovaný string znamená, že tam mám riziko persistentního XSS a to je něco co opravdu nechci do webu. Nechat uživatele napsat text, který se bude přímo 1:1 vykonávat v šabloně je nebezpečné (tak chápu cíl dotazu) a je nutné ho tokenizovat a každý token ošetřit zvlášť aneb takhle se chová parser šablon.
---------- Příspěvek doplněn 05.03.2017 v 11:58 ----------
pretected: ano ,to je správně. Nemá smysl escapovat html do databáze. Z tvého dotazu ale nebylo vůbec jasné co myslíš tím "escape", ona to je jedna činnost/akce ošetření kontrolních znaků v textu a jednak se tak přímo jmenuje funkce v php.
5. 3. 2017 11:57:11
https://webtrh.cz/diskuse/escapovani-znaku-php-vs-smarty/#reply1264722
Napsal protected;1369586
pro zápis do dtb nepoužívám přece htmlspecialchars ale mysql_real_escape_string
fce unescape je ok, když to escapované píšeš do dtb, což já nechci (přijde mi nesmyslné)
Dle me si to reseni nejak komplikujes ... bud mas v DB n nebo
a vypises to a je to. Nebo to v DB mas escapovane a vypises to neescapovane ... jinak si asi nerozumime.
Kazdopadne rada mimo, pouzivas mysql_* funkce, ktere uz v PHP 5.5 byly deprecated a v nejnovejsim PHP uz ani nejsou. Takze hodne rychle presedlej na mysqli (nebo idealne PDO) a zacni pouzivat prepared statements, usetri ti to hodne problemu do budoucna.
Jestli s tim chces fakt pomoct, tak sem hod realne data co mas v DB, protoze ted ani poradne nevim, jak to tam mas ulozene :D
5. 3. 2017 12:02:24
https://webtrh.cz/diskuse/escapovani-znaku-php-vs-smarty/#reply1264721
protected
verified
rating uzivatele
(13 hodnocení)
5. 3. 2017 12:31:21
Zkusím to popsat znovu a lépe.
Na webu vypisuji řadu textů z dtb. Některé tam vkládají uživatelé (jako například konverzaci).
Aby mi nedělali xss utoky, tak potřebuji escapovat veškeré výstupy z dtb ještě předtím, než je vypíši na web.
Navrhl jsem si řešení takové, že celé pole, které získám z dtb escapuji a předým šablonovacímu systému k výpisu.
Je to takto ok?
5. 3. 2017 12:31:21
https://webtrh.cz/diskuse/escapovani-znaku-php-vs-smarty/#reply1264720
Napsal protected;1369593
Zkusím to popsat znovu a lépe.
Na webu vypisuji řadu textů z dtb. Některé tam vkládají uživatelé (jako například konverzaci).
Aby mi nedělali xss utoky, tak potřebuji escapovat veškeré výstupy z dtb ještě předtím, než je vypíši na web.
Navrhl jsem si řešení takové, že celé pole, které získám z dtb escapuji a předým šablonovacímu systému k výpisu.
Je to takto ok?
Tak samozrejme, pokud to funguje je to ok ... ale dle me neco takoveho by mel resit az sablonovaci system. A jsem si jisty, ze i Smarty neco takoveho dokaze
EDIT:
neco takoveho, kdyz ty texty budes vypisovat foreachem ?
{$text|nl2br|escape}
5. 3. 2017 12:34:53
https://webtrh.cz/diskuse/escapovani-znaku-php-vs-smarty/#reply1264719
protected
verified
rating uzivatele
(13 hodnocení)
5. 3. 2017 13:40:53
jasně.. ale:
máme řetězec
escape v php a následně předání do šablonovacího systému
vypíše se:
escape v php a následně předání do šablonovacího systému
vypíše se:
Pro odpověď se přihlašte.
Přihlásit