Issues (10)

Security Analysis    no request data  

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

src/Zerg/DataSet.php (4 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
namespace Zerg;
4
5
/**
6
 * DataSet is wrapper to array of data, that cat search and paste data by it's path.
7
 *
8
 * @since 0.1
9
 * @package Zerg
10
 */
11
class DataSet implements \ArrayAccess, \Iterator
12
{
13
    /**
14
     * @var array Data wrapped by DataSet.
15
     * */
16
    private $data = [];
17
18
    /**
19
     * @var array Pointer of current insert/read position in internal format.
20
     *
21
     * The path is represented as an array of strings representing a route
22
     * through the levels of the DataSet to the required value.
23
     */
24
    private $currentPath = [];
25
26
    /**
27
     * @param array $data Data to be wrapped.
28
     */
29 30
    public function __construct(array $data = [])
30
    {
31 30
        $this->setData($data);
32 30
    }
33
34
    /**
35
     * Get wrapped data.
36
     *
37
     * @return array Currently wrapped data.
38
     */
39 7
    public function getData()
40
    {
41 7
        return $this->data;
42
    }
43
44
    /**
45
     * Assign new data to DataSet.
46
     *
47
     * @param array $data Data to be wrapped by DataSet.
48
     */
49 30
    public function setData(array $data)
50
    {
51 30
        $this->data = $data;
52 30
    }
53
54
    /**
55
     * Move into a level.
56
     *
57
     * @param string|int $level The level to move into.
58
     */
59 11
    public function push($level)
60
    {
61 11
        array_push($this->currentPath, $level);
62 11
    }
63
64
    /**
65
     * Move back out of the current level.
66
     */
67 1
    public function pop()
68
    {
69 1
        array_pop($this->currentPath);
70 1
    }
71
72
    /**
73
     * Set a value in the current level.
74
     *
75
     * @param string|int $name The name of the value to add.
76
     * @param string|int|array|null $value The value to add.
77
     */
78 12
    public function setValue($name, $value)
79
    {
80 12
        $child = & $this->data;
81
82 12 View Code Duplication
        foreach ($this->currentPath as $part) {
0 ignored issues
show
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
83 4
            if (isset($child[$part])) {
84 1
                $child = & $child[$part];
85 1
            } else {
86 4
                $child[$part] = [];
87 4
                $child = & $child[$part];
88
            }
89 12
        }
90
91 12
        $child[$name] = $value;
92 12
    }
93
94
    /**
95
     * Get a value by name from the current level.
96
     *
97
     * @param string|int $name The name of the value to retrieve.
98
     * @return string|int|array|null The found value. Returns null if the value cannot be found.
99
     */
100 2
    public function getValue($name)
101
    {
102 2
        $child = & $this->data;
103
104 2 View Code Duplication
        foreach ($this->currentPath as $part) {
0 ignored issues
show
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
105 2
            if (isset($child[$part])) {
106 1
                $child = & $child[$part];
107 1
            } else {
108 1
                return null;
109
            }
110 2
        }
111
112 2
        return isset($child[$name]) ? $child[$name] : null;
113
    }
114
115
    /**
116
     * Find a value by path within the DataSet instance.
117
     *
118
     * @see $currentPath
119
     * @param string|array $path Path in internal or human format.
120
     * @return string|int|array|null The found value. Returns null if the value cannot be found.
121
     */
122 11
    public function getValueByPath($path)
123
    {
124 11
        if (is_string($path)) {
125 5
            $path = $this->parsePath($path);
126 5
        }
127
128 11
        $child = $this->data;
129
130 11 View Code Duplication
        foreach ($path as $part) {
0 ignored issues
show
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
131 9
            if (isset($child[$part])) {
132 9
                $child = $child[$part];
133 9
            } else {
134 2
                return null;
135
            }
136 11
        }
137
138 10
        return $child;
139
    }
140
141
    /**
142
     * Assign a value by path within the DataSet instance,
143
     * overwrites any existing value.
144
     *
145
     * @see $currentPath
146
     * @param string|array $path A path in internal or human format.
147
     * @param string|int|array|null $value The value to assign.
148
     */
149 2
    public function setValueByPath($path, $value)
150
    {
151 2
        if (is_string($path)) {
152 1
            $path = $this->parsePath($path);
153 1
        }
154
155 2
        $endPart = array_pop($path);
156 2
        $child = & $this->data;
157
158 2 View Code Duplication
        foreach ($path as $part) {
0 ignored issues
show
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
159 2
            if (isset($child[$part])) {
160 1
                $child = & $child[$part];
161 1
            } else {
162 1
                $child[$part] = [];
163 1
                $child = & $child[$part];
164
            }
165 2
        }
166
167 2
        $child[$endPart] = $value;
168 2
    }
169
170
    /**
171
     * Transform human path to internal DataSet format.
172
     *
173
     * @see $currentPath
174
     * @param string $path Path in human format ('/a/b' or 'a/../b' or './b/c').
175
     * @return array Path in internal format.
176
     * @throws Field\ConfigurationException If path could not be parsed.
177
     */
178 16
    public function parsePath($path)
179
    {
180 16
        $parts = explode('/', trim($path, '/'));
181
182 16
        $pathArray = [];
183 16
        if ($parts[0] == '.') {
184 6
            $pathArray = $this->currentPath;
185 6
            array_shift($parts);
186 6
        }
187
188 16
        foreach ($parts as $part) {
189 16
            if ($part == '..') {
190 7
                if (count($pathArray)) {
191 4
                    array_pop($pathArray);
192 4
                } else {
193 5
                    throw new Field\ConfigurationException("Invalid path. To many '..', can't move higher root.");
194
                }
195 4
            } else {
196 12
                $pathArray[] = $part;
197
            }
198 13
        }
199
200 11
        return $pathArray;
201
    }
202
203
    /**
204
     * Determines whether a given string is a DataSet path.
205
     *
206
     * @param mixed $value Tested string.
207
     * @return bool Whether tested string is a DataSet path.
208
     * @since 0.2
209
     */
210 44
    public static function isPath($value)
211
    {
212 44
        return is_string($value) && strpos($value, '/') !== false;
213
    }
214
215
    /**
216
     * Recursively find value by path.
217
     *
218
     * @param string $value Value path.
219
     * @return array|int|null|string
220
     * @since 1.0
221
     */
222 5
    public function resolvePath($value)
223
    {
224
        do {
225 5
            $value = $this->getValueByPath($value);
226 5
        } while (self::isPath($value));
227
228 5
        return $value;
229
    }
230
231
    /**
232
     * Return current internal read|write position.
233
     *
234
     * @return array
235
     */
236 3
    public function getCurrentPath()
237
    {
238 3
        return $this->currentPath;
239
    }
240
241
    /**
242
     * Return value, stored in DataSet by current internal read|write position.
243
     *
244
     * @return array|int|null|string
245
     */
246 3
    public function getValueByCurrentPath()
247
    {
248 3
        return $this->getValueByPath($this->getCurrentPath());
249
    }
250
251
    /**
252
     * @inheritdoc
253
     * */
254 1
    public function current()
255
    {
256 1
        return current($this->data);
257
    }
258
259
    /**
260
     * @inheritdoc
261
     * */
262 3
    public function next()
263
    {
264 3
        next($this->data);
265 3
    }
266
267
    /**
268
     * @inheritdoc
269
     * */
270 3
    public function key()
271
    {
272 3
        return key($this->data);
273
    }
274
275
    /**
276
     * @inheritdoc
277
     * */
278 3
    public function valid()
279
    {
280 3
        return isset($this->data[$this->key()]);
281
    }
282
283
    /**
284
     * @inheritdoc
285
     * */
286 3
    public function rewind()
287
    {
288 3
        reset($this->data);
289 3
    }
290
291
    /**
292
     * @inheritdoc
293
     * */
294 2
    public function offsetExists($offset)
295
    {
296 2
        return isset($this->data[$offset]);
297
    }
298
299
    /**
300
     * @inheritdoc
301
     * */
302 3
    public function offsetGet($offset)
303
    {
304 3
        return $this->data[$offset];
305
    }
306
307
    /**
308
     * @inheritdoc
309
     * */
310 1
    public function offsetSet($offset, $value)
311
    {
312 1
        $this->data[$offset] = $value;
313 1
    }
314
315
    /**
316
     * @inheritdoc
317
     * */
318 1
    public function offsetUnset($offset)
319
    {
320 1
        unset($this->data[$offset]);
321
    }
322
}