Issues (1751)

Security Analysis    not enabled

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.

lib/ar/http.php (12 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
	ar_pinp::allow( 'ar_http');
4
	ar_pinp::allow( 'ar_httpClientStream' );
5
6
	/*
7
	 * prevent mess detector from warning for the private static fields
8
	 * @SuppressWarnings(PHPMD.UnusedPrivateField)
9
	 */
10
	class ar_http extends arBase {
11
12
		private static $_GET, $_POST, $_REQUEST, $_SERVER, $_COOKIE;  //needed to make __get() work
0 ignored issues
show
The property $_GET is not used and could be removed.

This check marks private properties in classes that are never used. Those properties can be removed.

Loading history...
The property $_POST is not used and could be removed.

This check marks private properties in classes that are never used. Those properties can be removed.

Loading history...
The property $_REQUEST is not used and could be removed.

This check marks private properties in classes that are never used. Those properties can be removed.

Loading history...
The property $_SERVER is not used and could be removed.

This check marks private properties in classes that are never used. Those properties can be removed.

Loading history...
The property $_COOKIE is not used and could be removed.

This check marks private properties in classes that are never used. Those properties can be removed.

Loading history...
13
		public static $tainting = true;
14
15
		public function __get($var) {
16
			switch ($var) {
17
				case '_GET' :
18
					return $this->getvar( null, 'GET');
19
				break;
20
				case '_POST' :
21
					return $this->getvar( null, 'POST');
22
				break;
23
				case '_REQUEST' :
24
					return $this->getvar();
25
				break;
26
				case '_SERVER' :
27
					return $this->getvar( null, 'SERVER');
28
				break;
29
				case '_COOKIE' :
30
					return $this->getvar( null, 'COOKIE');
31
				break;
32
				case 'tainting' :
33
					return self::$tainting;
34
				break;
35
			}
36
		}
37
38
		public function __set( $var, $value ) {
39
			if ($var=='tainting') {
40
				self::$tainting = (bool) $value;
41
			}
42
		}
43
44 6
		public static function getvar( $name = null, $method = null) {
0 ignored issues
show
getvar uses the super-global variable $_GET which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
getvar uses the super-global variable $_POST which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
getvar uses the super-global variable $_COOKIE which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
getvar uses the super-global variable $_SERVER which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
getvar uses the super-global variable $_REQUEST which is generally not recommended.

Instead of super-globals, we recommend to explicitly inject the dependencies of your class. This makes your code less dependent on global state and it becomes generally more testable:

// Bad
class Router
{
    public function generate($path)
    {
        return $_SERVER['HOST'].$path;
    }
}

// Better
class Router
{
    private $host;

    public function __construct($host)
    {
        $this->host = $host;
    }

    public function generate($path)
    {
        return $this->host.$path;
    }
}

class Controller
{
    public function myAction(Request $request)
    {
        // Instead of
        $page = isset($_GET['page']) ? intval($_GET['page']) : 1;

        // Better (assuming you use the Symfony2 request)
        $page = $request->query->get('page', 1);
    }
}
Loading history...
45
			/*
46
				The full list of field-name characters that PHP converts to _ (underscore) is the following (not just dot):
47
48
				chr(32) ( ) (space)
49
				chr(46) (.) (dot)
50
				chr(91) ([) (open square bracket)
51
				chr(128) - chr(159) (various)
52
				PHP irreversibly modifies field names containing these characters in an attempt to maintain compatibility with the deprecated register_globals feature.
53
			*/
54 6
			if (isset($name) ) {
55 6
				$name = preg_replace("/[ \.\[\x80-\x9f]/", "_", $name);
56 6
			}
57
58
			switch($method) {
59 6
				case 'GET' :
60
					$result = isset($name) ? $_GET[$name] : $_GET;
61
				break;
62 6
				case 'POST' :
63
					$result = isset($name) ? $_POST[$name] : $_POST;
64
				break;
65 6
				case 'COOKIE' :
66
					$result = isset($name) ? $_COOKIE[$name] : $_COOKIE;
67
				break;
68 6
				case 'SERVER' :
69
					$result = isset($name) ? $_SERVER[$name] : $_SERVER;
70
				break;
71 6
				default :
72 6
					$result = !isset($name) ? $_REQUEST :
73 6
						( isset($_POST[$name]) ? $_POST[$name] : $_GET[$name] );
74 6
				break;
75 6
			}
76 6
			if (self::$tainting) {
77 6
				ar::taint( $result );
78 6
			}
79 6
			return $result;
80
		}
81
82
		public static function request( $method = null, $url = null, $postdata = null, $options = array() ) {
83
			$client = new ar_httpClientStream(); //$method, $url, $postdata, $port);
84
			return $client->send( $method, $url, $postdata, $options );
85
		}
86
87
		public static function client( $options = array() ) {
88
			return new ar_httpClientStream( $options );
89
		}
90
91
		public static function configure( $option, $value ) {
92
			switch ( $option ) {
93
				case 'tainting' :
94
					self::$tainting = $value;
95
				break;
96
			}
97
		}
98
99
		public static function header( $header ) {
100
			return ar_http_headers::header( $header );
101
		}
102
103
		public static function get( $url, $request = null, $options = array() ) {
104
			return self::request( 'GET', $url, $request, $options);
105
		}
106
107
		public static function post( $url, $request = null, $options = array() ) {
108
			return self::request( 'POST', $url, $request, $options);
109
		}
110
111
	}
112
113
	interface ar_httpClient {
114
115
		public function get( $url, $request = null, $options = array() );
116
117
		public function post( $url, $request = null, $options = array() );
118
119
		public function put( $url, $request = null, $options = array() );
120
121
		public function delete( $url, $request = null, $options = array() );
122
123
		public function send( $type, $url, $request = null, $options = array() );
124
125
		public function headers( $headers );
126
127
	}
128
129
	class ar_httpClientStream extends arBase implements ar_httpClient {
130
131
		private $options = array();
132
133
		public $responseHeaders = null;
134
135
		/* FIXME: function not used, is it still relevant?
136
		private function parseRequestURL( $url ) {
137
			$request = explode( '?', (string) $url );
138
			if ( isset($request[1]) ) {
139
				return $request[1];
140
			} else {
141
				return null;
142
			}
143
		}
144
		*/
145
146
		private function compileRequest( array $request ) {
147
			$result = "";
148
			foreach ( $request as $key => $value ) {
149
				if ( !is_integer( $key ) ) {
150
					$result .= urlencode($key) . "=" . urlencode($value) . "&";
151
				}
152
			}
153
			return substr( $result, 0, -1);
154
		}
155
156
		private function mergeOptions( ) {
157
			$args = func_get_args();
158
			array_unshift( $args, $this->options );
159
			return call_user_func_array( 'array_merge', $args );
160
		}
161
162
		public function send( $type, $url, $request = null, $options = array() ) {
163
			if ( is_array( $request ) ) {
164
				$request = $this->compileRequest( $request );
165
			}
166
			$options = $this->mergeOptions( array(
167
				'method' => $type,
168
				'content' => $request
169
			), $options );
170
171
			if ( $options['method'] == 'GET' && $options['content'] ) {
172
				if ( strpos( $url, '?' ) === false ) {
173
					$url = $url . '?' . $options['content'];
174
				} else {
175
					$url = $url . '&' . $options['content'];
176
				}
177
				$options['content'] = '';
178
			}
179
			$context = stream_context_create( array( 'http' => $options ) );
180
			$result = @file_get_contents( (string) $url, false, $context );
181
182
			$this->responseHeaders = $http_response_header; //magic php variable set by file_get_contents.
183
			if (is_array($this->responseHeaders) && isset($this->responseHeaders[0])) {
184
				$statusLine = explode(" ", $this->responseHeaders[0]);
185
				$this->statusCode = $statusLine[1];
0 ignored issues
show
The property statusCode does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
186
			}
187
188
			$this->requestHeaders = $options['header'];
0 ignored issues
show
The property requestHeaders does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
189
			return $result;
190
		}
191
192
		public function __construct( $options = array() ) {
193
			$this->options = $options;
194
		}
195
196
		public function get( $url, $request = null, $options = array() ) {
197
			return $this->send( 'GET', $url, $request, $options );
198
		}
199
200
		public function post( $url, $request = null, $options = array() ) {
201
			return $this->send( 'POST', $url, $request, $options );
202
		}
203
204
		public function put( $url, $request = null, $options = array() ) {
205
			return $this->send( 'PUT', $url, $request, $options );
206
		}
207
208
		public function delete( $url, $request = null, $options = array() ) {
209
			return $this->send( 'DELETE', $url, $request, $options );
210
		}
211
212
		public function headers( $headers ) {
213
			if (is_array($headers)) {
214
				$headers = join("\r\n", $headers);
215
			}
216
			$this->options['header'] = $this->options['headers'].$headers;
217
			return $this;
218
		}
219
	}
220