Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

    View full-size slide

  2. ~ Anonym, v současnosti v programu ochrana svědků

    View full-size slide

  3. Staré verze
    ● PHP7
    ● I v Nette jsou security bugy
    ● Composer
    ● PECL
    ● Systém
    ● Roave/SecurityAdvisories
    ● Symfony security:check

    View full-size slide

  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

    View full-size slide

  5. Špatné nastavení
    ● Umyslně
    ● Z neznalosti/nepochopení
    ● security: false
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

    View full-size slide

  6. Security through obscurity
    ● PHP: expose_php=Off
    ● Nginx: server_tokens off;
    ● Http client knihovny vs verze PHP

    View full-size slide

  7. XSS
    $this->flashMessage(Html::el('p')->setHtml(sprintf(
    'Váš nový účet je %s',
    $username
    )));

    View full-size slide

  8. XSS / escapování
    ● |noescape
    ○ translator
    ● href="foo?bar={$bar|urlescape}"
    ● escapeshellarg()

    View full-size slide

  9. SQL
    "UPDATE users
    SET pwd = '$pwd'
    WHERE id = '$uid'";

    View full-size slide

  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

    View full-size slide

  11. SQL: escapování REGEX
    ● preg_quote()

    View full-size slide

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

    View full-size slide

  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;'));

    View full-size slide

  14. SQL: kódování
    ● SET NAMES utf8;
    ● DSN charset=utf8
    ● Nové MySQL => utf8mb4

    View full-size slide

  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

    View full-size slide

  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");

    View full-size slide

  17. Validace vstupů: regulární výrazy
    ● Multiline
    ● \A \Z
    ● ^ $

    View full-size slide

  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

    View full-size slide

  19. CSRF
    ● nextras/secured-links
    ● $form->addProtection();

    View full-size slide

  20. Cache
    ● Sdílená cache
    ○ APC
    ● Cache poisoning
    ○ Router
    ○ Data v aplikaci
    ○ HTTP (proxyny atd)
    ● umask(0);

    View full-size slide

  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

    View full-size slide

  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/

    View full-size slide

  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

    View full-size slide

  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á

    View full-size slide

  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í)

    View full-size slide

  26. Unvalidated Redirects and Forwards
    ● Zneužití redirect parametru
    ● Backlinky

    View full-size slide

  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

    View full-size slide

  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”

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

  32. Monitoring
    ● Logovat “nebezpečné” operace
    ○ Přihlášení
    ○ Registrace
    ○ Zapomenuté heslo
    ○ …?

    View full-size slide

  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

    View full-size slide

  34. Díky za pozornost!
    @ProchazkaFilip
    #makeCodeNotWar

    View full-size slide