Spolek OpenAlt zve příznivce otevřených řešení a přístupu na 209. brněnský sraz, který proběhne tento pátek 16. května od 18:00 ve studentském klubu U Kachničky na Fakultě informačních technologií Vysokého učení technického na adrese Božetěchova 2/1. Jelikož se Brno stalo jedním z hlavních míst, kde se vyvíjí open source knihovna OpenSSL, tentokrát se OpenAlt komunita potká s komunitou OpenSSL. V rámci srazu Anton Arapov z OpenSSL
… více »GNOME Foundation má nového výkonného ředitele. Po deseti měsících skončil dočasný výkonný ředitel Richard Littauer. Vedení nadace převzal Steven Deobald.
Byl publikován přehled vývoje renderovacího jádra webového prohlížeče Servo (Wikipedie) za uplynulé dva měsíce. Servo zvládne už i Gmail. Zakázány jsou příspěvky generované pomocí AI.
Raspberry Pi Connect, tj. oficiální služba Raspberry Pi pro vzdálený přístup k jednodeskovým počítačům Raspberry Pi z webového prohlížeče, byla vydána v nové verzi 2.5. Nejedná se už o beta verzi.
Google zveřejnil seznam 1272 projektů (vývojářů) od 185 organizací přijatých do letošního, již jednadvacátého, Google Summer of Code. Plánovaným vylepšením v grafických a multimediálních aplikacích se věnuje článek na Libre Arts.
Byla vydána (𝕏) dubnová aktualizace aneb nová verze 1.100 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a videi v poznámkách k vydání. Ve verzi 1.100 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.
Open source platforma Home Assistant (Demo, GitHub, Wikipedie) pro monitorování a řízení inteligentní domácnosti byla vydána v nové verzi 2025.5.
OpenSearch (Wikipedie) byl vydán ve verzi 3.0. Podrobnosti v poznámkách k vydání. Jedná se o fork projektů Elasticsearch a Kibana.
PyXL je koncept procesora, ktorý dokáže priamo spúštat Python kód bez nutnosti prekladu ci Micropythonu. Podľa testov autora je pri 100 MHz približne 30x rýchlejší pri riadeni GPIO nez Micropython na Pyboard taktovanej na 168 MHz.
Grafana (Wikipedie), tj. open source nástroj pro vizualizaci různých metrik a s ní související dotazování, upozorňování a lepší porozumění, byla vydána ve verzi 12.0. Přehled novinek v aktualizované dokumentaci.
$from ='05/17/2012 10:15:00'; $to ='05/17/2012 10:30:00'; $day ='5/17/2012'; echo '{ "dtstart": "'.$from.'", "dtend": "'.$to.'", "day": "'.$day.'" },';tak to fičí ok, ale akonáhle pred to dám hocijakú funkciu, tak to ajax nespracuje, napr. toto (prepíšem na konci tie isté premenné čo v prvom skripte, ale aj tak to nejde dobre):
$from= preg_replace('/[\x00-\x1F\x80-\xFF]/', '',$data[0]->time_from); $to = preg_replace('/[\x00-\x1F\x80-\xFF]/', '',$data[0]->time_to); $day = preg_replace('/[\x00-\x1F\x80-\xFF]/', '',$data[0]->day); $from ='05/17/2012 10:15:00'; $to ='05/17/2012 10:30:00'; $day ='5/17/2012'; echo '{ "dtstart": "'.$from.'", "dtend": "'.$to.'", "day": "'.$day.'" },';
$data
$from, $to, $date
by se mely stejne priradit rucne definovane hodnoty, takze problem bude spise v tom, ze tam dojde k nejake notice/warning nebo tak neco, co pak rozbije ten vystup..
Array( [0] => array ( [id] => 24 [time_from] => 05/17/2012 10:15:00 [time_to] => 05/17/2012 11:30:00 [day] => 05/17/2012 ) )
<?php class Data{ public $time_from = '05/17/2012 10:15:00'; public $time_to ='05/17/2012 10:30:00'; public $day ='05/17/2012'; }; $data = Array(0 => new Data()); $from= preg_replace('/[\x00-\x1F\x80-\xFF]/', '',$data[0]->time_from); $to = preg_replace('/[\x00-\x1F\x80-\xFF]/', '',$data[0]->time_to); $day = preg_replace('/[\x00-\x1F\x80-\xFF]/', '',$data[0]->day); echo '{ "dtstart": "'.$from.'", "dtend": "'.$to.'", "day": "'.$day.'" },';jako byste přímo zapsal toto:
,
na konci toho výpisu. Zkusil bych ji dát pryč, co to udělá.
Array( [0] => stdClass Object ( [id] => 24 [time_from] => 05/17/2012 10:15:00 [time_to] => 05/17/2012 11:30:00 [day] => 05/17/2012 ) )v čom by tam mohol byť do kelu problém?
echo json_encode(array("dtstart"=>$from,"dtend"=>$to,"day"=>$day));
eval()
, která si s těmi zpětnými lomítky hravě poradí.
json_encode()
přidává uvozovky, podstrčený kód se tedy předá jako řetězec.
{ "dtstart": "05/17/201210: 15: 00", "dtend": "05/17/201210: 30: 00", "day": "05/17/2012" }v pořádku. Že by zase nějaká JSON obskurnost?
<![CDATA[ … ]]>
json_encode()
si s tím musí umět poradit tak, abych při json_decode()
dostal identická data.
Když ukládám data do DB, tak je také nesmím escapovat, abych je měl v DB přesně byte po bytu tak, jak je tam potřebuji mít.
json_decode()
a pak htmlspecialchars()
. V HTML nemá JSON co pohledávat.
<script> <?php echo json_encode(array("dtstart"=>"<![CDATA[","dtend"=>"05/17/2012 10:15:00")); ?> </script>nebo
<script> <?php echo json_encode(array("dtstart"=>"<script>","dtend"=>"05/17/2012 10:15:00")); ?> </script>což mi rozbije výstup. Případně když budu vypisovat jinam (atribut, jiný formát), může se tam rozbít něco jiného. Proto je potřeba, aby escapoval ten, kdo ví*, kam se vypisuje. A tudíž je to polovičaté escapování ve funkci
json_encode()
nadbytečné a povede akorát ke zmatkům a chybám – stejně jako ty PHP Magic Quotes – programátoři se budou spoléhat na to, že můžou jen tak přilepit návratovou hodnotu funkce do výstupu a nebudou ji escapovat a špatně dopadnou.
Ta funkce má i volby – trochu by pomohla JSON_HEX_TAG
, která zneškodní ty < >, ale stále tam zbudou & a ty budou dělat neplechu (neexistující entity). Takže je potřeba přidat ještě JSON_HEX_AMP
. A už to není tak jednoduché a možná tam jsou i další díry…
Je to takový neunixový přístup, jedna funkce se toho snaží dělat příliš mnoho a nakonec to dělá blbě. Daleko lepší mi přijde to rozdělit – mít jednu spolehlivou funkci na generování JSONu a jinou spolehlivou funkci na escapování (pro různé výstupní formáty) a tyto dvě funkce zřetězit:
$výstup = bezpečněEscapujProDanýVýstupníFormát(generujNějakáData($vstup));*) což může být programátor, který zavolá patřičnou funkci, nebo třeba nějaký inteligentní šablonovací systém, který zná kontext.
<script> <?php echo htmlspecialchars(json_encode(array("dtstart"=>"&<![CDATA[","dtend"=>"05/17/2012 10:15:00"))); ?> </script>
bezpečněEscapujProDanýVýstupníFormát()
. Jenže pak je nějaké přidávání zpětného lomítka před / zbytečnost a nemá tam co dělat – akorát to někoho svede k chybě.
*) relativně – zase to zbytečně převádí " na ", přestože uvozovky v textových uzlech (uvnitř elementů) klidně být můžou a je potřeba je převádět jen v atributech – a to ještě jen v těch, kde je hodnota zavřená do uvozovek – zatímco v <element atribut='nějaká "hodnota" s uvozovkami'/>
klidně být můžou.
Tiskni
Sdílej: