Adminer 4.1.0
Školení, která pořádám
Asi největší novinkou právě vydané verze Admineru je ochrana proti pokusu o získání hesla k databázi hrubou silou. Adminer nově dovolí jen 30 neplatných pokusů o přihlášení za 30 minut (počítáno od prvního neplatného pokusu). Další pokusy (ať už se správným nebo špatným heslem) se ignorují, dokud nevyprší časový limit. Limit se vztahuje na IP adresu, nikoliv na uživatelské jméno. To je ze dvou důvodů:
- Útočník může zkoušet různá uživatelská jména, nemusí být zaměřen jen na jedno.
- Při vazbě na uživatelské jméno by útočník mohl oprávněnému uživateli zabránit v přihlášení úmyslným zadáváním špatných hesel (DoS).
Limit je poměrně velkorysý, protože mě rozčiluje, když mi některé služby třeba po třech neplatných pokusech o přihlášení ukážou dlouhý nos. Také jsem zohlednil, že stejnou IP adresu může používat více uživatelů, např. ze stejné firmy s proxy serverem. Pokud máte webový server umístěný za reverzní proxy a všechny požadavky chodí ze stejné IP adresy, tak je vhodné implementovat metodu Adminer::bruteForceKey()
tak, aby vracela poslední část hlavičky X-Forwarded-For
. Jinak vám hrozí DoS. Hlavička X-Forwarded-For
se bohužel nemůže kontrolovat automaticky, protože jde triviálně podstrčit.
Přemýšlel jsem i o přidání CAPTCHA, což by zamezilo riziku DoS. reCAPTCHA ale používá privátní klíč, který by musel být součástí Admineru, a ostatní řešení jsou obvykle celkem snadno prolomitelná.
Data se ukládají do upload_tmp_dir
nebo pokud není nastaven, tak do sys_get_temp_dir()
. Tyto adresáře někdo pravidelně promazává, nicméně vzhledem k poměrně krátké platnosti dat by to nemělo moc vadit.
I přes tuto ochranu je vhodné přístup k Admineru omezit, např. v Apache pomocí Access Control. Případně pokud Adminer použijete někde jen jednorázově, tak ho zase po sobě smažte. Odkaz na Adminer také nikam zbytečně nedávajte a neumisťujte ho na snadno uhodnutelnou adresu. Pokud Adminer používají zákazníci vašeho hostingu, tak jim k němu umožněte přístup jen pokud jsou přihlášeni do administrace hostingu.
Další novinky
- V přehledu databází je možné nově zobrazit jejich velikost v bajtech. Už dříve se tam zobrazoval počet tabulek, ten se nově spolu s velikostí zobrazí až po explicitní akci. Změnil jsem to proto, že operace zbytečně zatěžuje databázový server a někdy nás tyto informace nemusí zajímat. Ale nad přidáním dříve nepotřebného kliknutí navíc jsem dlouho přemýšlel.
- Pokud dříve došlo při klonování záznamu nebo vícenásobné editaci k chybě, tak se zobrazila jen chybová hláška a výpis dat. Tento závažný prohřešek proti použitelnosti (se kterým se ale uživatel naštěstí nesetkal moc často) je nově opraven tím, že se zobrazí chybová hláška a formulář s odeslanými daty.
- Textarea se zvýrazňováním syntaxe bohužel v některých prohlížečích nefunguje stoprocentně a přemýšlel jsem o tom, že ji zase vyhodím. Už by to byla třetí implementace, kterou jsem do Admineru přidal a zase odebral. Prozatím jsem ji nechal a alespoň opravil problém s nezlomitelnými mezerami, které některé prohlížeče umísťují na konce řádků. To způsobovalo těžce odhalitelné chyby jako „Neplatná tabulka 'tab '.“
- Ve výpisu dat se nově zobrazuje čas jejich provedení stejně jako u všech ostatních dotazů. Čas nově není umístěn v komentáři SQL dotazu, ale jen v HTML kódu. Jeho umístění do SQL komentáře byl hloupý nápad.
- Pro kompresi Gzip se dříve používal jednoduchý obrat
ob_start('gzencode')
. Problém byl, že funkce ob_start
posílá callbacku druhý parametr označující fázi bufferingu. Funkce gzencode
druhý parametr ale chápe jako stupeň komprese, takže nízká čísla posílaná funkcí ob_start
způsobí malou kompresi. Nově se proto volá ob_start(function ($string) { return gzencode($string); })
, což použije výchozí kompresi.
- Externí odkazy se už dávno přesměrovávají přes adminer.org. Je to proto, aby se vlastník cílové stránky nedozvěděl, na jaké adrese Adminer běží. Nejsem s tím spokojen ze tří důvodů: odkazy se nedají snadno kopírovat, je to drobné zdržení a někteří uživatelé to chápou jako porušení svého soukromí. Já data neprohlížím ani je nijak nezpracovávám, ale uživatelé to nemají jak ověřit. Pořád to ale považuji za menší zlo než riziko uniknutí adresy Admineru na náhodné weby. Existují různé hacky, jak problém vyřešit bez externího přesměrování (využívající např.
<a href="data:">
nebo <iframe src="javascript:">
), ale nejsou podporované napříč prohlížeči a v každé verzi můžou přestat fungovat. Správné řešení je použít atribut <a rel="noreferrer">
, který bohužel zatím podporuje jen WebKit (Chrome, Safari a nová Opera). Adminer proto externí přesměrování alespoň v těchto prohlížečích nově nedělá.
- V MySQL nefungoval typ
enum
v uložených procedurách. Taky nešlo editovat řádky podle binárních sloupců (např. pokud byly součástí primárního klíče). V MySQL 5.6.5 a novějším je možné také nastavit klauzuli ON UPDATE pro sloupce typu datetime
(už dříve to šlo pro timestamp
).
- Export nově respektuje letní čas. Adminer v exportovaných datech nastavoval časové pásmo používané zdrojovým serverem. Ale protože jeho textová reprezentace nemusí na cílovém serveru existovat, tak používal jeho číselnou verzi. A to právě způsobovalo problém s letními (nebo naopak normálními) časy. Adminer proto nově všechny časy převede do pásma +00:00 a totéž nastaví v exportu. Export je kvůli tomu o trochu hůře čitelný, moc lidí si ho ale myslím nečte.
- SQLite a Oracle podporují UPDATE OF triggery, které se vyvolají jen při změně určitého sloupce. Adminer je nově dovoluje spravovat stejně pohodlně jako ostatní triggery.
- V SQLite se dříve nezobrazovaly automaticky vytvořené unikátní indexy, to je nyní opravené.
- V Adminer Editoru jsem opravil metodu
login()
, která dříve mohla volat metodu na neinicializovaném objektu. Bohužel jsem si této chyby dříve nevšiml, protože sám metodu login()
zásadně překrývám.
- V arabštině, bengálštině a farštině se nově v překladech lokalizují čísla. Věděli jste, že 0123456789 se v těchto jazycích řekne ٠١٢٣٤٥٦٧٨٩, ০১২৩৪৫৬৭৮৯ a ۰۱۲۳۴۵۶۷۸۹?
- Přibyl vietnamský překlad.
Diskuse
„Textarea se zvýrazňováním syntaxe bohužel v některých prohlížečích nefunguje stoprocentně“
Ve FF(28) zlobí, ale funguje kliknout jinam a pak znovu zpět do ní a přimlouvám se raději k ponechání, zvýrazňování se mi líbí :-)
Patrik:
Fajn novinky, vďaka. Ktoré prehlidače pridávajú na konci riadku nezalomiteľnú medzeru?
Buksa:
Jakub preco sa tak bojis zrazu bezpecnosti admineru, ze ho treba skryvat? Bol nejaky reportovany prienik? Inak dakujem za dalsiu skvelu verziu admineru
Jakub Vrána :
To není „zrazu“. Adminer hlavičku Referer skrývá od té doby, co začal externí odkazy zpracovávat. Teď jsem naopak díky pokroku prohlížečů trochu povolil kohouty a pro skrytí Refereru se na prohlížeče spoléhám.
Žádný průnik reportovaný nebyl, nad bezpečností přemýšlím neustále. Ve vývoji Admineru to je ostatně priorita č. 1, viz http://www.adminer.org/.
Viktor Mašíček:
Zvýraznění SQL je fajn. Ale odstranil bych ikonu u názvu tabulek. Je to matoucí, protože se to tváří jako znak, ale znak to není. A navíc text skáče, když člověk dopíše název tabulky (dokud není napsán název existující tabulky, není ikona zobrazena a po úplném dopsání názvu vše uskočí díky přidané ikoně).
Jinak dík za Adminer. Používám jej už několik let a je to paráda.
Jakub Vrána :
To asi způsobuje nějaký skin, základní verze to nedělá. Zkus ho prosím opravit (nejspíš změnou nebo přidáním nějakého selektoru) a poslat mi ho.
Michal:
Adminer nezobrazuje počet bytů ve sloupci blob v SQLite, pokud provedu dotaz pomocí akce "select" z menu. Políčko v řádku je prázdné. Pokud stejný dotaz provedu ručně, tak se velikost zobrazuje.
Jan Tojnar:
Plánujete přidat podporu pro utf8mb4?
Jakub Vrána :
Adminer si seznam podporovaných kódování bere od MySQL, takže utf8mb4 podporuje, pokud ho podporuje MySQL. Je ale pravda, že při připojování do databáze posílá obdobu SET NAMES utf8, takže hádám, že znaky podporované jen v utf8mb4 se neuloží správně.
Peter:
Ahoj, práve som narazil na problem s utf8mb4 a dogooglil som sa až tu. V tabuľkách používam charset utf8mb4, ale keďže je connection v adminerovi utf8, tak sa znaky nad U+FFFF nedajú ani zadať, ani prečítať.
Mohol by si prosím zmeniť štandardné connection charset z utf8 na utf8mb4 ? :-)
jura:
Ahoj, prosím o radu jak na stránkách nastavit.
Aby se spustil adminer.php nebo editor.php
s automatickým přihlášením do databaze D a tabulky T v msql jen pro čtení (jméno Jmeno a heslo Heslo).
Pak už by si každý mohl hledat a třídit tabulku dle své potřeby.
Děkuji za pomoc
Jura
Jakub Vrána :
Stačí si uložit stránku s danou databází a tabulkou do bookmarků. Nutnost přihlašování lze vypnout metodou login().
jura:
Lze nějak vypnout první sloupec v editor.php ?
(myslímí tím "upravit")
Bookmarků - je myšleno např. example.php ?
Jakub Vrána :
První sloupec momentálně vypnout nejde. Možná leda stylem.
jura:
Lze nastavit zobrazení např. čtvrtého sloupce na zalomení textu a šířky např. 100 znaků ?
Zemistr:
Zdravím :)
Jen jsem se chtěl zeptat, jak je na tom podpora SQLite3?
Jakub Vrána :
Běžně Adminer pro správu SQLite3 používám.
Zemistr:
Občas mi to vyhodilo error třeba při editaci tabulky. :/
A bude v něm i podpora třeba pro vytvoření oné databáze?
Jakub Vrána :
Popiš prosím přesně, jaký postup vedl k vyvolání jaké chyby.
Milsa:
V zozname databáz by som navrhoval dať odkaz na obnovu zoznamu hore. Je to trochu nepraktické rolovať kvôli tomu dole. Ideálne by bolo to kešovanie zrušiť, ale autora o tom zrejme nepresvedčím. :-)
Martin:
Dobrý den, díky za skvělý nástroj, ale jen jedna věc mi děsně chybí. Plánujete u pole pro SQL dotazy přidat názvy sloupců v dané tabulce (případně i s jejimi přenosy do pole dotazu) jako je to u phpmyadmin? Když píši dotazy, názvy si jen tak nevybavím. Díky moc
Jakub Vrána :
Momentálně ne. Udělal bych to formou autocomplete v editoru.
trestná smradlavice:
Zdravím. Šlo by na stránce "Změnit tabulku", třeba vedle "Rozdělit podle…" přidat analogicky "Seřadit podle…" s výběrem sloupců, kde se po výběru jednoduše zavolá ALTER TABLE tabulka ORDER BY sloupce;? phpMyAdmin to má. Ano, není to životně důležité, ale někdy je to k užitku.
Jakub Vrána :
Funguje to jen pro MyISAM tabulky, takže se to přidávat nechystám.
pan Ďulák:
Zdravím.
Mám tabulku se sloupcem typu set s vícero hodnotami. Překvapilo mě, že při vkládání nové položky se nejdřív zobrazily všechny checkboxy a pak všechny možnosti - tedy ne checkbox1-možnost1, checkbox2-možnost2, ...
Jakub Vrána :
Popis není moc jasný, můžeš odkázat screenshot? Možná jde o problém nějakého skinu.
pan Ďulák:
po smazání šablony jsou už labely korektně za checkboxy, tedy zdá se, že to byl problém šablony
e-bola:
Mohla by u MySQL mezi operátory v sekci "Vyhledat:" být FIND_IN_SET()?
David Klouček:
Asi jsem našel bug. Když edituju záznam, tak se u sloupce typu POINT vytváří input typu number a tím pádem neni možný zadat POINT(x y).
Jakub Vrána :
Zkus aktuální verzi nebo verzi na GitHubu, podle mě to už je dávno opravené.
trestná smradlavice:
Zdravim.
Praktický příklad, se kterým nyní potýkám: Existuje nějaké rozšíření pro Adminer, které by dokázalo omezit přístup k němu jen ze seznamu povolených IP?
Jakub Vrána :
Ne, ale asi by bylo celkem jednoduché udělat.
trestná smradlavice:
Zdravím,
Poslušně hlásím bug:
Cvičně jsem si zkusil použít v názvu jedné tabulky nestandardní znaky - její jméno je: `problematic-.
<?a=1<&b[]='"%``)-- /*@\## table`.
Adminer ji umí správně zobrazit v navigaci, procházet ji, zobrazit a měnit její strukturu, ale jediné, co selže, je zobrazení jejího počtu řádků, dat, indexů atd. v přehledu databáze, jíž je součástí - tam zobrazí jen otazníky.
Jakub Vrána :
Díky za upozornění, byl tam double escaping. Opravil jsem to.
Diskuse je zrušena z důvodu spamu.