PHP triky

Weblog o elegantním programování v PHP pro mírně pokročilé

Adminer 4.7.0

Největší změnou Admineru 4.7.0 je přidání ovladače pro databázi ClickHouse, i když ta asi moc používaná není. Další změny jsou drobnější:

Málem jsem přidal i podporu generovaných sloupců v MySQL, ale pull request byl plný nesouvisejících změn. To je poměrně běžný problém – pokud posíláte pull request do jakéhokoliv projektu, soustřeďte se jen na to, čeho chcete dosáhnout. Pokud narazíte na nesouvisející problém, vytvořte samostatný pull request. Je velké utrpení prohlížet diff a tápat, proč asi nějaká změna (která navíc vypadá jako k horšímu) byla provedena a jestli je nezbytně nutná.

Jakub Vrána, Adminer, 24.11.2018, diskuse: 1 (nové: 1)

Adminer 4.6.3

Nejdůležitější změnou v Admineru 4.6.3 je zakázání příkazu LOAD DATA LOCAL INFILE v MySQL. S jeho pomocí jde totiž načíst obsah libovolného souboru, ke kterému má přístup uživatel, pod kterým běží webový server.

Podobně zásadní změnou je zákaz používání databází bez hesla. Už v minulosti jsem zakázal přístup bez hesla k SQLite, teď to platí pro všechny databáze. Chápu, že třeba na vývojových serverech nepřístupných zvenčí to může být trochu opruz, ale detekce toho, zda jde o vývojový server, by byla nespolehlivá (např. za reverzní proxy), proto jsem to zakázal všude. Máte tři možnosti, jak se s tímto omezením vypořádat.

Další změny jsou drobnější:

Jakub Vrána, Adminer, 28.6.2018, diskuse: 15 (nové: 15)

Dokazatelná bezpečnost

Na konferenci devel.cz jsem přednášel o tom, jak v Google o programech dokazujeme, že nemají XSS a některé další zranitelnosti. Slajdy a záznam jsou teď volně k dispozici.

S přednáškou jsem byl spokojen, jen jsem mohl uvést víc příkladů. Tak alespoň odkážu ukázku conformance pravidla.

Jakub Vrána, Výuka, 22.6.2018, diskuse: 2 (nové: 2)

Hašování hesel na klientu

V nedávné době došlo k několika problémům s ukládáním hesel u služeb, které velmi dbají na bezpečnost svých uživatelů a hesla se snaží ukládat správně. GitHub si omylem ukládal čitelná hesla do logu při jejich resetu, Twitter dokonce u všech uživatelů. Uživatelé jsou zároveň nepoučitelní a jedno heslo používají na více různých službách. Např. GitHub se opakovaně stal obětí tohoto nešvaru, jednou dokonce ve velkém rozsahu. Útočníci prostě heslo uniklé z jiné služby zkusili použít i na GitHubu a u některých uživatelů to prošlo. Aby se to nestalo vám, je vhodné dát uživatelům možnost použít jednorázové heslo.

Jak se nestat tím, od koho hesla uniknou a útočníci je pak použijí i jinde? V první řadě samozřejmě používáním HTTPS a správným ukládáním hesel na serveru, v PHP funkcí password_hash. Jak jsme ale viděli u GitHubu a Twitteru, samo o sobě to nestačí. Stačí malá nepozornost, přidání nějakého „neškodného“ logování a hesla se najednou válí na serveru i v čitelné podobě. Navíc i pokud máme aplikaci neprůstřelnou, tak se k heslům může dostat jakýkoliv zaměstnanec s přístupem k webovému serveru, který vidí hesla ještě před jejich bezpečným uložením nebo ověřením.

Hašování na klientu

Řešením je hesla hašovat už na klientu, takže se v čitelné podobě na server vůbec nedostanou. Na klientu spočteme hash_client(password), na serveru uložíme hash_server(hash_client(password)). hash_client a hash_server jsou nějaké hašovací funkce, klidně ta stejná. Pokud má klient vypnutý JavaScript, tak na server pošleme samotné heslo a obě hašování provedeme na serveru. Je důležité si uvědomit, že toto opatření nezlepší bezpečnost našeho samotného serveru. Pokud by se útočník dostal k hodnotě hash_client(password) (ať už odposlechem nebo třeba z logu na serveru), tak ji prostě příště použije znovu. S touto hodnotou je proto potřeba zacházet stejně obezřetně jako s heslem samotným. Důležitou výhodou ale je, že tato hodnota mu bude k ničemu na jiných službách.

