blob: 6e6885992f80db6b25a336a3f8b4cf04288b7303 [file] [log] [blame]
Andrey Andreev64e98aa2012-01-07 20:29:10 +02001<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
Derek Allard2067d1a2008-11-13 22:59:24 +00002/**
3 * CodeIgniter
4 *
Phil Sturgeon07c1ac82012-03-09 17:03:37 +00005 * An open source application development framework for PHP 5.2.4 or newer
Derek Allard2067d1a2008-11-13 22:59:24 +00006 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05007 * NOTICE OF LICENSE
Andrey Andreev64e98aa2012-01-07 20:29:10 +02008 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05009 * Licensed under the Open Software License version 3.0
Andrey Andreev64e98aa2012-01-07 20:29:10 +020010 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -050011 * This source file is subject to the Open Software License (OSL 3.0) that is
12 * bundled with this package in the files license.txt / license.rst. It is
13 * also available through the world wide web at this URL:
14 * http://opensource.org/licenses/OSL-3.0
15 * If you did not receive a copy of the license and are unable to obtain it
16 * through the world wide web, please send an email to
17 * licensing@ellislab.com so we can send you a copy immediately.
18 *
Derek Allard2067d1a2008-11-13 22:59:24 +000019 * @package CodeIgniter
Derek Jonesf4a4bd82011-10-20 12:18:42 -050020 * @author EllisLab Dev Team
Greg Aker0defe5d2012-01-01 18:46:41 -060021 * @copyright Copyright (c) 2008 - 2012, EllisLab, Inc. (http://ellislab.com/)
Derek Jonesf4a4bd82011-10-20 12:18:42 -050022 * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
Derek Allard2067d1a2008-11-13 22:59:24 +000023 * @link http://codeigniter.com
24 * @since Version 1.0
25 * @filesource
26 */
27
Derek Allard2067d1a2008-11-13 22:59:24 +000028/**
29 * Input Class
30 *
31 * Pre-processes global input data for security
32 *
33 * @package CodeIgniter
34 * @subpackage Libraries
35 * @category Input
Derek Jonesf4a4bd82011-10-20 12:18:42 -050036 * @author EllisLab Dev Team
Derek Allard2067d1a2008-11-13 22:59:24 +000037 * @link http://codeigniter.com/user_guide/libraries/input.html
38 */
39class CI_Input {
Derek Allard2067d1a2008-11-13 22:59:24 +000040
David Behler9b5df592011-08-14 21:04:17 +020041 /**
42 * IP address of the current user
43 *
44 * @var string
45 */
Andrey Andreev64e98aa2012-01-07 20:29:10 +020046 public $ip_address = FALSE;
David Behler9b5df592011-08-14 21:04:17 +020047 /**
48 * user agent (web browser) being used by the current user
49 *
50 * @var string
51 */
Andrey Andreev64e98aa2012-01-07 20:29:10 +020052 public $user_agent = FALSE;
David Behler9b5df592011-08-14 21:04:17 +020053 /**
54 * If FALSE, then $_GET will be set to an empty array
55 *
56 * @var bool
57 */
Andrey Andreev13774972012-01-08 04:30:33 +020058 protected $_allow_get_array = TRUE;
David Behler9b5df592011-08-14 21:04:17 +020059 /**
60 * If TRUE, then newlines are standardized
61 *
62 * @var bool
63 */
Andrey Andreev13774972012-01-08 04:30:33 +020064 protected $_standardize_newlines = TRUE;
David Behler9b5df592011-08-14 21:04:17 +020065 /**
66 * Determines whether the XSS filter is always active when GET, POST or COOKIE data is encountered
67 * Set automatically based on config setting
68 *
69 * @var bool
70 */
Andrey Andreev13774972012-01-08 04:30:33 +020071 protected $_enable_xss = FALSE;
David Behler9b5df592011-08-14 21:04:17 +020072 /**
73 * Enables a CSRF cookie token to be set.
74 * Set automatically based on config setting
75 *
76 * @var bool
77 */
Andrey Andreev64e98aa2012-01-07 20:29:10 +020078 protected $_enable_csrf = FALSE;
David Behler9b5df592011-08-14 21:04:17 +020079 /**
80 * List of all HTTP request headers
81 *
82 * @var array
83 */
Greg Akerec2f5712010-11-15 16:22:12 -060084 protected $headers = array();
David Behler9b5df592011-08-14 21:04:17 +020085
Derek Allard2067d1a2008-11-13 22:59:24 +000086 /**
Greg Akera9263282010-11-10 15:26:43 -060087 * Constructor
88 *
89 * Sets whether to globally enable the XSS processing
90 * and whether to allow the $_GET array
Greg Akera9263282010-11-10 15:26:43 -060091 */
92 public function __construct()
Derek Allard2067d1a2008-11-13 22:59:24 +000093 {
Andrey Andreev13774972012-01-08 04:30:33 +020094 log_message('debug', 'Input Class Initialized');
Derek Allard2067d1a2008-11-13 22:59:24 +000095
Phil Sturgeonc8089152010-12-27 19:06:28 +000096 $this->_allow_get_array = (config_item('allow_get_array') === TRUE);
Andrey Andreev64e98aa2012-01-07 20:29:10 +020097 $this->_enable_xss = (config_item('global_xss_filtering') === TRUE);
98 $this->_enable_csrf = (config_item('csrf_protection') === TRUE);
Derek Jones69fc4fc2010-03-02 13:36:31 -060099
Pascal Kriete14a0ac62011-04-05 14:55:56 -0400100 global $SEC;
101 $this->security =& $SEC;
Derek Jones69fc4fc2010-03-02 13:36:31 -0600102
Pascal Krieteaaec1e42011-01-20 00:01:21 -0500103 // Do we need the UTF-8 class?
Derek Jones69fc4fc2010-03-02 13:36:31 -0600104 if (UTF8_ENABLED === TRUE)
105 {
106 global $UNI;
107 $this->uni =& $UNI;
108 }
109
110 // Sanitize global arrays
Derek Allard2067d1a2008-11-13 22:59:24 +0000111 $this->_sanitize_globals();
112 }
113
114 // --------------------------------------------------------------------
115
116 /**
Greg Akera9263282010-11-10 15:26:43 -0600117 * Fetch from array
118 *
119 * This is a helper function to retrieve values from global arrays
120 *
Greg Akera9263282010-11-10 15:26:43 -0600121 * @param array
122 * @param string
123 * @param bool
124 * @return string
125 */
Bo-Yi Wu47213792011-09-13 22:44:07 +0800126 protected function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000127 {
128 if ( ! isset($array[$index]))
129 {
130 return FALSE;
131 }
132
133 if ($xss_clean === TRUE)
134 {
Pascal Kriete14a0ac62011-04-05 14:55:56 -0400135 return $this->security->xss_clean($array[$index]);
Derek Allard2067d1a2008-11-13 22:59:24 +0000136 }
137
138 return $array[$index];
139 }
140
141 // --------------------------------------------------------------------
142
143 /**
144 * Fetch an item from the GET array
145 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000146 * @param string
147 * @param bool
148 * @return string
149 */
Bo-Yi Wu4db872f2011-09-12 10:52:37 +0800150 public function get($index = NULL, $xss_clean = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000151 {
Phil Sturgeon44f21052011-02-15 21:39:25 +0000152 // Check if a field has been provided
Andrey Andreev9448afb2012-02-08 19:49:19 +0200153 if ($index === NULL && ! empty($_GET))
vascopjff1cfa12011-02-13 21:30:19 +0000154 {
Phil Sturgeon44f21052011-02-15 21:39:25 +0000155 $get = array();
vascopjff1cfa12011-02-13 21:30:19 +0000156
157 // loop through the full _GET array
Phil Sturgeon44f21052011-02-15 21:39:25 +0000158 foreach (array_keys($_GET) as $key)
vascopjff1cfa12011-02-13 21:30:19 +0000159 {
Phil Sturgeon44f21052011-02-15 21:39:25 +0000160 $get[$key] = $this->_fetch_from_array($_GET, $key, $xss_clean);
vascopjff1cfa12011-02-13 21:30:19 +0000161 }
Phil Sturgeon44f21052011-02-15 21:39:25 +0000162 return $get;
vascopjff1cfa12011-02-13 21:30:19 +0000163 }
164
Derek Allard2067d1a2008-11-13 22:59:24 +0000165 return $this->_fetch_from_array($_GET, $index, $xss_clean);
166 }
167
168 // --------------------------------------------------------------------
169
170 /**
171 * Fetch an item from the POST array
172 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000173 * @param string
174 * @param bool
175 * @return string
176 */
Bo-Yi Wu4db872f2011-09-12 10:52:37 +0800177 public function post($index = NULL, $xss_clean = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000178 {
Phil Sturgeon44f21052011-02-15 21:39:25 +0000179 // Check if a field has been provided
Andrey Andreev9448afb2012-02-08 19:49:19 +0200180 if ($index === NULL && ! empty($_POST))
vascopj0ba58b82011-02-06 14:20:21 +0000181 {
Phil Sturgeon44f21052011-02-15 21:39:25 +0000182 $post = array();
vascopj0ba58b82011-02-06 14:20:21 +0000183
Phil Sturgeon44f21052011-02-15 21:39:25 +0000184 // Loop through the full _POST array and return it
185 foreach (array_keys($_POST) as $key)
vascopj0ba58b82011-02-06 14:20:21 +0000186 {
Phil Sturgeon44f21052011-02-15 21:39:25 +0000187 $post[$key] = $this->_fetch_from_array($_POST, $key, $xss_clean);
vascopj0ba58b82011-02-06 14:20:21 +0000188 }
Phil Sturgeon44f21052011-02-15 21:39:25 +0000189 return $post;
vascopj0ba58b82011-02-06 14:20:21 +0000190 }
David Behler9b5df592011-08-14 21:04:17 +0200191
Derek Allard2067d1a2008-11-13 22:59:24 +0000192 return $this->_fetch_from_array($_POST, $index, $xss_clean);
193 }
194
Derek Jones69fc4fc2010-03-02 13:36:31 -0600195
Derek Allard2067d1a2008-11-13 22:59:24 +0000196 // --------------------------------------------------------------------
197
198 /**
199 * Fetch an item from either the GET array or the POST
200 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000201 * @param string The index key
202 * @param bool XSS cleaning
203 * @return string
204 */
Bo-Yi Wu4db872f2011-09-12 10:52:37 +0800205 public function get_post($index = '', $xss_clean = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000206 {
Andrey Andreev9448afb2012-02-08 19:49:19 +0200207 return isset($_POST[$index])
208 ? $this->post($index, $xss_clean)
209 : $this->get($index, $xss_clean);
Derek Allard2067d1a2008-11-13 22:59:24 +0000210 }
211
212 // --------------------------------------------------------------------
213
214 /**
215 * Fetch an item from the COOKIE array
216 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000217 * @param string
218 * @param bool
219 * @return string
220 */
Bo-Yi Wu4db872f2011-09-12 10:52:37 +0800221 public function cookie($index = '', $xss_clean = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000222 {
223 return $this->_fetch_from_array($_COOKIE, $index, $xss_clean);
224 }
225
Derek Jones69fc4fc2010-03-02 13:36:31 -0600226 // ------------------------------------------------------------------------
227
228 /**
229 * Set cookie
230 *
freewil4ad0fd82012-03-13 22:37:42 -0400231 * Accepts seven parameters, or you can submit an associative
Derek Jones69fc4fc2010-03-02 13:36:31 -0600232 * array in the first parameter containing all the values.
233 *
Derek Jones69fc4fc2010-03-02 13:36:31 -0600234 * @param mixed
235 * @param string the value of the cookie
236 * @param string the number of seconds until expiration
Derek Jones37f4b9c2011-07-01 17:56:50 -0500237 * @param string the cookie domain. Usually: .yourdomain.com
Derek Jones69fc4fc2010-03-02 13:36:31 -0600238 * @param string the cookie path
239 * @param string the cookie prefix
Phil Sturgeond8d1e242011-02-16 17:23:16 +0000240 * @param bool true makes the cookie secure
freewil4ad0fd82012-03-13 22:37:42 -0400241 * @param bool true makes the cookie accessible via http(s) only (no javascript)
Derek Jones69fc4fc2010-03-02 13:36:31 -0600242 * @return void
243 */
freewil4ad0fd82012-03-13 22:37:42 -0400244 public function set_cookie($name = '', $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = FALSE, $httponly = FALSE)
Derek Jones69fc4fc2010-03-02 13:36:31 -0600245 {
246 if (is_array($name))
247 {
tobiasbg9aa7dc92011-02-18 21:57:13 +0100248 // always leave 'name' in last place, as the loop will break otherwise, due to $$item
freewil4ad0fd82012-03-13 22:37:42 -0400249 foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'secure', 'httponly', 'name') as $item)
Derek Jones69fc4fc2010-03-02 13:36:31 -0600250 {
251 if (isset($name[$item]))
252 {
253 $$item = $name[$item];
254 }
255 }
256 }
257
Andrey Andreev9448afb2012-02-08 19:49:19 +0200258 if ($prefix == '' && config_item('cookie_prefix') != '')
Derek Jones69fc4fc2010-03-02 13:36:31 -0600259 {
260 $prefix = config_item('cookie_prefix');
261 }
Andrey Andreev9448afb2012-02-08 19:49:19 +0200262 if ($domain == '' && config_item('cookie_domain') != '')
Derek Jones69fc4fc2010-03-02 13:36:31 -0600263 {
264 $domain = config_item('cookie_domain');
265 }
Andrey Andreev9448afb2012-02-08 19:49:19 +0200266 if ($path == '/' && config_item('cookie_path') !== '/')
Derek Jones69fc4fc2010-03-02 13:36:31 -0600267 {
268 $path = config_item('cookie_path');
269 }
Andrey Andreev9448afb2012-02-08 19:49:19 +0200270 if ($secure == FALSE && config_item('cookie_secure') != FALSE)
tobiasbg9aa7dc92011-02-18 21:57:13 +0100271 {
272 $secure = config_item('cookie_secure');
273 }
freewil4ad0fd82012-03-13 22:37:42 -0400274 if ($httponly == FALSE && config_item('cookie_httponly') != FALSE)
275 {
276 $httponly = config_item('cookie_httponly');
277 }
Derek Jones69fc4fc2010-03-02 13:36:31 -0600278
279 if ( ! is_numeric($expire))
280 {
281 $expire = time() - 86500;
282 }
283 else
284 {
Phil Sturgeonc8089152010-12-27 19:06:28 +0000285 $expire = ($expire > 0) ? time() + $expire : 0;
Derek Jones69fc4fc2010-03-02 13:36:31 -0600286 }
287
freewil4ad0fd82012-03-13 22:37:42 -0400288 setcookie($prefix.$name, $value, $expire, $path, $domain, $secure, $httponly);
Derek Jones69fc4fc2010-03-02 13:36:31 -0600289 }
290
Derek Allard2067d1a2008-11-13 22:59:24 +0000291 // --------------------------------------------------------------------
292
293 /**
294 * Fetch an item from the SERVER array
295 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000296 * @param string
297 * @param bool
298 * @return string
299 */
Bo-Yi Wu4db872f2011-09-12 10:52:37 +0800300 public function server($index = '', $xss_clean = FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000301 {
302 return $this->_fetch_from_array($_SERVER, $index, $xss_clean);
303 }
304
305 // --------------------------------------------------------------------
306
307 /**
308 * Fetch the IP Address
309 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000310 * @return string
311 */
Bo-Yi Wu4db872f2011-09-12 10:52:37 +0800312 public function ip_address()
Derek Allard2067d1a2008-11-13 22:59:24 +0000313 {
314 if ($this->ip_address !== FALSE)
315 {
316 return $this->ip_address;
317 }
Barry Mienydd671972010-10-04 16:33:58 +0200318
Derek Jones42b2e172009-02-05 16:59:45 +0000319 if (config_item('proxy_ips') != '' && $this->server('HTTP_X_FORWARDED_FOR') && $this->server('REMOTE_ADDR'))
Derek Jonesc5972282009-02-04 21:40:20 +0000320 {
Derek Jones42b2e172009-02-05 16:59:45 +0000321 $proxies = preg_split('/[\s,]/', config_item('proxy_ips'), -1, PREG_SPLIT_NO_EMPTY);
Derek Jonesc5972282009-02-04 21:40:20 +0000322 $proxies = is_array($proxies) ? $proxies : array($proxies);
Derek Allard2067d1a2008-11-13 22:59:24 +0000323
Derek Jonesc5972282009-02-04 21:40:20 +0000324 $this->ip_address = in_array($_SERVER['REMOTE_ADDR'], $proxies) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
325 }
Andrey Andreev9448afb2012-02-08 19:49:19 +0200326 elseif ( ! $this->server('HTTP_CLIENT_IP') && $this->server('REMOTE_ADDR'))
John Bellone52c10b62011-08-21 11:41:32 -0400327 {
328 $this->ip_address = $_SERVER['REMOTE_ADDR'];
329 }
Andrey Andreev9448afb2012-02-08 19:49:19 +0200330 elseif ($this->server('REMOTE_ADDR') && $this->server('HTTP_CLIENT_IP'))
Derek Allard2067d1a2008-11-13 22:59:24 +0000331 {
332 $this->ip_address = $_SERVER['HTTP_CLIENT_IP'];
333 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000334 elseif ($this->server('HTTP_CLIENT_IP'))
335 {
336 $this->ip_address = $_SERVER['HTTP_CLIENT_IP'];
337 }
338 elseif ($this->server('HTTP_X_FORWARDED_FOR'))
339 {
340 $this->ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
341 }
342
343 if ($this->ip_address === FALSE)
344 {
Andrey Andreev64e98aa2012-01-07 20:29:10 +0200345 return $this->ip_address = '0.0.0.0';
Derek Allard2067d1a2008-11-13 22:59:24 +0000346 }
347
Robin Sowell76b369e2010-03-19 11:15:28 -0400348 if (strpos($this->ip_address, ',') !== FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000349 {
350 $x = explode(',', $this->ip_address);
Derek Jonesc5972282009-02-04 21:40:20 +0000351 $this->ip_address = trim(end($x));
Derek Allard2067d1a2008-11-13 22:59:24 +0000352 }
353
354 if ( ! $this->valid_ip($this->ip_address))
355 {
Andrey Andreev64e98aa2012-01-07 20:29:10 +0200356 return $this->ip_address = '0.0.0.0';
Derek Allard2067d1a2008-11-13 22:59:24 +0000357 }
358
359 return $this->ip_address;
360 }
361
362 // --------------------------------------------------------------------
363
364 /**
365 * Validate IP Address
366 *
367 * Updated version suggested by Geert De Deckere
Barry Mienydd671972010-10-04 16:33:58 +0200368 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000369 * @param string
Bo-Yi Wu013c8952011-09-12 15:03:44 +0800370 * @return bool
Derek Allard2067d1a2008-11-13 22:59:24 +0000371 */
Bo-Yi Wu4db872f2011-09-12 10:52:37 +0800372 public function valid_ip($ip)
Derek Allard2067d1a2008-11-13 22:59:24 +0000373 {
Andrey Andreev1ae65162012-03-10 16:11:34 +0200374 return (bool) filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
Derek Allard2067d1a2008-11-13 22:59:24 +0000375 }
376
377 // --------------------------------------------------------------------
378
379 /**
380 * User Agent
381 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000382 * @return string
383 */
Bo-Yi Wu4db872f2011-09-12 10:52:37 +0800384 public function user_agent()
Derek Allard2067d1a2008-11-13 22:59:24 +0000385 {
386 if ($this->user_agent !== FALSE)
387 {
388 return $this->user_agent;
389 }
390
Andrey Andreev9448afb2012-02-08 19:49:19 +0200391 return $this->user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : FALSE;
Derek Allard2067d1a2008-11-13 22:59:24 +0000392 }
393
394 // --------------------------------------------------------------------
395
396 /**
Derek Jones69fc4fc2010-03-02 13:36:31 -0600397 * Sanitize Globals
Derek Allard2067d1a2008-11-13 22:59:24 +0000398 *
Derek Jones69fc4fc2010-03-02 13:36:31 -0600399 * This function does the following:
400 *
Andrey Andreev64e98aa2012-01-07 20:29:10 +0200401 * - Unsets $_GET data (if query strings are not enabled)
402 * - Unsets all globals if register_globals is enabled
403 * - Standardizes newline characters to \n
Derek Jones69fc4fc2010-03-02 13:36:31 -0600404 *
Derek Jones69fc4fc2010-03-02 13:36:31 -0600405 * @return void
Derek Allard2067d1a2008-11-13 22:59:24 +0000406 */
Andrey Andreev90cfe142012-01-08 04:46:42 +0200407 protected function _sanitize_globals()
Derek Allard2067d1a2008-11-13 22:59:24 +0000408 {
Derek Jones69fc4fc2010-03-02 13:36:31 -0600409 // It would be "wrong" to unset any of these GLOBALS.
David Behler9b5df592011-08-14 21:04:17 +0200410 $protected = array('_SERVER', '_GET', '_POST', '_FILES', '_REQUEST',
Andrey Andreev64e98aa2012-01-07 20:29:10 +0200411 '_SESSION', '_ENV', 'GLOBALS', 'HTTP_RAW_POST_DATA',
412 'system_folder', 'application_folder', 'BM', 'EXT',
413 'CFG', 'URI', 'RTR', 'OUT', 'IN'
414 );
Derek Allard2067d1a2008-11-13 22:59:24 +0000415
Barry Mienydd671972010-10-04 16:33:58 +0200416 // Unset globals for securiy.
Derek Jones69fc4fc2010-03-02 13:36:31 -0600417 // This is effectively the same as register_globals = off
418 foreach (array($_GET, $_POST, $_COOKIE) as $global)
Derek Allard2067d1a2008-11-13 22:59:24 +0000419 {
Derek Jones69fc4fc2010-03-02 13:36:31 -0600420 if ( ! is_array($global))
Derek Allard2067d1a2008-11-13 22:59:24 +0000421 {
Derek Jones69fc4fc2010-03-02 13:36:31 -0600422 if ( ! in_array($global, $protected))
423 {
424 global $$global;
425 $$global = NULL;
426 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000427 }
Derek Jones69fc4fc2010-03-02 13:36:31 -0600428 else
429 {
430 foreach ($global as $key => $val)
431 {
432 if ( ! in_array($key, $protected))
433 {
434 global $$key;
435 $$key = NULL;
436 }
437 }
438 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000439 }
440
Derek Jones69fc4fc2010-03-02 13:36:31 -0600441 // Is $_GET data allowed? If not we'll set the $_GET to an empty array
442 if ($this->_allow_get_array == FALSE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000443 {
Derek Jones69fc4fc2010-03-02 13:36:31 -0600444 $_GET = array();
Derek Allard2067d1a2008-11-13 22:59:24 +0000445 }
Andrey Andreev9448afb2012-02-08 19:49:19 +0200446 elseif (is_array($_GET) && count($_GET) > 0)
Derek Allard2067d1a2008-11-13 22:59:24 +0000447 {
Andrey Andreev9448afb2012-02-08 19:49:19 +0200448 foreach ($_GET as $key => $val)
Derek Allard2067d1a2008-11-13 22:59:24 +0000449 {
Andrey Andreev9448afb2012-02-08 19:49:19 +0200450 $_GET[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
Derek Allard2067d1a2008-11-13 22:59:24 +0000451 }
452 }
453
Derek Jones69fc4fc2010-03-02 13:36:31 -0600454 // Clean $_POST Data
Andrey Andreev9448afb2012-02-08 19:49:19 +0200455 if (is_array($_POST) && count($_POST) > 0)
Derek Allard2067d1a2008-11-13 22:59:24 +0000456 {
Pascal Kriete5d5895f2011-02-14 13:27:07 -0500457 foreach ($_POST as $key => $val)
Derek Jones69fc4fc2010-03-02 13:36:31 -0600458 {
459 $_POST[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
460 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000461 }
462
Derek Jones69fc4fc2010-03-02 13:36:31 -0600463 // Clean $_COOKIE Data
Andrey Andreev9448afb2012-02-08 19:49:19 +0200464 if (is_array($_COOKIE) && count($_COOKIE) > 0)
Derek Allard2067d1a2008-11-13 22:59:24 +0000465 {
Derek Jones69fc4fc2010-03-02 13:36:31 -0600466 // Also get rid of specially treated cookies that might be set by a server
467 // or silly application, that are of no use to a CI application anyway
468 // but that when present will trip our 'Disallowed Key Characters' alarm
469 // http://www.ietf.org/rfc/rfc2109.txt
470 // note that the key names below are single quoted strings, and are not PHP variables
471 unset($_COOKIE['$Version']);
472 unset($_COOKIE['$Path']);
473 unset($_COOKIE['$Domain']);
474
Pascal Kriete5d5895f2011-02-14 13:27:07 -0500475 foreach ($_COOKIE as $key => $val)
Derek Jones69fc4fc2010-03-02 13:36:31 -0600476 {
477 $_COOKIE[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
478 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000479 }
480
Derek Jones69fc4fc2010-03-02 13:36:31 -0600481 // Sanitize PHP_SELF
482 $_SERVER['PHP_SELF'] = strip_tags($_SERVER['PHP_SELF']);
483
Derek Jones69fc4fc2010-03-02 13:36:31 -0600484 // CSRF Protection check
485 if ($this->_enable_csrf == TRUE)
Derek Allard2067d1a2008-11-13 22:59:24 +0000486 {
Derek Jones69fc4fc2010-03-02 13:36:31 -0600487 $this->security->csrf_verify();
Derek Allard2067d1a2008-11-13 22:59:24 +0000488 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000489
Andrey Andreev90cfe142012-01-08 04:46:42 +0200490 log_message('debug', 'Global POST and COOKIE data sanitized');
Derek Allard2067d1a2008-11-13 22:59:24 +0000491 }
492
493 // --------------------------------------------------------------------
494
495 /**
Derek Jones69fc4fc2010-03-02 13:36:31 -0600496 * Clean Input Data
Derek Allard2067d1a2008-11-13 22:59:24 +0000497 *
Derek Jones69fc4fc2010-03-02 13:36:31 -0600498 * This is a helper function. It escapes data and
499 * standardizes newline characters to \n
Derek Allard2067d1a2008-11-13 22:59:24 +0000500 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000501 * @param string
Derek Allard2067d1a2008-11-13 22:59:24 +0000502 * @return string
503 */
Andrey Andreev90cfe142012-01-08 04:46:42 +0200504 protected function _clean_input_data($str)
Derek Allard2067d1a2008-11-13 22:59:24 +0000505 {
Derek Jones69fc4fc2010-03-02 13:36:31 -0600506 if (is_array($str))
Derek Allard2067d1a2008-11-13 22:59:24 +0000507 {
Derek Jones69fc4fc2010-03-02 13:36:31 -0600508 $new_array = array();
509 foreach ($str as $key => $val)
510 {
511 $new_array[$this->_clean_input_keys($key)] = $this->_clean_input_data($val);
512 }
513 return $new_array;
Derek Allard2067d1a2008-11-13 22:59:24 +0000514 }
515
Andrey Andreevaf728622011-10-20 10:11:59 +0300516 /* We strip slashes if magic quotes is on to keep things consistent
517
518 NOTE: In PHP 5.4 get_magic_quotes_gpc() will always return 0 and
519 it will probably not exist in future versions at all.
520 */
521 if ( ! is_php('5.4') && get_magic_quotes_gpc())
Derek Allard2067d1a2008-11-13 22:59:24 +0000522 {
Derek Jones69fc4fc2010-03-02 13:36:31 -0600523 $str = stripslashes($str);
524 }
525
526 // Clean UTF-8 if supported
527 if (UTF8_ENABLED === TRUE)
528 {
529 $str = $this->uni->clean_string($str);
530 }
David Behler9b5df592011-08-14 21:04:17 +0200531
Pascal Kriete14a0ac62011-04-05 14:55:56 -0400532 // Remove control characters
533 $str = remove_invisible_characters($str);
Derek Jones69fc4fc2010-03-02 13:36:31 -0600534
535 // Should we filter the input data?
536 if ($this->_enable_xss === TRUE)
537 {
538 $str = $this->security->xss_clean($str);
539 }
540
541 // Standardize newlines if needed
Andrey Andreev9448afb2012-02-08 19:49:19 +0200542 if ($this->_standardize_newlines == TRUE && strpos($str, "\r") !== FALSE)
Derek Jones69fc4fc2010-03-02 13:36:31 -0600543 {
Andrey Andreev64e98aa2012-01-07 20:29:10 +0200544 return str_replace(array("\r\n", "\r", "\r\n\n"), PHP_EOL, $str);
Derek Allard2067d1a2008-11-13 22:59:24 +0000545 }
546
547 return $str;
548 }
549
550 // --------------------------------------------------------------------
551
552 /**
Derek Jones69fc4fc2010-03-02 13:36:31 -0600553 * Clean Keys
Derek Allard2067d1a2008-11-13 22:59:24 +0000554 *
Derek Jones69fc4fc2010-03-02 13:36:31 -0600555 * This is a helper function. To prevent malicious users
556 * from trying to exploit keys we make sure that keys are
557 * only named with alpha-numeric text and a few other items.
Derek Allard2067d1a2008-11-13 22:59:24 +0000558 *
Derek Allard2067d1a2008-11-13 22:59:24 +0000559 * @param string
560 * @return string
561 */
Andrey Andreev90cfe142012-01-08 04:46:42 +0200562 protected function _clean_input_keys($str)
Derek Allard2067d1a2008-11-13 22:59:24 +0000563 {
Andrey Andreev64e98aa2012-01-07 20:29:10 +0200564 if ( ! preg_match('/^[a-z0-9:_\/-]+$/i', $str))
Derek Allard2067d1a2008-11-13 22:59:24 +0000565 {
Kevin Cuppd63e4012012-02-05 14:14:32 -0500566 set_status_header(503);
Derek Jones69fc4fc2010-03-02 13:36:31 -0600567 exit('Disallowed Key Characters.');
Derek Allard2067d1a2008-11-13 22:59:24 +0000568 }
569
Derek Jones69fc4fc2010-03-02 13:36:31 -0600570 // Clean UTF-8 if supported
571 if (UTF8_ENABLED === TRUE)
572 {
Andrey Andreev64e98aa2012-01-07 20:29:10 +0200573 return $this->uni->clean_string($str);
Derek Jones69fc4fc2010-03-02 13:36:31 -0600574 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000575
Derek Jones69fc4fc2010-03-02 13:36:31 -0600576 return $str;
577 }
Derek Allard2067d1a2008-11-13 22:59:24 +0000578
Greg Akerec2f5712010-11-15 16:22:12 -0600579 // --------------------------------------------------------------------
580
581 /**
582 * Request Headers
583 *
David Behler9b5df592011-08-14 21:04:17 +0200584 * In Apache, you can simply call apache_request_headers(), however for
Greg Akerec2f5712010-11-15 16:22:12 -0600585 * people running other webservers the function is undefined.
586 *
David Behlercda768a2011-08-14 23:52:48 +0200587 * @param bool XSS cleaning
Andrey Andreev64e98aa2012-01-07 20:29:10 +0200588 * @return array
Greg Akerec2f5712010-11-15 16:22:12 -0600589 */
590 public function request_headers($xss_clean = FALSE)
591 {
592 // Look at Apache go!
593 if (function_exists('apache_request_headers'))
594 {
595 $headers = apache_request_headers();
596 }
597 else
598 {
Andrey Andreev9448afb2012-02-08 19:49:19 +0200599 $headers['Content-Type'] = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : @getenv('CONTENT_TYPE');
Greg Akerec2f5712010-11-15 16:22:12 -0600600
601 foreach ($_SERVER as $key => $val)
602 {
Andrey Andreev64e98aa2012-01-07 20:29:10 +0200603 if (strpos($key, 'HTTP_') === 0)
Greg Akerec2f5712010-11-15 16:22:12 -0600604 {
605 $headers[substr($key, 5)] = $this->_fetch_from_array($_SERVER, $key, $xss_clean);
606 }
607 }
608 }
609
610 // take SOME_HEADER and turn it into Some-Header
611 foreach ($headers as $key => $val)
612 {
613 $key = str_replace('_', ' ', strtolower($key));
614 $key = str_replace(' ', '-', ucwords($key));
David Behler9b5df592011-08-14 21:04:17 +0200615
Greg Akerec2f5712010-11-15 16:22:12 -0600616 $this->headers[$key] = $val;
617 }
David Behler9b5df592011-08-14 21:04:17 +0200618
Greg Akerec2f5712010-11-15 16:22:12 -0600619 return $this->headers;
620 }
621
622 // --------------------------------------------------------------------
623
624 /**
625 * Get Request Header
626 *
627 * Returns the value of a single member of the headers class member
628 *
Andrey Andreev773e1172012-02-08 23:02:19 +0200629 * @param string array key for $this->headers
Andrey Andreev9448afb2012-02-08 19:49:19 +0200630 * @param bool XSS Clean or not
Andrey Andreev773e1172012-02-08 23:02:19 +0200631 * @return mixed FALSE on failure, string on success
Greg Akerec2f5712010-11-15 16:22:12 -0600632 */
633 public function get_request_header($index, $xss_clean = FALSE)
634 {
635 if (empty($this->headers))
636 {
637 $this->request_headers();
638 }
David Behler9b5df592011-08-14 21:04:17 +0200639
Greg Akerec2f5712010-11-15 16:22:12 -0600640 if ( ! isset($this->headers[$index]))
641 {
642 return FALSE;
643 }
644
Andrey Andreev9448afb2012-02-08 19:49:19 +0200645 return ($xss_clean === TRUE)
646 ? $this->security->xss_clean($this->headers[$index])
647 : $this->headers[$index];
Greg Akerec2f5712010-11-15 16:22:12 -0600648 }
649
Greg Aker081ac9d2010-11-22 14:42:53 -0600650 // --------------------------------------------------------------------
Phil Sturgeonc3828712011-01-19 12:31:47 +0000651
Greg Aker081ac9d2010-11-22 14:42:53 -0600652 /**
653 * Is ajax Request?
654 *
655 * Test to see if a request contains the HTTP_X_REQUESTED_WITH header
656 *
Andrey Andreev9448afb2012-02-08 19:49:19 +0200657 * @return bool
Greg Aker081ac9d2010-11-22 14:42:53 -0600658 */
659 public function is_ajax_request()
660 {
Andrey Andreev9448afb2012-02-08 19:49:19 +0200661 return ( ! empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest');
Greg Aker081ac9d2010-11-22 14:42:53 -0600662 }
663
Phil Sturgeonc3828712011-01-19 12:31:47 +0000664 // --------------------------------------------------------------------
665
666 /**
667 * Is cli Request?
668 *
669 * Test to see if a request was made from the command line
670 *
Andrey Andreev9448afb2012-02-08 19:49:19 +0200671 * @return bool
Phil Sturgeonc3828712011-01-19 12:31:47 +0000672 */
673 public function is_cli_request()
674 {
Andrey Andreev9448afb2012-02-08 19:49:19 +0200675 return (php_sapi_name() === 'cli' OR defined('STDIN'));
Phil Sturgeonc3828712011-01-19 12:31:47 +0000676 }
677
Michiel Vugteveenbe0ca262012-03-07 19:09:51 +0100678 // --------------------------------------------------------------------
679
680 /**
681 * Get Request Method
682 *
Michiel Vugteveendc900df2012-03-07 20:41:37 +0100683 * Return the Request Method
Michiel Vugteveenbe0ca262012-03-07 19:09:51 +0100684 *
Michiel Vugteveendc900df2012-03-07 20:41:37 +0100685 * @param bool uppercase or lowercase
Michiel Vugteveen7c8841f2012-03-07 20:49:06 +0100686 * @return bool
Michiel Vugteveenbe0ca262012-03-07 19:09:51 +0100687 */
Michiel Vugteveen704fb162012-03-07 20:42:33 +0100688 public function method($upper = FALSE)
Michiel Vugteveenbe0ca262012-03-07 19:09:51 +0100689 {
Michiel Vugteveendc900df2012-03-07 20:41:37 +0100690 return ($upper)
691 ? strtoupper($this->server('REQUEST_METHOD'))
692 : strtolower($this->server('REQUEST_METHOD'));
Michiel Vugteveenbe0ca262012-03-07 19:09:51 +0100693 }
694
Derek Allard2067d1a2008-11-13 22:59:24 +0000695}
Derek Allard2067d1a2008-11-13 22:59:24 +0000696
697/* End of file Input.php */
Phil Sturgeon33ed0f32011-02-16 19:03:49 +0000698/* Location: ./system/core/Input.php */