Issues (33)

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/Helpers/helpers.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
use Illuminate\Support\Facades\Route;
0 ignored issues
show
This use statement conflicts with another class in this namespace, Route.

Let’s assume that you have a directory layout like this:

.
|-- OtherDir
|   |-- Bar.php
|   `-- Foo.php
`-- SomeDir
    `-- Foo.php

and let’s assume the following content of Bar.php:

// Bar.php
namespace OtherDir;

use SomeDir\Foo; // This now conflicts the class OtherDir\Foo

If both files OtherDir/Foo.php and SomeDir/Foo.php are loaded in the same runtime, you will see a PHP error such as the following:

PHP Fatal error:  Cannot use SomeDir\Foo as Foo because the name is already in use in OtherDir/Foo.php

However, as OtherDir/Foo.php does not necessarily have to be loaded and the error is only triggered if it is loaded before OtherDir/Bar.php, this problem might go unnoticed for a while. In order to prevent this error from surfacing, you must import the namespace with a different alias:

// Bar.php
namespace OtherDir;

use SomeDir\Foo as SomeDirFoo; // There is no conflict anymore.
Loading history...
3
4
if(!function_exists('urlsafe_b64encode')){
5
    function urlsafe_b64encode($string) {
6
        $data = base64_encode($string);
7
        $data = str_replace(array('+','/','='),array('-','_',''),$data);
8
        return $data;
9
    }
10
}
11
if(!function_exists('urlsafe_b64decode')){
12
    function urlsafe_b64decode($string) {
13
        $data = str_replace(array('-','_'),array('+','/'),$string);
14
        $mod4 = strlen($data) % 4;
15
        if ($mod4) {
16
            $data .= substr('====', $mod4);
17
        }
18
        return base64_decode($data);
19
    }
20
}
21
22
if(!function_exists('init_rapid_paginator_cache')){
23
    /* This function is supposed to cache 'Form' values...
24
    *
25
    * @param  Array     $fields
26
    * @return Array     $result
27
    *
28
    */
29
    function init_rapid_paginator_cache($fields = null, $tab=1){
30
        //init cache
31
        $cache = isset($fields) ? count($fields) > 0 ? [] : null : null;
32
        
33
        if($cache == [] || $cache == null){
34
            $cache['sort'] = '>';
35
            $cache['perPage'] = '10';
36
        }
37
38
        // If form is submitted...
39
        // Cache Form values
40
        if (request()->isMethod('POST')) {
41
            foreach ($fields as $fieldName) {
0 ignored issues
show
The expression $fields of type array|null is not guaranteed to be traversable. How about adding an additional type check?

There are different options of fixing this problem.

  1. If you want to be on the safe side, you can add an additional type-check:

    $collection = json_decode($data, true);
    if ( ! is_array($collection)) {
        throw new \RuntimeException('$collection must be an array.');
    }
    
    foreach ($collection as $item) { /** ... */ }
    
  2. If you are sure that the expression is traversable, you might want to add a doc comment cast to improve IDE auto-completion and static analysis:

    /** @var array $collection */
    $collection = json_decode($data, true);
    
    foreach ($collection as $item) { /** .. */ }
    
  3. Mark the issue as a false-positive: Just hover the remove button, in the top-right corner of this issue for more options.

Loading history...
42
                if(request($fieldName)){
43
                    $cache[$fieldName] = request($fieldName);
44
                }
45
            }
46
        }
47
        else // else we have to retrieve old cache from the state 
48
        {
49
            $state_array = null;
50
51
            // Decode The State
52 View Code Duplication
            if(request('state') && request('tab') == $tab){
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...
53
                $state_base64 = request('state');
54
                $state_decoded = urlsafe_b64decode($state_base64);
55
                $state_array = json_decode($state_decoded,true);
56
            }
57
58
            // Append the state cache key/value pairs to the new cache...
59
            if(isset($state_array['cache'])){
60
                if (is_array($state_array['cache']) || is_object($state_array['cache']))
61
                { 
62
                    foreach ($state_array['cache'] as $key => $value) {
63
                        $cache[$key] = $value;
64
                    }
65
                }
66
            }
67
        }
68
69
        return $cache;
70
    }
71
}
72
if(!function_exists('rapid_paginator')){
73
    /* Custom pagination System Based on RapidPagination package
74
    * @param  Query     $query
75
    * @param  Array     $field
76
    * @param  Char      $sort 
77
    * @param  Integer   $sort
78
    * @param  Boolean   $seekable
79
    * @return Array     $result
80
    */
81
    function rapid_paginator($query, $field = 'id', $appendQuery=false, $cache = null, $sort = '>', $perPage = 10, $tab=1, $seekable = true)
82
    {
83
        if($cache == null)
84
            init_rapid_paginator_cache(null);
85
        /*
86
        ** Setup Default values
87
        */
88
        /*if($sort == null)
89
            $sort = '>';
90
        else
91
            $cache['sort'] = $sort;
92
93
        if($field == null)
94
            $field = 'id';
95
        
96
        if($perPage == null)
97
            $perPage = 10;
98
        else
99
            $cache['perPage'] = $perPage;*/
100
    
101
        /*
102
        ** Extract Cursor from the State route parameter
103
        ** Cursor is used as a reference to navigate to the next or previous 'pages'...
104
        */
105
106
        $state_array = null;
107
108
        // Decode the State
109 View Code Duplication
        if(request('state') && request('tab') == $tab){
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...
110
            $state_base64 = request('state');
111
            $state_decoded = urlsafe_b64decode($state_base64);
112
            $state_array = json_decode($state_decoded,true);
113
        }
114
115
        $cursor = null;
116
        
117
        // Add cursor from state to the newCursor array
118
        if($state_array){
119
            if(isset($state_array['cursor'][$field]))
120
                $cursor[$field] = $state_array['cursor'][$field];
121
        }
122
        
123
124
        // Create a new paginator
125
        $paginator = $query->rapid_pagination()
126
                    ->limit($perPage); // Set Number of elements Per Page (default=10)
127
        
128
        // Sort by 'field'..
129
        if($sort == '>' || $sort == null)
130
            $paginator = $paginator->orderBy($field);
131
        else
132
            $paginator = $paginator->orderByDesc($field);
133
        
134
        // Get 'Previous Cursor' to be able to navigate backwards
135
        if($seekable)
136
            $paginator = $paginator->seekable(); 
137
138
        // If 'Next' Button is Clicked
139
        if(request()->direction == "next" || request()->direction == null){
140
            $paginator = $paginator->forward(); // Use forward method to change the direction of the navigation
141
        } 
142
        // If 'Previous' Button is Clicked
143
        else{
144
            $paginator = $paginator->backward(); // Use backward method to change the direction of the navigation
145
        }
146
147
        // Navigation rules
148
        if($cursor != null){
149
            $paginator = $paginator
150
                ->paginate($cursor);
151
        }
152
        else{
153
            $paginator = $paginator
154
                ->paginate();
155
        }
156
157
        /*
158
        ** Prepare a new State
159
        */
160
        
161
        // Extract cursors from paginator
162
        $paginatorArray = (array)$paginator;
163
        unset($paginatorArray['records']); // We don't need to encode records in the state
164
165
166
        // Next and Previous buttons have different cursors that's why we need state for every button
167
168
        // Next Btn State...
169
        $state_next = [
170
            'cursor' => $paginatorArray['nextCursor'],
171
            'cache' => $cache
172
        ];
173
174
        // Previous Btn State...
175
        $state_prev = [
176
            'cursor' => $paginatorArray['previousCursor'],
177
            'cache' => $cache
178
        ];
179
180
        // Encode States
181
        $base64_next_state = urlsafe_b64encode(json_encode($state_next));
182
        $base64_prev_state = urlsafe_b64encode(json_encode($state_prev));
183
        
184
        //Set tab id
185
        $paginator->setTabID($tab);
186
        
187
        if($appendQuery){
188
            $paginator->appends(request()->query());
189
        }
190
        
191
        // Set paginator previous and next Urls
192
        $paginator->makePreviousUrl($base64_prev_state);
193
        $paginator->makeNextUrl($base64_next_state);
194
195
        
196
197
        $result = [
198
            'items' => $paginator,
199
            'cache' => $cache
200
        ];
201
202
        return $result;
203
    }
204
}
205