Pokusil jsem se dát dohromady základní přehled častých chyb, na které člověk v různých webových aplikacích narazí.
Zároveň také otevírám téma striktnosti práce s typy a hodnotami, které se často ignoruje, ale každá opravdu solidní aplikace jej musí řešit.
1. Před čím tě Nette ani
Symfony neochrání
@ProchazkaFilip
#makeCodeNotWar
2. ~ Anonym, v současnosti v programu ochrana svědků
3. Staré verze
● PHP7
● I v Nette jsou security bugy
● Composer
● PECL
● Systém
● Roave/SecurityAdvisories
● Symfony security:check
4. Knihovny
● Je knihovna “stable”? Stará se o ni autor?
● Nastudovat api/internals
● Security audit?
● Nikdy nic nepředpokládejte!
● Integrační testy
● Pochopení flow dat - xdebug
15. SQL: MySQL sql mode
● strict = STRICT_TRANS_TABLES or STRICT_ALL_TABLES
○ Různá výchozí hodnota v závislosti na verzi MySQL
● ERROR_FOR_DIVISION_BY_ZERO + strict => error
● NO_UNSIGNED_SUBTRACTION
● NO_ZERO_DATE + strict => error
● NO_ZERO_IN_DATE + strict => error
16. Validace vstupů
● Vyvarovat se
○ Použití globals $_
○ filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
● Používat
○ Value/DTO objekty
■ Symfony Data Transformers?
○ Json Schema
○ JMS Serializer
○ Symfony/Validator
● Filesystém
○ fopen($file, "t");
21. File Upload
● $_FILES["file"]["type"];
● Kontrolovat
○ koncovku
○ mime typ
● Stripnout EXIF data a uložit bokem, pokud je potřebuju
● Zajistit, aby nešlo spustit soubor připojením .php za název
● Vlastní názvy pomocí
○ Strings::webalize(), lépe random/UUID
○ lomítka a speciální znaky
○ null byte exploity v názvu souboru
22. HTTPS & Security Headers
● Secured session sušenka (& permanent login cookie)
○ session.cookie_httponly=1
○ session.cookie_secure=1
○ session.use_only_cookies=1
● HSTS
○ Zavádět s malou expirací, postupně zvyšovat když vše funguje
● CORS
● CSP
○ https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
○ https://github.com/spaze/csp-config
○ https://csp-evaluator.withgoogle.com/
23. HTTPS & Security Headers
● SRi
○ Michal Špaček: HTTP hlavičky, Subresource Integrity a spol.
○ https://github.com/spaze/sri-macros
● securityheaders.io
● observatory.mozilla.org
24. Přístupný důvěrný obsah
● Čitelné .neon/.yml configy
● git, svn
● Uniknutí Laděnky
○ Debug mode
○ Přístupné na veřejné adrese, která je nezabezpečená
25. Insecure Direct Object References
● Možnost editace něčeho k čemu nemám přístup
● Možnost vykradení dat
● UUID (neřeší problém, jen ho zmírní)
27. Random
● Kde
○ Generovaná hesla
○ jakékoliv tokeny v url a formulářích
● Co nepoužívat
○ rand, srand, getrandmax -> mt_rand()
● Co použít
○ random_int()
○ random_bytes()
○ Random::generate()
● paragonie/random_compat
28. Crypto:
● Použít libsodium nebo openssl
● mcrypt je od 7.1 deprecated
● defuse/php-encryption
“The First Rule of Cryptography: Don't Implement it Yourself”
29. Hashování
Cryptographic Hashes
● Fast
● Only one input: The message
Password Hashes
● Intentionally slow
● At least three inputs:
○ The password
○ A per-user salt
○ A cost factor (how expensive to make the computation)
Source
30. Hashování
● memory-hard algoritmy
○ Scrypt
○ Argon2
○ Bcrypt - don’t be smart, just use Bcrypt
● Bcrypt omezení (bugs in the algorithm itself)
○ 72 znaků
○ Truncate NUL byte
○ base64_encode(hash('sha384', $password, true));
● password_hash() & password_verify()
● Kdy má smysl šifrovat hashe hesel?
○ Když je všechno ostatní vyřešný!
Source
31. Side-channel attack
● Constant-time porovnávání stringů
○ hash_equals()
○ baseN kódování paragonie/constant_time_encoding
○ Anthony Ferrara: It's All About Time
● password_verify() má ochranu zabudovanou
33. Díky všem co přispěli!
● Jan Tvrdík @jantvrdik
● Jakub Chábek @grongor
● Jan-Sebastian Fabík @janfabik
● David Matějka @matej_21
● Petr Soukup @petrsoukup
● Jan Škrášek @hrachcz
● Jiří Pudil @jiripudil
● Patrik Votoček @PatrikVotocek
● Michal Špaček @spazef0rze
● Jan Kuchař @honzakuchar