*.vas-server.cz
, na které hosting běží, má nedůvěryhodný certifikát, což způsobuje rozličné problémy (např. e-mailová aplikace na iOS nedovoluje schválit bezpečnostní výjimku při změně e-mailového serveru a ten je potřeba smazat a přidat znovu). Ptal jsem se na to a je to dáno limity Let's Encrypt pro počet certifikátů vystavovaných pro jednu doménu. Váš Hosting ale dojednal zvýšení těchto limitů, takže do budoucna snad certifikát důvěryhodný bude.*.vas-server.cz
už má certifikát od Let's Encrypt.hmac_md5(password, old_challenge)
a md5(hmac_md5(password, new_challenge))
dovolí útočníkovi se znalostí hesla toto heslo změnit, aniž bychom to mohli detekovat a uživatele třeba upozornit.Viz samostatný článek.
{"1":1,"2000":"Jakub"}
.count($array)
má být - 1
★★★★★, Abstract, no slides yet
A great talk about Let's Encrypt. They demoed the command line tool to verify the domain, issue and install the certificate and modify the config files, all in about twenty seconds. They also mentioned DVSNI – a method for validating a domain through TLS.
arguments
Proměnná arguments, která automaticky vzniká při volání funkce, sice vypadá jako pole, ale ve skutečnosti to pole není, takže na ni nejdou přímo používat metody pole. Je to vynuceno nejspíš tím, že obsah proměnné je svázán s parametry funkce – pokud uvnitř funkce do parametru přiřadíme nějakou hodnotu, projeví se to i v arguments
a naopak. To ostatně považuji také za dost pochybnou vlastnost, která může kód spíš znepřehlednit, než že by mu nějak pomohla.
Osobně bych se klonil k tomu, aby funkce s nepojmenovanými parametry vůbec nemohla pracovat a aby volání funkce s více parametry, než kolik jich má, skončilo chybou. Vytvořit pole je v JavaScriptu velmi snadné, takže předat pole hodnot je téměř stejně snadné jako předat hodnoty v parametrech. Naopak to vede k přehlednějšímu API a někdy i přehlednějšímu kódu (protože není třeba používat Function.apply, ale stačí funkci rovnou zavolat).
ECMAScript 6 situaci trochu vylepšuje operátorem spread.
elseif ($hours >= 2)
má být ještě elseif ($days == 1) { return "včera"; }
It will dictate the serialized form forever. This is not just a theoretical problem. It happened to several classes in the Java platform libraries, including
BigInteger
.
Note also that defensive copying is not possible for final fields. To use the
readObject
method, we must make thestart
andend
fields nonfinal.
Do not use the
writeUnshared
andreadUnshared
methods. They are typically faster than defensive copying, but they don’t provide the necessary safety guarantee.
Relying on the default deserialization mechanism can easily leave objects open to invariant corruption and illegal access.
Prior to release 1.5, the double-check idiom did not work reliably because the semantics of the
volatile
modifier were not strong enough to support it.
In an ironic twist, the
ThreadGroup
API is weak from a thread safety standpoint. To get a list of the active threads in a thread group, you must invoke theenumerate
method, which takes as a parameter an array large enough to hold all the active threads. TheactiveCount
method returns the number of active threads in a thread group, but there is no guarantee that this count will still be accurate once an array has been allocated and passed to theenumerate
method. If the thread count has increased and the array is too small, theenumerate
method silently ignores any threads for which there is no room in the array.
Let the client synchronize externally where it is appropriate. In the early days of the Java platform, many classes violated these guidelines. For example,
StringBuffer
instances are almost always used by a single thread, yet they perform internal synchronization.
The libraries provide the
Thread.stop
method, but this method was deprecated long ago because it is inherently unsafe – its use can result in data corruption.
One example of an exception that fails this test is
CloneNotSupportedException
. It is thrown byObject.clone
, which should be invoked only on objects that implementCloneable
. In practice, thecatch
block almost always has the character of an assertion failure. The checked nature of the exception provides no benefit to the programmer, but it requires effort and complicates programs.
For example, instead of a
String
constructor,IndexOutOfBoundsException
could have had a constructor that looks like this… Unfortunately, the Java platform libraries do not make heavy use of this idiom, but it is highly recommended.
Consider the
getSize
method in thejava.awt.Component
class. The decision that this performance-critical method was to return aDimension
instance, coupled with the decision thatDimension
instances are mutable, forces any implementation of this method to allocate a newDimension
instance on every invocation.
The “semantic gap” between what the programmer writes and what the CPU executes is far greater than in traditional statically compiled languages, which makes it very difficult to reliably predict the performance consequences of any optimization.
More generally, if a concrete class has no associated interface, then you have no choice but to refer to it by its class whether or not it represents a value. The
Random
class falls into this category.
Because of the unfortunate decision to retrofit
Arrays.asList
as a varargs method in release 1.5, this program now compiles without error or warning. Running the program, however, produces output that is both unintended and useless.
Every invocation of a varargs method causes an array allocation and initialization.
When in doubt, look to the Java library APIs for guidance. While there are plenty of inconsistencies – inevitable, given the size and scope of these libraries – there is also a fair amount of consensus.
The behavior of this program is counterintuitive because selection among overloaded methods is static, while selection among overridden methods is dynamic.
The confusing behavior demonstrated by the previous example came about because the
List<E>
interface has two overloadings of theremove
method:remove(E)
andremove(int)
.
The rules that determine which overloading is selected are extremely complex. They take up thirty-three pages in the language specification, and few programmers understand all of their subtleties.
For example, the
String
class exports two overloaded static factory methods,valueOf(char[])
andvalueOf(Object)
, that do completely different things when passed the same object reference. There is no real justification for this, and it should be regarded as an anomaly with the potential for real confusion.
Inexplicably, the authors of the
ObjectOutputStream
API did not take advantage of theSerializable
interface in declaring thewrite
method. The method’s argument type should have beenSerializable
rather thanObject
. As it stands, an attempt to callObjectOutputStream.write
on an object that doesn’t implementSerializable
will fail only at runtime, but it didn’t have to be that way.
Enum constructors aren’t permitted to access the enum’s static fields, except for compile-time constant fields. This restriction is necessary because these static fields have not yet been initialized when the constructors run.
PageSpecial::home() === PageSpecial::home()
, tak se vytvořené objekty ukládají do keše. For example, it is illegal to create an array of a generic type, a parameterized type, or a type parameter.
It also means that you can get confusing warnings when using varargs methods in combination with generic types. This is because every time you invoke a varargs method, an array is created to hold the varargs parameters. If the element type of this array is not reifiable, you get a warning. There is little you can do about these warnings other than to suppress them, and to avoid mixing generics and varargs in your APIs.
It would be nice if the language did the same kind of type inference when invoking constructors on generic types as it does when invoking generic methods.
It doesn’t seem right that we can’t put an element back into the list that we just took it out of.
The next thing to notice is that the value type of the
favorites
Map
is simplyObject
. In other words, theMap
does not guarantee the type relationship between keys and values, which is that every value is of the type represented by its key. In fact, Java’s type system is not powerful enough to express this.
Když chci v PHP zjistit, jestli řetězec obsahuje regulární výraz, použiji funkci preg_match($re, $string)
. Když chci zjistit, jestli celý řetězec odpovídá regulárnímu výrazu, přidám stříšku a dolar. V Javě ke stejnému účelu slouží obrat Pattern.compile($re).matcher($string).find()
resp. Pattern.compile($re).matcher($string).matches()
. Java nabízí i zkratku Pattern.matches($re, $string)
, pro metodu find
ale žádná zkratka neexistuje. Navíc tato zkratka je nevhodná, protože při opakovaném použití se regulární výraz znovu a znovu kompiluje. PHP si naproti tomu zkompilovanou verzi ukládá do keše. Regulárních výrazů je obvykle jen omezený počet a jsou poměrně krátké, takže to ničemu nevadí. V Javě se zkompilovaný regulární výraz obvykle ukládá do konstanty, ale to znemožňuje použití zkratky. Stejně tak metoda String.replaceAll
– když pominu nešťastnou existenci metod replace
a replaceAll
, kde každá dělá něco jiného, tak jde opět o zkratku nevhodnou k používání. To by sakra nemohla metoda replaceAll
přijímat i Pattern
?
Další ukázkou nepohodlného API v Javě je práce s XML dokumenty. Načtení XML dokumentu z řetězce (tedy obdobu DOMDocument::loadXML) zajišťuje obrat (new DocumentBuilderFactoryImpl()).newDocumentBuilder().parse(new InputSource(new StringReader(html)))
. Jak se dokument do XML řetězce zase uloží (tedy obdobu DOMDocument::saveXML), snad ani nechcete vědět.
java.net.URL
’s equals
method relies on comparison of the IP addresses of the hosts associated with the URLs. Translating a host name to an IP address can require network access, and it isn’t guaranteed to yield the same results over time. This can cause the URL equals
method to violate the equals
contract and has caused problems in practice.equals
is known to be inconsistent with virtual hosting in HTTP.java.io.ObjectStreamConstants
. These interfaces should be regarded as anomalies and should not be emulated.idx
, která měla být zahrnuta do PHP v momentě, kdy přístup k neinicializovaným prvkům pole začal vyhazovat E_NOTICE
.$structure
nemá být předanáINSERT
s klauzulí ON DUPLICATE KEY UPDATE a využitím funkce VALUES()
:$timeouts = &self::$timeouts
a poslat to callbacku přes use (&$timeouts)
.KILL QUERY
.Děkuji Vám za materiály a školení, od kterého jsem očekávala tři věci. V první řadě, že si poslechnu základ od odborníka a udělám si pořádek v dříve získaných znalostech tak, abych na nich mohla dále stavět. Dále že se konečně dozvím, jak JS pořádně ladit, neboť do této doby jsem to dělala dosti pokoutně. A na závěr, že se zbavím pocitu, že JS je nutné zlo, které na mě odevšud vyskakuje. Školení bylo velmi srozumitelné a odcházela jsem s pocitem, že se nakonec s tímto skriptovacím jazykem přece jen asi skamarádím :-). Shrnutí: Školení splnilo všechna moje očekávání, nemám, co bych vytkla.
Školení nadmíru splnilo mé očekávání začátečníka v PHP. Velice se mi líbilo rozdělení kurzu na dopolední teoretickou část, kdy jsme si mohli vyzkoušet přednášenou teorii na drobných příkladech a odpolední část, kdy jsme pod vedením lektora naprogramovali malou aplikaci. Musím říct, že to chvílemi připomínalo kurz rychlopsaní, protože narozdíl od lektora jsme neznali zkratky v programu a hodně funkcí jsme museli vypisovat ručeně, což nám trochu zdržovalo. Závěrem školení jsme si mohli nabyté zkušenosti otestovat v závěrečném testu. Při kontrole nás lektor upozornil na chyby nebo ukázal jiné, elegantnější řešení.
Já bych chtěl poděkovat za školení, bylo přesně podle mých představ a bylo pro mne velmi přínosné. Účastnil jsem se především kvůli objektovému programování v PHP, což byla hlavní část školení, ostatní části jsem víceméně již znal, ale i tam bylo několik postřehů pro mne podnětných. Velmi oceňuji názorné ukázky na příkladech, na kterých jsem danou problematiku snadněji pochopil. Tempo školení bylo svižnější, což mi plně vyhovovalo, díky němu se toho stihlo probrat hodně. Uvažuji ještě také o účasti na školení o bezpečnosti PHP aplikací v příštím týdnu.
$_GET["id"]
a$_POST
si při komunikaci se serverem ukládá do session proměnnécomputeSalesTax(Address $address, $amount, $tax)
a volající kód upravil tak, aby nevolal computeSalesTax($address, $invoice->getSubTotal())
, ale místo toho prošel všechny položky na faktuře a celkovou daň si sám nasčítal. Podle mě to dobře ilustruje hlavní nevýhody „dobře testovatelného kódu“: interní změna, která by měla být ve výhradní zodpovědnosti třídy SalesTaxCalculator
, se projeví změnou API a část logiky (sečtení jednotlivých daní) musíme přesunout do volajícího kódu (což může vést k nekonzistenci a chybám).http://www.google.com/s2/favicons?domain=
běží webová služba pro získávání ikon ve formátu PNG.$this->link =
kontanty/
má být kontakty/
eregI("")
má být preg_match("()i")
serial
, případně bigserial
.localhost:3456
.NULL
sloupců vytvoření podmínky IS NULL
, operátor >= zase IS NOT NULL
.n:
atributy, které zjednodušují práci a zpřehledňují kód.X-XSS-Protection: 0
jako obranu před modifikací stránky v IE8 a bezpečnostními problémy ve starších vydáních tohoto prohlížeče.login
(platí i v případě nastavených výchozích přihlašovacích údajů pro MySQL), nebo používat verzi pouze pro MySQL.new stdClass
).text-overflow: ellipsis
.FULLTEXT (nadpis, clanek)
. MATCH(nadpis, clanek) AGAINST ('$search' IN BOOLEAN MODE)
, v tom případě by se ale index vůbec nepoužil a dotaz by tak byl výrazně pomalejší.innodb_rollback_on_timeout
, která dovolí zapnout původní chování. Skript jsem upravil tak, aby s touto proměnnou počítal.moveStart
nás přesune na začátek celého dokumentu, nejen vstupního políčka, takže kód funguje jen pokud je vstupní políčko na začátku dokumentu.JavaScript a AJAX, to byl perfektně vysvětlený vstup do Ajaxu na pořádným příkladu, kde opět upozorňujete na bezpečnostní rizika. Nemůžu říct, že to umím, ale že to chápu a to mě absolutně stačí na to, abych se to dál učil a rozvíjel, to byl taky účel, proč jsem na školení šel, stejně jako na minulá školení.
Co se týká školení, já prostě nemám, co bych mohl záporně zkritizovat. Na bezpečnosti mě ale překvapilo, že jsem se nesetkal s lidmi ze školení z Úvodu do PHP. Já se učím pomalu, ale když už se něco učím, tak mám rád, když vím, že to je správný a to pro mě znamená i bezpečný. Nevím, jak ostatní, ale mě dá největší práci zbavit se špatných návyků. I když je pravda, že na Úvodu se základy bezpečnosti taky probíraly. Myslím si, že to je velice důležitý pro profesionály, protože si moc dobře pamatuji, kolik rukou se zvedlo, když jste se zeptal, jestli to někdo používá. Ne vždy se zvedly všechny ruce.
?username=
parameter. A user can use this feature in a secure environment where he authenticates by some other mean (e.g. on localhost without a remote access or with HTTP authentication). However, it is not possible to pass the password in a GET parameter which would be very insecure. Adminer uses the value of mysql.default_password
configuration directive in this case. The demo application uses this approach to automatically log in the users."SELECT * FROM clanky ORDER BY nadpis, id LIMIT 1 OFFSET " . ($poradi - 2)
.Školení bylo nad mé očekávání! Bylo okořeněno spoustou příkladů, které mě u jiných školení chybělo. Výklad byl podán velice srozumitelně. Individuální přístup ke každému. Závěrečný testík byl velice přínosný pro pochopení probírané problematiky z celého dne..
Děkuji za materiály a vlastní školení, ze kterého jsem byl nadšený. Hltal jsem každé slovo, dokonce i po obědě, kdy si většinou musím dávat sirky do očí, abych vydržel. Na internetu je sice spousta informací o této problematice, ale nikde jsem je neviděl takto komplexně pohromadě a hlavně s reálnými příklady, které dají mnohem více než sáhodlouhý popis. Určitě jsme se neviděli naposled, můžete se mnou počítat na školení Výkonnost webových aplikací.
(%+-)
]]>
Použití MySQL v PHP:
Školení splnilo mé očekávání. Myslím, že tento kurz v jednodenním bloku ani nelze jinak postavit. Z větší části se jedná o zpočátku trochu hodně sušší teorie, kdy je skutečně nezbytné nejdříve probrat řídící konstrukce jazyka. Bez toho by to ani nešlo. Objektivně, pro člověka, který již v nečem programoval to není problém a jde spíše o naučení správné syntaxe. Pro úplného začátečníka to ale může být poměrně náročné na strávení. Nicméně v rámci jednodenního školení to opravdu jinak nejde. Také předpokládám, že na takovéto školení se nepřihlásí nikdo programátorsky úplně nedotčený ;-) Naštěstí i v této části lektor doplňuje velice důležité informace a připomínky vycházející z hluboké znalosti problematiky, které jednak výklad oživují a jednak jsou to velmi cenné praktické poznatky zejména s ohledem na korektnost, efektivnost, přehlednost a čistotu vytvářeného programového kódu. V druhé části školení jsou probírány už zajímavější pasáže s praktickými ukázkami a cvičeními zejména na propojení s databázemi s využitím nabytých znalostí z předchozí části. Pochopení celé problematiky si každý samostatně otestuje na samostatném jednoduchém úkolu. Po konzultaci vypracovaného řešení lektor naznačí další postup na vylepšení, ošetření dalších důležitých aspektů a směr dalšího studia dané problematiky.
Na školení Úvod do PHP jsem se přihlásil s velkým očekáváním a popravdě jsem byl zvědav, jak se do jednoho dne vejde tak široká problematika. A opravdu, informace tekly ve velkém tempu od začátku až do konce. Rozhodně nemá smysl, aby na tento kurz šel člověk, který nemá s programováním rozsáhlejší zkušenosti a domnívá se, že se to zde naučí. Také díky tomu, že jsem se před kurzem samostudiem seznámil se základními pojmy a syntaxí, neměl jsem s pochopením obsahu kurzu žádný zásadní problém a dal mi přesně to, co jsem dle mého názoru potřeboval. Proložení výkladu názornými příklady vedlo velmi efektivně k rychlému pochopení. Prostě perfektní. Jsem opravdu spokojen a čas, který jsem školením strávil určitě stálo za to vynaložit. Po celou dobu školení jste se držel připravené osnovy a přitom reagoval na individuální schopnosti studentů. Určitě Vás jako školitele a Vaše kurzy doporučím ve svém okolí.
Následný kurz Programování v PHP 5 jsem absolvoval proto, abych nahlédl do současných objektově orientovaných programátorských technik a nástrojů v PHP 5. Jsem rád, že jsem neváhal a absolvoval oba kurzy za sebou. Bylo zřejmé, že ihned po skončení nebudu schopen celou problematiku vstřebat tak, abych mohl hned začít v PHP 5 objektově programovat, ale to jsem ani neočekával. Doporučuji všem, kdo se chtějí v hutné formě v dobrém slova smyslu dozvědět o nejnovějších nástrojích, postupech a novinkách v posledních verzích PHP, aby neváhali a školení absolvovali.
auto_increment
(aniž by se někde použil).[Packer]
ručně nastavenou volbu ExpertMode
=1, která umožňuje bez potvrzení spouštět a editovat soubory v archivu.@table
dokázal seznam vlastností načíst ze struktury tabulky.Školení bylo dobře připravené a profesionálně vedené. Velmi oceňuji, že jste byl ochoten domluvit se s námi mimo standardní vypisované termíny, přijet na naše pracoviště v důležitý státní svátek a zůstat o hodinu déle oproti původnímu plánu. Ačkoliv už jsem o tématu (bezpečnost PHP skriptů) něco málo předtím věděl, zklamán jsem rozhodně nebyl, protože jsem si plno věcí ujasnil a mnohé další se dověděl. Kromě toho bylo moc fajn tu a tam (třeba o přestávkách) zabrousit i do jiných oblastí. Myslím, že se nám to všem dost hodilo. Moc se mi líbilo, že jste na konec zařadil test a podrobně jej s námi prošel. Dokonale to korespondovalo s praktickým pojetím celého školení.
Školení bylo pro mne hodně inspirativní. O většině druhů bezpečnostních rizik jsem sice v „teoretické rovině“ věděl, třeba proto, že se snažím příležitostně číst populárnější články zabývající se touto tématikou na českém webu (Lupa.cz, Zdroják), nicméně některé způsoby, jak je zneužít – a samozřejmě jak se bránit – by mne skutečně nenapadly. Školení má velmi uspořádanou, přehlednou a promyšlenou strukturu a témata, kterých se dotýká, ilustruje na příkladech včetně řešení problémů, což je velice užitečné. Osobně jsem si odnesl ze školení i spoustu nápadů typu „jak něco udělat“ či „jak navrhovat koncepci webu“. Bylo velmi příjemné, že školitel se orientuje v problematice doširoka a ne jen u bezpečnosti a umí (a nebrání se) odpovědět na většinu dotazů, které jdou nad rámec školení.
Školení dokonce veškerá očekávání předčilo, opravdu velmi dobrá úroveň. Odnesl jsem si spoustu nových poznatků a oprášil staré věcí, které v praxi občas „zapadnou“. (Velmi také děkuji za přínosnou úvodní kapitolu o HTTP protokolu a jeho hlavičkách.)
V konečném výsledku za to poměrně únavná cesta „na otočku“ z Ostravy opravdu stála.
Školení mne zprvu překvapilo prvním tématem „HTTP protokol“. Ve školení výkonnosti PHP aplikací mne to poměrně zarazilo, čekal jsem spíše popis samotného PHP a optimalizaci kódu. Byl jsem ale mile překvapen širokým záběrem výkladu v souvislostech (klientská cache prohlížeče, specifické vlastnosti některých browserů, něco ke konfiguraci webserveru, atd.), které by měl vývojář při návrhu aplikace uvažovat. Přednášející je přístupný diskusi i otázkám (i na obědě :-)). Program je rozdělen do dvou částí, dopolední a odpolední, přičemž i ty jsou dále děleny do bloků oddělených přestávkami. Velmi bych vyzdvihl názorné demonstrování na přípravených příkladech, naopak za mě osobně se musím přiznat, že poslední téma jsem už příliš nevnímal.
Školení bylo výborné, o JavaScriptu jsem se dozvěděl pár věci o kterých jsem předtím jen tušil. A to jsem na školení nešel kvůli JavaScriptu, ale AJAXu. Odpolední část týkající se AJAXu byl pro mne zlatý hřeb celého školení. Co bych ale doporučil pro příště, je udělat školení dvoudenní a věnovat trochu více času příkladům, které by si účastníci dělali sami. Celkově školení hodnotím jako velmi dobré.
Se školením jsem byl velice spokojen. Splnilo přesně to, co jsem od něj čekal. Líbil se mi nejen obsah školení, ale i jeho podání. Nejvíce oceňuji praktický příklad.
Školení Bezpečnost PHP aplikací bylo bezvadně připravené. Model vysvětlení problematiky, způsob obrany a praktický příklad je přesně to, jak by podobná školení měla vypadat. Výklad by podán profesionální formou a přesto pro všechny srozumitelně. Mnohokrát děkuji za množství nápadů, tipů a triků, jak udělat PHP aplikace bezpečnější.
Se školením jsem byl maximálně spokojen, bylo to pěkně seřazené a vykládané srozumitelně. Přestože jsem neměl s JavaScriptem žádné zkušenosti, tak byl výklad srozumitelný.
document.body.className += ' javascript';
a styl definovat jako .javascript .hidden-js
spolu s ostatními styly./dev/null
$hloubka
inicializovat na 0 a na závěr k ní nepřičítat jedinčku.POST
a přesto je pole $_FILES prázdné, tak nutně došlo k překročení velikosti odesílaných dat.Vzhľadom na to, že som už mal s Javascriptom predtým isté krátke skúsenosti, časť informácií, hlavne tých v prvej polovici školenia mi už bola známa. Ale na druhej strane tam bolo vysvetlených veľa princípov, ktoré mi chýbali k pochopeniu niektorých javascriptových konštrukcií (vytváranie tried, rozdiely medzi poľom a objektom). Druhá polovica zameraná na AJAX bola veľmi náučná. V podstate som pochopil princípy spracovávania AJAXových dotazov a už som toho aj plne využil. Celkovo som so školením spokojný a teším sa na školenie o frameworkoch Javascriptu.
Školení bylo koncipováno přesně, jak jsem si představoval, že by mělo vypadat. Výklad byl podaný velice profesionálně, přesto naprosto srozumitelně. Rozdělení jednotlivých částí výkladu na „první teorie a v zápětí příklad“ bylo velice příjemné. Člověk nemusel pátrat v paměti, o čem jsme se to vlastně bavili před třemi hodinami. Počet účastníků (9) je akorát. Spousta času na dotazy a „rodinná atmosféra“. Celkový dojem je tedy více než kladný. Navíc se mi podařilo to, s čím jsem tam šel. Ucelení a prohloubení znalostí o bezpečnostních rizikách a k tomu postupy, jak jim předejít a jak je potlačit. Mohu tedy každému jedině doporučit.
Školení „Bezpečnost PHP aplikací“ v podání Jakuba Vrány je výborným shrnutím dané problematiky. Pojetí výkladu podléhá striktnímu rozvrhu – vysvětlení problému, vysvětlení ochrany, příklad. Jakubova jistota pramení z perfektních znalostí oboru, kvalita lektorské části je pak dána jeho zkušenostmi s pořádáním těchto školení i z akademické půdy. Ve spojení s diskusí na každé téma, s vyměňováním zkušeností jednotlivých přítomných vývojářů, se jedná o neocenitelně strávený den.
V první řadě je to školení Bezpečnost PHP aplikací, které už jednou proběhlo. Další termín je čtvrtek 22. 6. 2006, volných už je jen několik posledních míst.
Ve spolupráci se serverem Root.cz v pondělí 12. 6. 2006 školím Programování v PHP 5.
A do třetice se jedná o Návrh a používání MySQL databáze, které proběhne ve středu 21. 6. 2006.
array_key_exists("a", get_defined_vars())
.I když se programováním databází neživým a je to jen můj koníček, bylo pro mě vaše školení velkým přínosem, ujasnil jsem si spoustu věcí, které jsem buď nepoužíval, protože jsem jim moc nerozuměl, a nebo jsem je používal špatně. Vše bylo srozumitelným způspobem vysvětleno.
LC_CTYPE
funkcí setlocale na kódování UTF-8, např. tedy cs_CZ.utf-8
.Školení bylo perfektně připraveno. Ukázky jednotlivých možností útoku byly velmi dobře popsány a na jednoduchých a přehledných příkladech demonstrovány, samozřejmě včetně popsání možností, jak se těmto útokům bránit. Školení mohu určitě doporučit.
Jsem velmi rád, že jsem se nakonec rozhodl navštívit právě vaše školení. Přesvědčil jste mne nejen že jste v oboru opravdový odborník, ale především své znalosti dokážete velmi poutavou a srozumitelnou formou prodat. Není k ničemu přednáška od odborníka, na jejímž konci zjistíte, že jste vlastně vůbec ničemu nerozuměl. U vás tomu bylo přesně naopak, výklad jste měl odborný, přesto jste mu dokázal dát lidštější formu a to mi přesně sedělo. Za výbornou přednášku a nové znalosti mnohokrát děkuji. Jednu výtku bych tu přeci jen měl. Máte vůbec představu, jaké to je přijíždět k vám na kurz v blažené nevědomosti a odjíždět s pocitem hrůzy, kolik chyb po sobě budu muset opravit?
Problematika „Bezpečnost PHP aplikací“ je velmi aktuální a tvoří nezbytnou součást firemní IT strategie. Váš výklad byl založen především na praktických ukázkách chování systému při napadení útočníkem, což je u daného tématu nezbytné ke správnému pochopení postupů a snadnějšímu zapracování ochranných opatření při zabránění neoprávněným přístupům k citlivým informacím. Absolvoval jsem nespočetně kurzů, seminářů a školení, ale Váš přístup byl opravdu příkladný. Je zřejmé, že výuka je Vaší „profesí“, protože umíte informace podat. Seznámil jsem se i s Vaším blogem, který je velmi inspirativní a reaguje pružně na aktuální problémy LAMP. Budu i nadále sledovat nabídky Vašich kurzů a dožadovat se účasti, když už ne pro sebe, tak pro své kolegy.
Velmi Vám děkuji za zaslané materiály i školení. Jako drobnému uživateli mi to uštetřilo mnoho času, který bych jinak strávil metodou pokus omyl a možná by mi některé zajímavé postřehy z Vašeho školení i tak zůstaly skryty.
Školení na Javascript a AJAX bylo velmi dobré pro toho, kdo Javascript neznal nebo měl o něm základní znalosti a chtěl si je rozšířit. Problematika JS a Ajaxu je natolik široká, že ji nelze uspokojivě dát do jednoho dne. Moje znalosti JS jsou celkem dobré, ale zápasím s jednotlivými rozdíly v prohlížečích, proto se mi líbila část o tom, jak JS debugovat, to rozšířilo moje znalosti. Na Ajax nezbylo podle mě dost času a také nebyl čas si problematiku trochu více na vlastní kůži na semináři ošahat.
I přesto, že se v oblasti už nějaký ten pátek pohybuji, bylo pro mě toto školení přínosem hlavně kvůli čas/informační hodnota. Výborné shrnutí potřebných informací a osvěžení dřívejších znalostí + mnoho informací nových. Za těch pár korun je den skutečně plný užitečných informací. Škoda jen těch příšerných myší ve školící místostí...
S Vaším školením jsem byl velice spokojen. O většině typů útoků jsem již něco věděl, nicméně Vámi připravený výklad mi pomohl utřídit si své dosavadní znalosti a rozšířit obzor zejména v optimálním způsobu řešení předváděných problémů. Příjemnou věcí byla také sleva, kterou poskytujete studentům. Pokud budu moci, určitě se rád zúčastním dalších školení.
Za školení bych měl děkovat já. Děkuji za materiály. Školení bylo fajn a přínosné. Pokud mám napsat nějaké shrnutí, tak mohu určitě říct: Vaše školení o MySQL, které je prezentované člověkem z praxe, bylo hodně kvalitní. Nešlo ani tak o prezentaci jako o to, že jsem měl možnost poslechnout si člověka z praxe a tak jsem pochopil spoustu věcí mnohem lépe. Školení nebyl jen výklad z nastudované knížky a to bylo rozhodně to, co mě na školení hodně potěšilo. Pokud mám něco kritizovat, tak asi cestu autem do Prahy a zpět do Brna :). Možná je trošku škoda, že jste se hodně věnoval zálohování a provozování vlastního serveru, když většina lidí využívá webhosting, třeba na úkor skládání dotazů.
I přes to, že má člověk v oblasti mnoho znalostí a zkušeností, školení mi umožnilo ta nejdůležitější témata znovu otevřít a s odborníkem je rozvést do důsledků. S ohledem na naši současnou práci jsem si tak ujasnil, co děláme dobře a kde je prostor pro zlepšení. Z vydařených školení vždy odcházím plný inspirace a motivace do další práce. Obě školení Jakuba Vrány jednoznačně patřila mezi ně.
I přes to, že má člověk v oblasti mnoho znalostí a zkušeností, školení mi umožnilo ta nejdůležitější témata znovu otevřít a s odborníkem je rozvést do důsledků. S ohledem na naši současnou práci jsem si tak ujasnil, co děláme dobře a kde je prostor pro zlepšení. Z vydařených školení vždy odcházím plný inspirace a motivace do další práce. Obě školení Jakuba Vrány jednoznačně patřila mezi ně.
Školení bylo velmi dobře připravené. Každá „hackerská“ technika byla probírána samostatně, u každé byl vysvětlený princip fungování následovaný výkladem, jak aplikaci proti takovému útoku ochránit. Některé techniky jsou notoricky známé, ale dozvěděli jsme se i o takových, nad kterými mnozí kroutili hlavami, protože je vůbec neznali. Vše jsme si vyzkoušeli i na připravených příkladech. Školení předčilo mé očekávání a hodnotím ho pro svou další práci jako opravdu hodně přínosné.
Srozumitelný výklad s přestávkami „tak akorát“. Pěkné. Výborné bylo i to malé cvičení na závěr, člověk si to tak nějak urovná v hlavě. Dále bych velmi pochválil pořadí jednotlivých témat. Osobně dávám hodnocení asi 90%, byl jsem velmi spokojen.
I já bych Vám chtěl poděkovat. Školení bylo opět velmi kvalitní. Zajímalo mě především používání a navrhování indexů a to bylo vysvětleno velmi hezky a pochopitelně. Další velmi dobře vysvětlené téma byly transakce. Co se týče dalších témat, hodně jsem se těšil na řešení jazykových mutací, i když zřejmě nebudu postupovat stejně jako vy, byl jsem rád, že jste mi schválil můj způsob. Obecně bylo školení velmi dobře pojato. Já osobně bych v něm nemusel mít probírání klasických věcí jako INSERT, UPDATE, myslím tím takové ty jednoduché dotazy, které asi většina lidí běžně používá. Ale to je čistě můj subjektivní pohled.
Každopádně moc děkuji, jsem velmi rád, že jsem se tohoto školení mohl zúčastnit.
Jako pedagog dokážu skutečně ocenit náročnost takového kurzu.
I vzhledem k nízké časové dotaci školení proběhlo v avizovaném rozsahu a pro mě bylo jistě přínosem. Také po stránce didaktické jsem byl velmi velmi spokojen a kurz naprosto splnil moje očekávání. Jenom si neodpustím drobnou připomínku, která již, mám dojem, byla v některé z diskuzí avizována. Spíše by mi vyhovovalo opustit základy návrhu databáze a základní SQL příkazy a soustředit se více na druhou část školení (replikace, knihovna MySQLi, PDO, atd.). Případně by mi přišlo vhodnější rozdělit školení na dvě samostatná.
Jinak ještě jednou děkuji a těším se na další Vaše školení.
#
a v JavaScriptu přes 27× delší document.getElementById('')
.-1
limit odstraní zcela, ale v dokumentaci jsem tuto informaci nenašel.imagecreatefromico
můžeme třeba funkcí imagepng uložit do souboru nebo poslat prohlížeči.<%
naopak bude spolu s direktivou asp_tags odstraněna,\z
místo $
array_diff_assoc($_GET, array("page" => $_GET["page"]))
.Pokud jde o shrnutí dojmů ze školení, tak jsem spokojen. Dozvěděl jsem se řadu užitečných informací, o které jsem měl zájem. Jen mi přišlo, že probrat všechna zvolená témata v jednom dni vyvolalo zejména ke konci určitou časovou tíseň, kvůli které se posledním tématům nedostalo pozornosti, jakou by si možná zasloužila, a i prostor pro diskusi mohl být trochu větší.
Master_Log_File
a Exec_Master_Log_Pos
rozhodnout o tom, zda se následující SELECT má provést na slave nebo na master serveru.[
?>
a volitelným koncem řádku.id
musí být setříděn ve stejném pořadí jako publikovano
– pokud bychom použili publikovano DESC, id
, tak se index (publikovano DESC, id)
nepoužije, protože MySQL ho vytvoří jako (publikovano, id)
a s rozdílem v řazení si neporadí)search.ini
, neexistuje funkce K vyhledávání přiřadit klíčové slovoDELETE tab FROM tab, tab2 WHERE tab.id = tab2.id
.Přestože jsem se již bezpečností PHP aplikací dříve zabýval, bylo pro mě toto školení rozhodně přínosné. Zkonzultoval jsem s lektorem i ostatními posluchači dosavadní zkušenosti a načerpal nové znalosti. Také kladně hodnotím, že se nejednalo pouze o výklad, ale rovnou jsme měli možnost zkusit si některé praktiky na příkladech. Byly připraveny virtuální servery pro jednotlivé posluchače, takže jsme si mohli všichni hackovat své vlastní výtvory. Samozřejmě si člověk nemůže všechno pamatovat a už vůbec si nemůže stihnout všechno poznamenat, takže bylo super, že jsme dostali veškeré materiály v elektronické podobě a v budoucnu se k nim můžeme vrátit.
Jediným nedostatkem bylo vybavení učebny. Staré „kuličkové“ myši bylo docela obtížné přemluvit ke spolupráci, ale lektor přislíbil, že se pokusí o nápravu. Softwarové vybavení (nenainstalován nějaký „normální“ browser a editor) se dalo naštěstí na místě napravit.
Na závěr školení po nás chtěl lektor vytvořit aplikaci pro registraci uživatelů do MySQL a odeslání upozornění emailem. Cílem samozřejmě bylo na vlastním kódu odhalit nedostatky. To je samo o sobě dobrý nápad, ale komu se s tím chce psát, když už to má několikrát hotové a vychytané, že? Kdybych to věděl předem, tak bych si s sebou na „flešce“ vzal všechny svoje skriptíky a bylo by to raz dva.
Školení rozhodně doporučuji jak začátečníkům tak zkušenějším kodérům. Určitě nebudete litovat.
Ráda bych Vám ještě jednou jménem svým i jménem mých kolegů poděkovala za Váš skvělý výklad, který nám přinesl nové poznatky a pohledy, které určitě využijeme ve své další práci.
Chtěl bych Vám moc poděkovat za Vaše školení. Rozhodně nemůžu opomenout užitečnost školení MySQL, které mi trošku rozšířilo obzory v nových možnostech verze 5.0 a zároveň bylo i vhodným doplňkem bezpečnostního školení.
Chtěl bych Vám moc poděkovat za Vaše školení. Zejména pak školení Bezpečnost PHP aplikací pro mě bylo velmi přínosné a chvílemi mě jímala hrůza, co jsem kde zanedbal (Cross-site Request Forgery a Response Splitting), ale alespoň o těchto možných útocích vím a budu pracovat na řešení problému (a pro příště na ně budu myslet dopředu a nebudu pak muset pracně zpětně upravovat aplikace). Navíc jsem se dozvěděl i několik dalších zajímavých „drobností“, které jsem ještě nemusel řešit, ale na které je dobré pamatovat již při vytváření aplikací, čímž mi školení jistě do budoucna ušetřilo spoustu času.
Vaše školení mělo velmi dobrou úroveň a doporučil bych ho všem, kteří nemají velké povědomí o možnostech útoků na PHP aplikace. Sám jsem o mnoha útocích již věděl (také hlavně díky Vašemu blogu), nicméně jsem se dozvěděl i nové informace z této oblasti. Velké plus školení jako takových je možnost rozboru konkrétních problémů/útoků. Zkrátka jsem rád, že jsem ho absolvoval.
Jak správně poznamenali čtenáři v diskusi, je tato technika velice citlivá na bezpečnost dat uložených v databázi. Proto nabízím její vylepšení:
md5(hmac_md5(password, challenge))
.hmac_md5(password, old_challenge)
a md5(hmac_md5(password, new_challenge))
.md5(old_hmac)
souhlasí s tím, co je uloženo v databázi, a pokud ano, přepíše se to novými hodnotami.Autorem této myšlenky je Paul Jonhston. Přikládám Proof of Concept.
pack("H*", md5($s))
lze v PHP 5 použít md5($s, true)
.()
, {}
, []
nebo <>
. Jejich výhoda spočívá v tom, že je uvnitř výrazu můžeme použít bez jakéhokoliv ošetřování, nevýhoda zase v tom, že jako oddělovač nejsou moc výrazné."?" . SID
. V konstantě SID je uložen řetězec potřebný pro předání session identifikátoru, v případě existence session cookie je prázdný.id
musí mít příznak AUTO_INCREMENT<a href="|">
kurzor na místě znaku |
a má se doplnit atribut title=""
, většina lidí nejprve přejde o znak doprava a atribut doplní. Já místo toho přímo vložím " title="
. Tento trik se dá použít i u běžných textů – začíná-li věta slovem Souhlas
a má se nahradit za Samozřejmý souhlas
, není nutné dopsat Samozřejmý
a nahradit velké S za malé, stačí na správné místo dopsat amozřejmý s
. Zdá se to jako hloupost, ale při rutinním používání to trochu vzácného času ušetří../
nebo\0
include "./file.php"
místo include "file.php"
. Já bych to spíš doporučil kvůli zamezení kolizí se soubory v ostatních adresářích include_path.substr($_POST["jmeno"], 0, 10)
totiž s touto direktivou např. pro řetězec František'
vrátí František\
a bezpečnostní problém je na světě.chr_utf8
potom vrací reprezentaci těchto znaků v kódování UTF-8$_GET["var"]
), který nebyl v době volání nastaven, bude mít po zavolání funkce hodnotu null. Myslím, že když o těchto nedostatcích člověk ví, dá se s nimi žít.kontakt.php/index.php
a uvedenou kontrolu tím obalamutí.PHPSESSID
, protože chytré vyhledávače (např. Google) hodnotu tohoto parametru ignorují.salt