Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

Před čím tě Nette ani Symfony neochrání

Před čím tě Nette ani Symfony neochrání

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.

Filip Procházka

April 17, 2017
Tweet

More Decks by Filip Procházka

Other Decks in Technology

Transcript

  1. Staré verze • PHP7 • I v Nette jsou security

    bugy • Composer • PECL • Systém • Roave/SecurityAdvisories • Symfony security:check
  2. 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
  3. Špatné nastavení • Umyslně • Z neznalosti/nepochopení • security: false

    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  4. SQL: escapování LIKE addcslashes($search_term, "%_\\"); function like($s, $e) { return

    str_replace([$e, '_', '%'], [$e.$e, $e.'_', $e.'%'], $s); } $q = $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ..."); $q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR); Source
  5. SQL: IS vs = SELECT * FROM t WHERE col

    IS NULL; SELECT * FROM t WHERE col = NULL;
  6. SQL: PDO::ATTR_EMULATE_PREPARES • Auto fallback WTF • Výjimky při prepare

    dump($dbh->prepare('INSERT;')); $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); dump($dbh->prepare('INSERT;'));
  7. 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
  8. 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");
  9. Type juggling • uživatelské vstupy - především scalar vs array

    • Podmínky ◦ == vs === ◦ in_array(,,true), array_search(,,true) ◦ switch() ◦ isset() vs array_key_exists() ◦ empty() ~ !isset($var) || $var == false • declare(strict_types=1) • $objectA > $objectB
  10. Cache • Sdílená cache ◦ APC • Cache poisoning ◦

    Router ◦ Data v aplikaci ◦ HTTP (proxyny atd) • umask(0);
  11. 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
  12. 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/
  13. 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
  14. 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á
  15. 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í)
  16. 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
  17. 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”
  18. 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
  19. 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
  20. 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
  21. 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