This site is the archived OWASP Foundation Wiki and is no longer accepting Account Requests.
To view the new OWASP Foundation website, please visit https://owasp.org
Difference between revisions of "OWASP Backend Security Project PHP Security Programming"
(New page: = Overview = = Description = = References = = Tools =) |
(→Description) |
||
Line 2: | Line 2: | ||
= Description = | = Description = | ||
+ | |||
+ | = Examples = | ||
+ | To better understand how to secure code a PHP application some examples of | ||
+ | vulnerable code is provided in this paragraph. | ||
+ | |||
+ | == Login Form == | ||
+ | On this example we're going to see a tipical Login Form. On our example WEB SITE user need to supply a username/password pair in order to be authenticated. | ||
+ | |||
+ | |||
+ | Here follows the authentcation form: | ||
+ | |||
+ | [[Image:Owasp_bsp_php_1.jpg]] | ||
+ | |||
+ | Such a login page well call ''login.php'' with supplied user credentials. | ||
+ | |||
+ | <nowiki> | ||
+ | <?php | ||
+ | include('./db.inc'); | ||
+ | |||
+ | function sAuthenticateUser($username, $password){ | ||
+ | $authenticatedUserName=""; | ||
+ | if ($link = iMysqlConnect()) { | ||
+ | |||
+ | $query = "SELECT username FROM users"; | ||
+ | $query .= " WHERE username = '".$username."'"; | ||
+ | $query .= " AND password = md5('".$password."')"; | ||
+ | $result = mysql_query($query); | ||
+ | |||
+ | if ($result) { | ||
+ | if ($row = mysql_fetch_row($result)) { | ||
+ | $authenticatedUserName = $row[0]; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return $authenticatedUserName; | ||
+ | |||
+ | } | ||
+ | |||
+ | if ($sUserName = sAuthenticateUser($_POST["username"], | ||
+ | $_POST["password"])) { | ||
+ | echo "Wellcome ".$sUserName; | ||
+ | } else { | ||
+ | die('Unauthorized Access'); | ||
+ | } | ||
+ | |||
+ | ?> | ||
+ | </nowiki> | ||
+ | |||
+ | '''db.inc:''' | ||
+ | <nowiki> | ||
+ | |||
+ | <?php | ||
+ | |||
+ | define('DB_HOST', "localhost"); | ||
+ | define('DB_USERNAME', "user"); | ||
+ | define('DB_PASSWORD', "password"); | ||
+ | define('DB_DATABASE', "owasp"); | ||
+ | |||
+ | |||
+ | function iMysqlConnect(){ | ||
+ | $link = mysql_connect(DB_HOST, | ||
+ | DB_USERNAME, | ||
+ | DB_PASSWORD); | ||
+ | |||
+ | if ($link && mysql_select_db(DB_DATABASE)) | ||
+ | return $link; | ||
+ | return FALSE; | ||
+ | } | ||
+ | |||
+ | ?></nowiki> | ||
+ | |||
+ | == Online Catalog == | ||
+ | |||
+ | Let take another example: an Online Book Store: | ||
+ | |||
+ | [[Image:Owasp_bsp_php_3.jpg]] | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | '''catalog.php:''' | ||
+ | |||
+ | <nowiki> | ||
+ | function aGetBookEntry($id) { | ||
+ | $aBookEntry = NULL; | ||
+ | $link = iMysqlConnect(); | ||
+ | |||
+ | $query = "SELECT * FROM books WHERE id = $id"; | ||
+ | $result = mysql_query($query); | ||
+ | |||
+ | if ($result) { | ||
+ | if ($row = mysql_fetch_array($result)) { | ||
+ | $aBookEntry = $row; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return $aBookEntry; | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | $id = $_GET['id']; | ||
+ | $aBookEntry = aGetBookEntry($id); | ||
+ | |||
+ | showBook($aBookEntry); | ||
+ | </nowiki> | ||
+ | |||
+ | Basicaly it retrieves ''id'' parameter on GET query string and perform the following SQL query: | ||
+ | * ''SELECT * FROM book WHERE id = $_GET['id']'' | ||
+ | |||
+ | As in ''Login Form'' no input validation is performed and SQL Query can be manipulated to returns | ||
+ | arbitrary data and DBMS stored relations/records/functions as well. | ||
= References = | = References = | ||
= Tools = | = Tools = |
Revision as of 09:13, 21 May 2008
Overview
Description
Examples
To better understand how to secure code a PHP application some examples of vulnerable code is provided in this paragraph.
Login Form
On this example we're going to see a tipical Login Form. On our example WEB SITE user need to supply a username/password pair in order to be authenticated.
Here follows the authentcation form:
Such a login page well call login.php with supplied user credentials.
<?php include('./db.inc'); function sAuthenticateUser($username, $password){ $authenticatedUserName=""; if ($link = iMysqlConnect()) { $query = "SELECT username FROM users"; $query .= " WHERE username = '".$username."'"; $query .= " AND password = md5('".$password."')"; $result = mysql_query($query); if ($result) { if ($row = mysql_fetch_row($result)) { $authenticatedUserName = $row[0]; } } } return $authenticatedUserName; } if ($sUserName = sAuthenticateUser($_POST["username"], $_POST["password"])) { echo "Wellcome ".$sUserName; } else { die('Unauthorized Access'); } ?>
db.inc:
<?php define('DB_HOST', "localhost"); define('DB_USERNAME', "user"); define('DB_PASSWORD', "password"); define('DB_DATABASE', "owasp"); function iMysqlConnect(){ $link = mysql_connect(DB_HOST, DB_USERNAME, DB_PASSWORD); if ($link && mysql_select_db(DB_DATABASE)) return $link; return FALSE; } ?>
Online Catalog
Let take another example: an Online Book Store:
catalog.php:
function aGetBookEntry($id) { $aBookEntry = NULL; $link = iMysqlConnect(); $query = "SELECT * FROM books WHERE id = $id"; $result = mysql_query($query); if ($result) { if ($row = mysql_fetch_array($result)) { $aBookEntry = $row; } } return $aBookEntry; } $id = $_GET['id']; $aBookEntry = aGetBookEntry($id); showBook($aBookEntry);
Basicaly it retrieves id parameter on GET query string and perform the following SQL query:
- SELECT * FROM book WHERE id = $_GET['id']
As in Login Form no input validation is performed and SQL Query can be manipulated to returns arbitrary data and DBMS stored relations/records/functions as well.