Další výhodu spatřuji v tom, že uživatelé si mohou sami ověřit, jak služba s jejich heslem nakládá. Michal Špaček shromažďuje informace o tom, jak služby ukládají hesla, jediným vstupem pro tuto službu je ale vyjádření služeb samotných (krom nejkřiklavějších případů, kdy nám služba např. zapomenuté heslo prostě pošle tak, jak jsme ho zadali). GitHub i Twitter mají obě nejlepší hodnocení, přestože obě podle vlastního vyjádření hesla ukládala i v čitelné podobě (byť omylem).

Věřím, že stejně jako služby začaly hesla postupně ukládat bezpečně, tak je taky začnou přenášet bezpečně, protože jim do mého hesla konec konců nic není. Ověření síly hesla (k čemuž jedině služby heslo potřebují, navíc jen při registraci) se může dělat také na klientu.

Jakub Vrána, Řešení problému, 7.5.2018, diskuse: 5 (nové: 5)

Instalace kontroly pravopisu v MS Office

Žena začala v práci používat MS Office a je z toho dost nešťastná. Kupříkladu kontrola pravopisu: Při otevření dokumentu v češtině se zobrazí takovýhle proužek:

To vypadá celkem nadějně. Ten druhý proužek o aktualizaci mimochodem svítí pořád. Při pokusu o aktualizaci zmizí, ale jinak nic neudělá – žádná chyba a příště svítí znovu. Kliknutí na Download vede na stránku https://support.office.com/cs-cz/article/sada-language-accessory-pack-pro-office-82ee1236-0f9a-45ee-9c72-05b026ee809f?ui=cs-CZ&rs=cs-CZ&ad=CZ, kde se zobrazí toto:

Všimněte si, že v URL je celkem čtyřikrát cz, uživatel ale stejně jazyk musí znovu vybrat. Nastává druhý krok: výběr verze a počtu bitů.

Netuším, jaká verze Office je nainstalovaná a netuším ani, proč to musím zadávat já a Office si to nepředá jako informaci v odkazu. Zkusím nápovědu, tam vždycky bývalo About. V Office ale bohužel ne:

Nakonec mě zachrání Start menu, kde je verze uvedená:

Pořád ale nevím, jestli je Office 32- nebo 64-bitový. Jako power user vím, že se to dá poznat z cesty ke spustitelnému souboru, otevřu proto zástupce (přes jeden mezikrok s otevřením jeho složky):

Podle x86 bravurně poznám, že jde o 32-bitovou variantu. Ještě štěstí, že byla verze uvedená v názvu zástupce, jinak bych se ji asi nedozvěděl, protože program je v složce Office16 (hádám, že předchozí Office 2013 byl ve složce Office15).

Soubor stáhnu a spustím (s nezbytným mezikrokem v podobě “This file type can potentially harm your computer” a dalším mezikrokem v podobě UAC) a dozvím se jen toto:

Mám zkontrolovat Internet a velikost místa na disku, jako by si to ten program nemohl udělat sám (ani v jednom samozřejmě problém není). Stránka s další nápovědou nabízí další užitečné rady: restartovat počítač nebo přeinstalovat celý Office. Pro jistotu zkouším i 64-bitovou variantu, ale bez výsledku. Nakonec si všímám informace na prvním odkazu, kterou jsem nejprve přehlédl (jsou na něm dvě stránky textu, který jsem celý nečetl): „Pokud vám vaše organizace nainstalovala na počítač Office 2016 a vy chcete nainstalovat jazykové sady, kontaktujte IT oddělení.“ To bude nejspíš případ počítače mé ženy. Bez návštěvy IT si tedy pravopis nezkontroluje.

Takhle se software dělal v minulém století – z pohledu vývojáře jde o naprosto logickou posloupnost kroků, kterými by měl uživatel projít. V tomto století bych si představoval, že by se Office zeptal, jestli se má stáhnout a zapnout čeština a sám by se o všechno postaral. Není třeba žádný instalační program, prostě by se stáhl jeden *.dic a Word by ho použil. Nemusela by se řešit nějaká práva něco spouštět a instalovat, stahování přes prohlížeč by se taky eliminovalo.

Na této ukázce je dobře vidět, jak obrovský náskok mají online řešení v použitelnosti a produktivitě. Tam se samozřejmě žádná instalace kontroly pravopisu neřeší. Power user s administrátorskými právy si nakonec nějak poradí i v Office a třeba pak ocení jeho další vlastnosti. Běžný uživatel ale takovouhle blbostí stráví klidně hodinu a výsledku se nakonec stejně nedobere. Dohnat tuto zabitou hodinu je pak dost těžké.

Jakub Vrána, Osobní, 8.3.2018, diskuse: 3 (nové: 3)

Starší články naleznete v archivu.

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.