XpressEngine Core  1.11.2
 All Classes Namespaces Files Functions Variables Pages
Security.class.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) NAVER <http://www.navercorp.com> */
3 
11 class Security
12 {
13 
18  var $_targetVar = NULL;
19 
25  function __construct($var = NULL)
26  {
27  $this->_targetVar = $var;
28  }
29 
37  function encodeHTML(/* , $varName1, $varName2, ... */)
38  {
39  $varNames = func_get_args();
40  if(count($varNames) < 0)
41  {
42  return FALSE;
43  }
44 
45  $use_context = is_null($this->_targetVar);
46  if(!$use_context)
47  {
48  if(!count($varNames) || (!is_object($this->_targetVar) && !is_array($this->_targetVar)))
49  {
50  return $this->_encodeHTML($this->_targetVar);
51  }
52 
53  $is_object = is_object($this->_targetVar);
54  }
55 
56  foreach($varNames as $varName)
57  {
58  $varName = explode('.', $varName);
59  $varName0 = array_shift($varName);
60  if($use_context)
61  {
62  $var = Context::get($varName0);
63  }
64  elseif($varName0)
65  {
66  $var = $is_object ? $this->_targetVar->{$varName0} : $this->_targetVar[$varName0];
67  }
68  else
69  {
70  $var = $this->_targetVar;
71  }
72  $var = $this->_encodeHTML($var, $varName);
73 
74  if($var === FALSE)
75  {
76  continue;
77  }
78 
79  if($use_context)
80  {
81  Context::set($varName0, $var);
82  }
83  elseif($varName0)
84  {
85  if($is_object)
86  {
87  $this->_targetVar->{$varName0} = $var;
88  }
89  else
90  {
91  $this->_targetVar[$varName0] = $var;
92  }
93  }
94  else
95  {
96  $this->_targetVar = $var;
97  }
98  }
99 
100  if(!$use_context)
101  {
102  return $this->_targetVar;
103  }
104  }
105 
112  function _encodeHTML($var, $name = array())
113  {
114  if(is_string($var))
115  {
116  if(strncmp('$user_lang->', $var, 12) !== 0)
117  {
118  $var = htmlspecialchars($var, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
119  }
120 
121  return $var;
122  }
123 
124  if(!count($name) || (!is_array($var) && !is_object($var)))
125  {
126  return false;
127  }
128 
129  $is_object = is_object($var);
130  $name0 = array_shift($name);
131 
132  if(strlen($name0))
133  {
134  $target = $is_object ? $var->{$name0} : $var[$name0];
135  $target = $this->_encodeHTML($target, $name);
136 
137  if($target === false)
138  {
139  return $var;
140  }
141 
142  if($is_object)
143  {
144  $var->{$name0} = $target;
145  }
146  else
147  {
148  $var[$name0] = $target;
149  }
150 
151  return $var;
152  }
153 
154  foreach($var as $key => $target)
155  {
156  $cloned_name = array_slice($name, 0);
157  $target = $this->_encodeHTML($target, $name);
158  $name = $cloned_name;
159 
160  if($target === false)
161  {
162  continue;
163  }
164 
165  if($is_object)
166  {
167  $var->{$key} = $target;
168  }
169  else
170  {
171  $var[$key] = $target;
172  }
173  }
174 
175  return $var;
176  }
177 
186  static function detectingXEE($xml)
187  {
188  if(!$xml) return FALSE;
189 
190  if(strpos($xml, '<!ENTITY') !== FALSE)
191  {
192  return TRUE;
193  }
194 
195  // Strip XML declaration.
196  $header = preg_replace('/<\?xml.*?\?'.'>/s', '', substr($xml, 0, 100), 1);
197  $xml = trim(substr_replace($xml, $header, 0, 100));
198  if($xml == '')
199  {
200  return TRUE;
201  }
202 
203  // Strip DTD.
204  $header = preg_replace('/^<!DOCTYPE[^>]*+>/i', '', substr($xml, 0, 200), 1);
205  $xml = trim(substr_replace($xml, $header, 0, 200));
206  if($xml == '')
207  {
208  return TRUE;
209  }
210 
211  // Confirm the XML now starts with a valid root tag. A root tag can end in [> \t\r\n]
212  $root_tag = substr($xml, 0, strcspn(substr($xml, 0, 20), "> \t\r\n"));
213 
214  // Reject a second DTD.
215  if(strtoupper($root_tag) == '<!DOCTYPE')
216  {
217  return TRUE;
218  }
219 
220  if(!in_array($root_tag, array('<methodCall', '<methodResponse', '<fault')))
221  {
222  return TRUE;
223  }
224 
225  return FALSE;
226  }
227 }
228 /* End of file : Security.class.php */
229 /* Location: ./classes/security/Security.class.php */
set($key, $val, $set_to_get_vars=0)
__construct($var=NULL)
_encodeHTML($var, $name=array())
static detectingXEE($xml)
check XML External Entity