blob: 27e6e561b2d637d0cebea05f2b135a0df3cedfa2 [file] [log] [blame]
Derek Jones8ede1a22011-10-05 13:34:52 -05001##############
2Security Class
3##############
4
5The Security Class contains methods that help you create a secure
6application, processing input data for security.
7
Andrey Andreevcc042092014-01-03 17:08:27 +02008.. contents::
9 :local:
10
11.. raw:: html
12
13 <div class="custom-index container"></div>
14
James L Parry08191be2014-12-20 02:37:13 -080015*************
Derek Jones8ede1a22011-10-05 13:34:52 -050016XSS Filtering
James L Parry08191be2014-12-20 02:37:13 -080017*************
Derek Jones8ede1a22011-10-05 13:34:52 -050018
19CodeIgniter comes with a Cross Site Scripting Hack prevention filter
20which can either run automatically to filter all POST and COOKIE data
21that is encountered, or you can run it on a per item basis. By default
22it does **not** run globally since it requires a bit of processing
23overhead, and since you may not need it in all cases.
24
25The XSS filter looks for commonly used techniques to trigger Javascript
26or other types of code that attempt to hijack cookies or do other
27malicious things. If anything disallowed is encountered it is rendered
28safe by converting the data to character entities.
29
30Note: This function should only be used to deal with data upon
31submission. It's not something that should be used for general runtime
32processing since it requires a fair amount of processing overhead.
33
Andrey Andreev5363f462014-01-03 12:31:53 +020034To filter data through the XSS filter use the ``xss_clean()`` method::
Derek Jones8ede1a22011-10-05 13:34:52 -050035
36 $data = $this->security->xss_clean($data);
37
38If you want the filter to run automatically every time it encounters
39POST or COOKIE data you can enable it by opening your
40application/config/config.php file and setting this::
41
42 $config['global_xss_filtering'] = TRUE;
43
Andrey Andreev5363f462014-01-03 12:31:53 +020044.. note:: If you use the form validation class, it gives you the option of
45 XSS filtering as well.
Derek Jones8ede1a22011-10-05 13:34:52 -050046
Andrey Andreev5363f462014-01-03 12:31:53 +020047An optional second parameter, *is_image*, allows this function to be used
Derek Jones8ede1a22011-10-05 13:34:52 -050048to test images for potential XSS attacks, useful for file upload
49security. When this second parameter is set to TRUE, instead of
50returning an altered string, the function returns TRUE if the image is
51safe, and FALSE if it contained potentially malicious information that a
52browser may attempt to execute.
53
54::
55
Derek Joneseb946d02011-10-05 15:47:43 -050056 if ($this->security->xss_clean($file, TRUE) === FALSE)
57 {
Andrey Andreev5363f462014-01-03 12:31:53 +020058 // file failed the XSS test
Derek Joneseb946d02011-10-05 15:47:43 -050059 }
Derek Jones8ede1a22011-10-05 13:34:52 -050060
James L Parry08191be2014-12-20 02:37:13 -080061*********************************
Derek Jones8ede1a22011-10-05 13:34:52 -050062Cross-site request forgery (CSRF)
James L Parry08191be2014-12-20 02:37:13 -080063*********************************
Derek Jones8ede1a22011-10-05 13:34:52 -050064
Andrey Andreev5363f462014-01-03 12:31:53 +020065You can enable CSRF protection by altering your **application/config/config.php**
66file in the following way::
Derek Jones8ede1a22011-10-05 13:34:52 -050067
68 $config['csrf_protection'] = TRUE;
69
Andrey Andreevf795ab52012-10-24 21:28:25 +030070If you use the :doc:`form helper <../helpers/form_helper>`, then
Andrey Andreev5363f462014-01-03 12:31:53 +020071:func:`form_open()` will automatically insert a hidden csrf field in
Andrey Andreev25a246c2013-12-17 13:07:26 +020072your forms. If not, then you can use ``get_csrf_token_name()``
73and ``get_csrf_hash()``
Andrey Andreevf795ab52012-10-24 21:28:25 +030074::
75
76 $csrf = array(
Andrey Andreev25a246c2013-12-17 13:07:26 +020077 'name' => $this->security->get_csrf_token_name(),
78 'hash' => $this->security->get_csrf_hash()
Andrey Andreevf795ab52012-10-24 21:28:25 +030079 );
80
81 ...
82
83 <input type="hidden" name="<?=$csrf['name'];?>" value="<?=$csrf['hash'];?>" />
84
85Tokens may be either regenerated on every submission (default) or
86kept the same throughout the life of the CSRF cookie. The default
87regeneration of tokens provides stricter security, but may result
88in usability concerns as other tokens become invalid (back/forward
89navigation, multiple tabs/windows, asynchronous actions, etc). You
90may alter this behavior by editing the following config parameter
91
92::
RS7123ea93b2012-01-03 12:43:16 -020093
94 $config['csrf_regeneration'] = TRUE;
95
Derek Jones8ede1a22011-10-05 13:34:52 -050096Select URIs can be whitelisted from csrf protection (for example API
97endpoints expecting externally POSTed content). You can add these URIs
98by editing the 'csrf_exclude_uris' config parameter::
99
100 $config['csrf_exclude_uris'] = array('api/person/add');
101
Andrey Andreev6c520962014-08-18 12:24:42 +0300102Regular expressions are also supported (case-insensitive)::
Casey Hancock2f4c3bc2014-08-11 12:52:20 -0400103
Andrey Andreev6c520962014-08-18 12:24:42 +0300104 $config['csrf_exclude_uris'] = array(
105 'api/record/[0-9]+',
106 'api/title/[a-z]+'
107 );
Casey Hancock2f4c3bc2014-08-11 12:52:20 -0400108
Andrey Andreev5363f462014-01-03 12:31:53 +0200109***************
110Class Reference
111***************
Andrey Andreevf795ab52012-10-24 21:28:25 +0300112
Andrey Andreevcd3d9db2015-02-02 13:41:01 +0200113.. php:class:: CI_Security
Andrey Andreevf795ab52012-10-24 21:28:25 +0300114
Andrey Andreevcd3d9db2015-02-02 13:41:01 +0200115 .. php:method:: xss_clean($str[, $is_image = FALSE])
Andrey Andreevf795ab52012-10-24 21:28:25 +0300116
Andrey Andreev28c2c972014-02-08 04:27:48 +0200117 :param mixed $str: Input string or an array of strings
118 :returns: XSS-clean data
119 :rtype: mixed
Andrey Andreev5363f462014-01-03 12:31:53 +0200120
121 Tries to remove XSS exploits from the input data and returns the cleaned string.
122 If the optional second parameter is set to true, it will return boolean TRUE if the image is safe to use and FALSE if malicious data was detected in it.
123
Andrey Andreevcd3d9db2015-02-02 13:41:01 +0200124 .. php:method:: sanitize_filename($str[, $relative_path = FALSE])
Andrey Andreev5363f462014-01-03 12:31:53 +0200125
Andrey Andreev28c2c972014-02-08 04:27:48 +0200126 :param string $str: File name/path
127 :param bool $relative_path: Whether to preserve any directories in the file path
128 :returns: Sanitized file name/path
129 :rtype: string
Andrey Andreev5363f462014-01-03 12:31:53 +0200130
131 Tries to sanitize filenames in order to prevent directory traversal attempts
132 and other security threats, which is particularly useful for files that were supplied via user input.
133 ::
134
135 $filename = $this->security->sanitize_filename($this->input->post('filename'));
136
137 If it is acceptable for the user input to include relative paths, e.g.
138 *file/in/some/approved/folder.txt*, you can set the second optional parameter, ``$relative_path`` to TRUE.
139 ::
140
141 $filename = $this->security->sanitize_filename($this->input->post('filename'), TRUE);
142
Andrey Andreevcd3d9db2015-02-02 13:41:01 +0200143 .. php:method:: get_csrf_token_name()
Andrey Andreev5363f462014-01-03 12:31:53 +0200144
Andrey Andreev28c2c972014-02-08 04:27:48 +0200145 :returns: CSRF token name
146 :rtype: string
Andrey Andreev5363f462014-01-03 12:31:53 +0200147
148 Returns the CSRF token name (the ``$config['csrf_token_name']`` value).
149
Andrey Andreevcd3d9db2015-02-02 13:41:01 +0200150 .. php:method:: get_csrf_hash()
Andrey Andreev5363f462014-01-03 12:31:53 +0200151
Andrey Andreev28c2c972014-02-08 04:27:48 +0200152 :returns: CSRF hash
153 :rtype: string
Andrey Andreev5363f462014-01-03 12:31:53 +0200154
155 Returns the CSRF hash value. Useful in combination with ``get_csrf_token_name()``
156 for manually building forms or sending valid AJAX POST requests.
157
Andrey Andreevcd3d9db2015-02-02 13:41:01 +0200158 .. php:method:: entity_decode($str[, $charset = NULL])
Andrey Andreev5363f462014-01-03 12:31:53 +0200159
Andrey Andreev28c2c972014-02-08 04:27:48 +0200160 :param string $str: Input string
161 :param string $charset: Character set of the input string
162 :returns: Entity-decoded string
163 :rtype: string
Andrey Andreev5363f462014-01-03 12:31:53 +0200164
165 This method acts a lot like PHP's own native ``html_entity_decode()`` function in ENT_COMPAT mode, only
166 it tries to detect HTML entities that don't end in a semicolon because some browsers allow that.
167
Andrey Andreev487ccc92014-08-27 16:26:23 +0300168 If the ``$charset`` parameter is left empty, then your configured ``$config['charset']`` value will be used.
169
Andrey Andreevcd3d9db2015-02-02 13:41:01 +0200170 .. php:method:: get_random_bytes($length)
Andrey Andreev487ccc92014-08-27 16:26:23 +0300171
172 :param int $length: Output length
173 :returns: A binary stream of random bytes or FALSE on failure
174 :rtype: string
175
176 A convenience method for getting proper random bytes via ``mcrypt_create_iv()``,
177 ``/dev/urandom`` or ``openssl_random_pseudo_bytes()`` (in that order), if one
178 of them is available.
179
180 Used for generating CSRF and XSS tokens.
181
182 .. note:: The output is NOT guaranteed to be cryptographically secure,
183 just the best attempt at that.