Completed
Pull Request — master (#32)
by Shawn
03:43 queued 01:25
created

EnvironmentController::saveFile()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
c 1
b 1
f 0
dl 0
loc 12
rs 9.4285
cc 2
eloc 7
nc 2
nop 1
1
<?php
2
3
namespace SET\Http\Controllers\Installation;
4
5
use Exception;
6
use Illuminate\Http\Request;
7
use Illuminate\Support\Facades\Artisan;
8
use RachidLaasri\LaravelInstaller\Helpers\EnvironmentManager;
9
use SET\Http\Controllers\Controller;
10
11
class EnvironmentController extends Controller
12
{
13
    /**
14
     * @var EnvironmentManager
15
     */
16
    protected $EnvironmentManager;
17
    protected $envPath;
18
19
    /**
20
     * @param EnvironmentManager $environmentManager
21
     */
22
    public function __construct(EnvironmentManager $environmentManager)
23
    {
24
        $this->EnvironmentManager = $environmentManager;
25
        $this->envPath = base_path('.env');
26
    }
27
28
    /**
29
     * Display the Environment page.
30
     *
31
     * @return \Illuminate\View\View
32
     */
33
    public function index()
34
    {
35
        $envConfig = $this->EnvironmentManager->getEnvContent();
36
        $fields = $this->breakApartEnv($envConfig);
37
38
        return view('vendor.installer.environment', compact('fields'));
39
    }
40
41
    /**
42
     * Processes the newly saved environment configuration and redirects back.
43
     *
44
     * @param Request $input
45
     *
46
     * @return \Illuminate\Http\RedirectResponse
47
     */
48
    public function store(Request $input)
49
    {
50
        $env = $this->flattenRequest($input);
51
        $message = $this->saveFile($env);
52
53
        Artisan::call('key:generate');
54
55
        return redirect()->route('LaravelInstaller::requirements')
56
            ->with(['message' => $message]);
57
    }
58
59
    /**
60
     * Key should be before the first = symbol and value should be after.
61
     * Each new line (\r\n) should be a new array entry.
62
     *
63
     * @param $string
64
     *
65
     * @return array
66
     */
67
    private function breakApartEnv($string)
68
    {
69
        preg_match_all('/([^=]*?)=([^\r\n]*?)[\r\n]+/', $string, $matches);
70
71
        return array_combine($matches[1], $matches[2]);
72
    }
73
74
    private function flattenRequest(Request $input)
75
    {
76
        $fields = $this->breakApartEnv($this->EnvironmentManager->getEnvContent());
77
        $results = array_merge($fields, $input->toArray());
78
        unset($results['_token']);
79
80
        $env = '';
81
        foreach ($results as $key => $value) {
82
            $env .= $key.'='.$value."\r\n";
83
        }
84
85
        return $env;
86
    }
87
88
    /**
89
     * Save the edited content to the file.
90
     *
91
     * @param $string
92
     *
93
     * @return string
94
     */
95
    public function saveFile($string)
96
    {
97
        $message = trans('messages.environment.success');
98
99
        try {
100
            file_put_contents($this->envPath, $string);
0 ignored issues
show
Security File Manipulation introduced by
$string can contain request data and is used in file manipulation context(s) leading to a potential security vulnerability.

8 paths for user data to reach this point

  1. Path: $this->parameters['HTTP_AUTHORIZATION'] seems to return tainted data, and $authorizationHeader is assigned in ServerBag.php on line 62
  1. $this->parameters['HTTP_AUTHORIZATION'] seems to return tainted data, and $authorizationHeader is assigned
    in vendor/ServerBag.php on line 62
  2. ParameterBag::$parameters is assigned
    in vendor/ServerBag.php on line 77
  3. Tainted property ParameterBag::$parameters is read
    in vendor/ParameterBag.php on line 45
  4. ParameterBag::all() returns tainted data, and $files is assigned
    in vendor/src/Illuminate/Http/Request.php on line 431
  5. Data is passed through array_map()
    in vendor/src/Illuminate/Http/Request.php on line 454
  6. Request::$convertedFiles is assigned
    in vendor/src/Illuminate/Http/Request.php on line 435
  7. Tainted property Request::$convertedFiles is read
    in vendor/src/Illuminate/Http/Request.php on line 434
  8. Request::allFiles() returns tainted data, and $this->allFiles() is passed through array_replace_recursive()
    in vendor/src/Illuminate/Http/Request.php on line 323
  9. Request::all() returns tainted data
    in vendor/src/Illuminate/Http/Request.php on line 1015
  10. Request::toArray() returns tainted data, and $input->toArray() is passed through array_merge(), and $results is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 77
  11. $key is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 81
  12. $env is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 82
  13. EnvironmentController::flattenRequest() returns tainted data, and $env is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 50
  14. $env is passed to EnvironmentController::saveFile()
    in app/Http/Controllers/Installation/EnvironmentController.php on line 51
  2. Path: Read from $_POST, and $_POST is passed to Request::createRequestFromFactory() in Request.php on line 281
  1. Read from $_POST, and $_POST is passed to Request::createRequestFromFactory()
    in vendor/Request.php on line 281
  2. $request is passed to Request::__construct()
    in vendor/Request.php on line 1939
  3. $request is passed to Request::initialize()
    in vendor/Request.php on line 222
  4. $request is passed to ParameterBag::__construct()
    in vendor/Request.php on line 240
  5. ParameterBag::$parameters is assigned
    in vendor/ParameterBag.php on line 35
  6. Tainted property ParameterBag::$parameters is read
    in vendor/ParameterBag.php on line 45
  7. ParameterBag::all() returns tainted data, and $files is assigned
    in vendor/src/Illuminate/Http/Request.php on line 431
  8. Data is passed through array_map()
    in vendor/src/Illuminate/Http/Request.php on line 454
  9. Request::$convertedFiles is assigned
    in vendor/src/Illuminate/Http/Request.php on line 435
  10. Tainted property Request::$convertedFiles is read
    in vendor/src/Illuminate/Http/Request.php on line 434
  11. Request::allFiles() returns tainted data, and $this->allFiles() is passed through array_replace_recursive()
    in vendor/src/Illuminate/Http/Request.php on line 323
  12. Request::all() returns tainted data
    in vendor/src/Illuminate/Http/Request.php on line 1015
  13. Request::toArray() returns tainted data, and $input->toArray() is passed through array_merge(), and $results is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 77
  14. $key is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 81
  15. $env is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 82
  16. EnvironmentController::flattenRequest() returns tainted data, and $env is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 50
  17. $env is passed to EnvironmentController::saveFile()
    in app/Http/Controllers/Installation/EnvironmentController.php on line 51
  3. Path: Read from $_SERVER, and $server is assigned in Request.php on line 271
  1. Read from $_SERVER, and $server is assigned
    in vendor/Request.php on line 271
  2. $server is passed to Request::createRequestFromFactory()
    in vendor/Request.php on line 281
  3. $server is passed to Request::__construct()
    in vendor/Request.php on line 1939
  4. $server is passed to Request::initialize()
    in vendor/Request.php on line 222
  5. $server is passed to ParameterBag::__construct()
    in vendor/Request.php on line 245
  6. ParameterBag::$parameters is assigned
    in vendor/ParameterBag.php on line 35
  7. Tainted property ParameterBag::$parameters is read
    in vendor/ParameterBag.php on line 45
  8. ParameterBag::all() returns tainted data, and $files is assigned
    in vendor/src/Illuminate/Http/Request.php on line 431
  9. Data is passed through array_map()
    in vendor/src/Illuminate/Http/Request.php on line 454
  10. Request::$convertedFiles is assigned
    in vendor/src/Illuminate/Http/Request.php on line 435
  11. Tainted property Request::$convertedFiles is read
    in vendor/src/Illuminate/Http/Request.php on line 434
  12. Request::allFiles() returns tainted data, and $this->allFiles() is passed through array_replace_recursive()
    in vendor/src/Illuminate/Http/Request.php on line 323
  13. Request::all() returns tainted data
    in vendor/src/Illuminate/Http/Request.php on line 1015
  14. Request::toArray() returns tainted data, and $input->toArray() is passed through array_merge(), and $results is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 77
  15. $key is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 81
  16. $env is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 82
  17. EnvironmentController::flattenRequest() returns tainted data, and $env is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 50
  18. $env is passed to EnvironmentController::saveFile()
    in app/Http/Controllers/Installation/EnvironmentController.php on line 51
  4. Path: Fetching key HTTP_CONTENT_LENGTH from $_SERVER, and $server is assigned in Request.php on line 274
  1. Fetching key HTTP_CONTENT_LENGTH from $_SERVER, and $server is assigned
    in vendor/Request.php on line 274
  2. $server is passed to Request::createRequestFromFactory()
    in vendor/Request.php on line 281
  3. $server is passed to Request::__construct()
    in vendor/Request.php on line 1939
  4. $server is passed to Request::initialize()
    in vendor/Request.php on line 222
  5. $server is passed to ParameterBag::__construct()
    in vendor/Request.php on line 245
  6. ParameterBag::$parameters is assigned
    in vendor/ParameterBag.php on line 35
  7. Tainted property ParameterBag::$parameters is read
    in vendor/ParameterBag.php on line 45
  8. ParameterBag::all() returns tainted data, and $files is assigned
    in vendor/src/Illuminate/Http/Request.php on line 431
  9. Data is passed through array_map()
    in vendor/src/Illuminate/Http/Request.php on line 454
  10. Request::$convertedFiles is assigned
    in vendor/src/Illuminate/Http/Request.php on line 435
  11. Tainted property Request::$convertedFiles is read
    in vendor/src/Illuminate/Http/Request.php on line 434
  12. Request::allFiles() returns tainted data, and $this->allFiles() is passed through array_replace_recursive()
    in vendor/src/Illuminate/Http/Request.php on line 323
  13. Request::all() returns tainted data
    in vendor/src/Illuminate/Http/Request.php on line 1015
  14. Request::toArray() returns tainted data, and $input->toArray() is passed through array_merge(), and $results is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 77
  15. $key is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 81
  16. $env is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 82
  17. EnvironmentController::flattenRequest() returns tainted data, and $env is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 50
  18. $env is passed to EnvironmentController::saveFile()
    in app/Http/Controllers/Installation/EnvironmentController.php on line 51
  5. Path: Fetching key HTTP_CONTENT_TYPE from $_SERVER, and $server is assigned in Request.php on line 277
  1. Fetching key HTTP_CONTENT_TYPE from $_SERVER, and $server is assigned
    in vendor/Request.php on line 277
  2. $server is passed to Request::createRequestFromFactory()
    in vendor/Request.php on line 281
  3. $server is passed to Request::__construct()
    in vendor/Request.php on line 1939
  4. $server is passed to Request::initialize()
    in vendor/Request.php on line 222
  5. $server is passed to ParameterBag::__construct()
    in vendor/Request.php on line 245
  6. ParameterBag::$parameters is assigned
    in vendor/ParameterBag.php on line 35
  7. Tainted property ParameterBag::$parameters is read
    in vendor/ParameterBag.php on line 45
  8. ParameterBag::all() returns tainted data, and $files is assigned
    in vendor/src/Illuminate/Http/Request.php on line 431
  9. Data is passed through array_map()
    in vendor/src/Illuminate/Http/Request.php on line 454
  10. Request::$convertedFiles is assigned
    in vendor/src/Illuminate/Http/Request.php on line 435
  11. Tainted property Request::$convertedFiles is read
    in vendor/src/Illuminate/Http/Request.php on line 434
  12. Request::allFiles() returns tainted data, and $this->allFiles() is passed through array_replace_recursive()
    in vendor/src/Illuminate/Http/Request.php on line 323
  13. Request::all() returns tainted data
    in vendor/src/Illuminate/Http/Request.php on line 1015
  14. Request::toArray() returns tainted data, and $input->toArray() is passed through array_merge(), and $results is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 77
  15. $key is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 81
  16. $env is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 82
  17. EnvironmentController::flattenRequest() returns tainted data, and $env is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 50
  18. $env is passed to EnvironmentController::saveFile()
    in app/Http/Controllers/Installation/EnvironmentController.php on line 51
  6. Path: $server['HTTP_HOST'] seems to return tainted data, and $server is assigned in Request.php on line 347
  1. $server['HTTP_HOST'] seems to return tainted data, and $server is assigned
    in vendor/Request.php on line 347
  2. $server is assigned
    in vendor/Request.php on line 395
  3. $server is assigned
    in vendor/Request.php on line 396
  4. $server is passed to Request::createRequestFromFactory()
    in vendor/Request.php on line 398
  5. $server is passed to Request::__construct()
    in vendor/Request.php on line 1939
  6. $server is passed to Request::initialize()
    in vendor/Request.php on line 222
  7. $server is passed to ParameterBag::__construct()
    in vendor/Request.php on line 245
  8. ParameterBag::$parameters is assigned
    in vendor/ParameterBag.php on line 35
  9. Tainted property ParameterBag::$parameters is read
    in vendor/ParameterBag.php on line 45
  10. ParameterBag::all() returns tainted data, and $files is assigned
    in vendor/src/Illuminate/Http/Request.php on line 431
  11. Data is passed through array_map()
    in vendor/src/Illuminate/Http/Request.php on line 454
  12. Request::$convertedFiles is assigned
    in vendor/src/Illuminate/Http/Request.php on line 435
  13. Tainted property Request::$convertedFiles is read
    in vendor/src/Illuminate/Http/Request.php on line 434
  14. Request::allFiles() returns tainted data, and $this->allFiles() is passed through array_replace_recursive()
    in vendor/src/Illuminate/Http/Request.php on line 323
  15. Request::all() returns tainted data
    in vendor/src/Illuminate/Http/Request.php on line 1015
  16. Request::toArray() returns tainted data, and $input->toArray() is passed through array_merge(), and $results is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 77
  17. $key is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 81
  18. $env is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 82
  19. EnvironmentController::flattenRequest() returns tainted data, and $env is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 50
  20. $env is passed to EnvironmentController::saveFile()
    in app/Http/Controllers/Installation/EnvironmentController.php on line 51
  7. Path: $this->parameters['PHP_AUTH_USER'] seems to return tainted data, and $headers is assigned in ServerBag.php on line 43
  1. $this->parameters['PHP_AUTH_USER'] seems to return tainted data, and $headers is assigned
    in vendor/ServerBag.php on line 43
  2. $headers is assigned
    in vendor/ServerBag.php on line 44
  3. ServerBag::getHeaders() returns tainted data, and $this->server->getHeaders() is passed to HeaderBag::__construct()
    in vendor/Request.php on line 246
  4. $values is assigned
    in vendor/HeaderBag.php on line 31
  5. $values is passed to HeaderBag::set()
    in vendor/HeaderBag.php on line 32
  6. (array) $values is passed through array_values(), and $values is assigned
    in vendor/HeaderBag.php on line 142
  7. HeaderBag::$headers is assigned
    in vendor/HeaderBag.php on line 145
  8. Tainted property HeaderBag::$headers is read
    in vendor/HeaderBag.php on line 125
  9. HeaderBag::get() returns tainted data, and $requestUri is assigned
    in vendor/Request.php on line 1709
  10. $requestUri is passed to ParameterBag::set()
    in vendor/Request.php on line 1740
  11. ParameterBag::$parameters is assigned
    in vendor/ParameterBag.php on line 99
  12. Tainted property ParameterBag::$parameters is read
    in vendor/ParameterBag.php on line 45
  13. ParameterBag::all() returns tainted data, and $files is assigned
    in vendor/src/Illuminate/Http/Request.php on line 431
  14. Data is passed through array_map()
    in vendor/src/Illuminate/Http/Request.php on line 454
  15. Request::$convertedFiles is assigned
    in vendor/src/Illuminate/Http/Request.php on line 435
  16. Tainted property Request::$convertedFiles is read
    in vendor/src/Illuminate/Http/Request.php on line 434
  17. Request::allFiles() returns tainted data, and $this->allFiles() is passed through array_replace_recursive()
    in vendor/src/Illuminate/Http/Request.php on line 323
  18. Request::all() returns tainted data
    in vendor/src/Illuminate/Http/Request.php on line 1015
  19. Request::toArray() returns tainted data, and $input->toArray() is passed through array_merge(), and $results is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 77
  20. $key is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 81
  21. $env is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 82
  22. EnvironmentController::flattenRequest() returns tainted data, and $env is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 50
  23. $env is passed to EnvironmentController::saveFile()
    in app/Http/Controllers/Installation/EnvironmentController.php on line 51
  8. Path: $this->parameters['PHP_AUTH_PW'] seems to return tainted data, and $headers is assigned in ServerBag.php on line 44
  1. $this->parameters['PHP_AUTH_PW'] seems to return tainted data, and $headers is assigned
    in vendor/ServerBag.php on line 44
  2. ServerBag::getHeaders() returns tainted data, and $this->server->getHeaders() is passed to HeaderBag::__construct()
    in vendor/Request.php on line 246
  3. $values is assigned
    in vendor/HeaderBag.php on line 31
  4. $values is passed to HeaderBag::set()
    in vendor/HeaderBag.php on line 32
  5. (array) $values is passed through array_values(), and $values is assigned
    in vendor/HeaderBag.php on line 142
  6. HeaderBag::$headers is assigned
    in vendor/HeaderBag.php on line 145
  7. Tainted property HeaderBag::$headers is read
    in vendor/HeaderBag.php on line 125
  8. HeaderBag::get() returns tainted data, and $requestUri is assigned
    in vendor/Request.php on line 1709
  9. $requestUri is passed to ParameterBag::set()
    in vendor/Request.php on line 1740
  10. ParameterBag::$parameters is assigned
    in vendor/ParameterBag.php on line 99
  11. Tainted property ParameterBag::$parameters is read
    in vendor/ParameterBag.php on line 45
  12. ParameterBag::all() returns tainted data, and $files is assigned
    in vendor/src/Illuminate/Http/Request.php on line 431
  13. Data is passed through array_map()
    in vendor/src/Illuminate/Http/Request.php on line 454
  14. Request::$convertedFiles is assigned
    in vendor/src/Illuminate/Http/Request.php on line 435
  15. Tainted property Request::$convertedFiles is read
    in vendor/src/Illuminate/Http/Request.php on line 434
  16. Request::allFiles() returns tainted data, and $this->allFiles() is passed through array_replace_recursive()
    in vendor/src/Illuminate/Http/Request.php on line 323
  17. Request::all() returns tainted data
    in vendor/src/Illuminate/Http/Request.php on line 1015
  18. Request::toArray() returns tainted data, and $input->toArray() is passed through array_merge(), and $results is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 77
  19. $key is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 81
  20. $env is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 82
  21. EnvironmentController::flattenRequest() returns tainted data, and $env is assigned
    in app/Http/Controllers/Installation/EnvironmentController.php on line 50
  22. $env is passed to EnvironmentController::saveFile()
    in app/Http/Controllers/Installation/EnvironmentController.php on line 51

General Strategies to prevent injection

In general, it is advisable to prevent any user-data to reach this point. This can be done by white-listing certain values:

if ( ! in_array($value, array('this-is-allowed', 'and-this-too'), true)) {
    throw new \InvalidArgumentException('This input is not allowed.');
}

For numeric data, we recommend to explicitly cast the data:

$sanitized = (integer) $tainted;
Loading history...
101
        } catch (Exception $e) {
102
            $message = trans('messages.environment.errors');
103
        }
104
105
        return $message;
106
    }
107
}
108