blob: 451fadf9323cf186fc860eeb1162b991205c88ae [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
Derek Jones8ede1a22011-10-05 13:34:52 -050015XSS Filtering
16=============
17
18CodeIgniter comes with a Cross Site Scripting Hack prevention filter
19which can either run automatically to filter all POST and COOKIE data
20that is encountered, or you can run it on a per item basis. By default
21it does **not** run globally since it requires a bit of processing
22overhead, and since you may not need it in all cases.
23
24The XSS filter looks for commonly used techniques to trigger Javascript
25or other types of code that attempt to hijack cookies or do other
26malicious things. If anything disallowed is encountered it is rendered
27safe by converting the data to character entities.
28
29Note: This function should only be used to deal with data upon
30submission. It's not something that should be used for general runtime
31processing since it requires a fair amount of processing overhead.
32
Andrey Andreev5363f462014-01-03 12:31:53 +020033To filter data through the XSS filter use the ``xss_clean()`` method::
Derek Jones8ede1a22011-10-05 13:34:52 -050034
35 $data = $this->security->xss_clean($data);
36
37If you want the filter to run automatically every time it encounters
38POST or COOKIE data you can enable it by opening your
39application/config/config.php file and setting this::
40
41 $config['global_xss_filtering'] = TRUE;
42
Andrey Andreev5363f462014-01-03 12:31:53 +020043.. note:: If you use the form validation class, it gives you the option of
44 XSS filtering as well.
Derek Jones8ede1a22011-10-05 13:34:52 -050045
Andrey Andreev5363f462014-01-03 12:31:53 +020046An optional second parameter, *is_image*, allows this function to be used
Derek Jones8ede1a22011-10-05 13:34:52 -050047to test images for potential XSS attacks, useful for file upload
48security. When this second parameter is set to TRUE, instead of
49returning an altered string, the function returns TRUE if the image is
50safe, and FALSE if it contained potentially malicious information that a
51browser may attempt to execute.
52
53::
54
Derek Joneseb946d02011-10-05 15:47:43 -050055 if ($this->security->xss_clean($file, TRUE) === FALSE)
56 {
Andrey Andreev5363f462014-01-03 12:31:53 +020057 // file failed the XSS test
Derek Joneseb946d02011-10-05 15:47:43 -050058 }
Derek Jones8ede1a22011-10-05 13:34:52 -050059
Derek Jones8ede1a22011-10-05 13:34:52 -050060Cross-site request forgery (CSRF)
61=================================
62
Andrey Andreev5363f462014-01-03 12:31:53 +020063You can enable CSRF protection by altering your **application/config/config.php**
64file in the following way::
Derek Jones8ede1a22011-10-05 13:34:52 -050065
66 $config['csrf_protection'] = TRUE;
67
Andrey Andreevf795ab52012-10-24 21:28:25 +030068If you use the :doc:`form helper <../helpers/form_helper>`, then
Andrey Andreev5363f462014-01-03 12:31:53 +020069:func:`form_open()` will automatically insert a hidden csrf field in
Andrey Andreev25a246c2013-12-17 13:07:26 +020070your forms. If not, then you can use ``get_csrf_token_name()``
71and ``get_csrf_hash()``
Andrey Andreevf795ab52012-10-24 21:28:25 +030072::
73
74 $csrf = array(
Andrey Andreev25a246c2013-12-17 13:07:26 +020075 'name' => $this->security->get_csrf_token_name(),
76 'hash' => $this->security->get_csrf_hash()
Andrey Andreevf795ab52012-10-24 21:28:25 +030077 );
78
79 ...
80
81 <input type="hidden" name="<?=$csrf['name'];?>" value="<?=$csrf['hash'];?>" />
82
83Tokens may be either regenerated on every submission (default) or
84kept the same throughout the life of the CSRF cookie. The default
85regeneration of tokens provides stricter security, but may result
86in usability concerns as other tokens become invalid (back/forward
87navigation, multiple tabs/windows, asynchronous actions, etc). You
88may alter this behavior by editing the following config parameter
89
90::
RS7123ea93b2012-01-03 12:43:16 -020091
92 $config['csrf_regeneration'] = TRUE;
93
Derek Jones8ede1a22011-10-05 13:34:52 -050094Select URIs can be whitelisted from csrf protection (for example API
95endpoints expecting externally POSTed content). You can add these URIs
96by editing the 'csrf_exclude_uris' config parameter::
97
98 $config['csrf_exclude_uris'] = array('api/person/add');
99
Andrey Andreev5363f462014-01-03 12:31:53 +0200100***************
101Class Reference
102***************
Andrey Andreevf795ab52012-10-24 21:28:25 +0300103
Andrey Andreev5363f462014-01-03 12:31:53 +0200104.. class:: CI_Security
Andrey Andreevf795ab52012-10-24 21:28:25 +0300105
Andrey Andreev5363f462014-01-03 12:31:53 +0200106 .. method:: xss_clean($str[, $is_image = FALSE])
Andrey Andreevf795ab52012-10-24 21:28:25 +0300107
Andrey Andreev5363f462014-01-03 12:31:53 +0200108 :param string $str: Input string
109 :returns: mixed
110
111 Tries to remove XSS exploits from the input data and returns the cleaned string.
112 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.
113
114 .. method:: sanitize_filename($str[, $relative_path = FALSE])
115
116 :param string $str: File name/path
117 :param bool $relative_path: Whether to preserve any directories in the file path
118 :returns: string
119
120 Tries to sanitize filenames in order to prevent directory traversal attempts
121 and other security threats, which is particularly useful for files that were supplied via user input.
122 ::
123
124 $filename = $this->security->sanitize_filename($this->input->post('filename'));
125
126 If it is acceptable for the user input to include relative paths, e.g.
127 *file/in/some/approved/folder.txt*, you can set the second optional parameter, ``$relative_path`` to TRUE.
128 ::
129
130 $filename = $this->security->sanitize_filename($this->input->post('filename'), TRUE);
131
132 .. method:: get_csrf_token_name()
133
134 :returns: string
135
136 Returns the CSRF token name (the ``$config['csrf_token_name']`` value).
137
138 .. method:: get_csrf_hash()
139
140 :returns: string
141
142 Returns the CSRF hash value. Useful in combination with ``get_csrf_token_name()``
143 for manually building forms or sending valid AJAX POST requests.
144
145 .. method:: entity_decode($str[, $charset = NULL])
146
147 :param string $str: Input string
148 :param string $charset: Character set of the input string
149
150 This method acts a lot like PHP's own native ``html_entity_decode()`` function in ENT_COMPAT mode, only
151 it tries to detect HTML entities that don't end in a semicolon because some browsers allow that.
152
Andrey Andreevea801ab2014-01-20 15:03:43 +0200153 If the ``$charset`` parameter is left empty, then your configured ``$config['charset']`` value will be used.