$30 off During Our Annual Pro Sale. View details »

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. 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
  5. Špatné nastavení • Umyslně • Z neznalosti/nepochopení • security: false

    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  6. Security through obscurity • PHP: expose_php=Off • Nginx: server_tokens off;

    • Http client knihovny vs verze PHP
  7. XSS $this->flashMessage(Html::el('p')->setHtml(sprintf( 'Váš nový účet je <b>%s</b>', $username )));

  8. XSS / escapování • |noescape ◦ translator • href="foo?bar={$bar|urlescape}" •

    escapeshellarg()
  9. SQL "UPDATE users SET pwd = '$pwd' WHERE id =

    '$uid'";
  10. 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
  11. SQL: escapování REGEX • preg_quote()

  12. SQL: IS vs = SELECT * FROM t WHERE col

    IS NULL; SELECT * FROM t WHERE col = NULL;
  13. 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;'));
  14. SQL: kódování • SET NAMES utf8; • DSN charset=utf8 •

    Nové MySQL => utf8mb4
  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");
  17. Validace vstupů: regulární výrazy • Multiline • \A \Z •

    ^ $
  18. 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
  19. CSRF • nextras/secured-links • $form->addProtection();

  20. Cache • Sdílená cache ◦ APC • Cache poisoning ◦

    Router ◦ Data v aplikaci ◦ HTTP (proxyny atd) • umask(0);
  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í)
  26. Unvalidated Redirects and Forwards • Zneužití redirect parametru • Backlinky

  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
  32. Monitoring • Logovat “nebezpečné” operace ◦ Přihlášení ◦ Registrace ◦

    Zapomenuté heslo ◦ …?
  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
  34. Díky za pozornost! @ProchazkaFilip #makeCodeNotWar