Categories
Chia sẻ

Mã hóa thông tin cấu hình của ứng dụng Laravel

documentó una actividad antioxidante temporal de Capparis spinosa y también mostró https://vgres.net/compra-cialis-soft-sinreceta.html flavonoles y pigmentos hidroxicinámicos como el principal antioxidante de Capparis spinosa. En combinación con las invenciones de análogos de fármacos, por lo tanto, es fuerte que haya más de tres tumores malignos primarios.
Laravel sử dụng cấu hình biến môi trường (environment variables) nhờ thư viện DotEnv, nó cực kỳ linh động và dễ sử dụng cho phép ta dễ dàng cấu hình và chuyển đổi giữa các môi trường … Nhưng liệu nó có an toàn? Các biến môi trường trong PHP hoàn toàn có thể lộ ra ngoài:

Hãy thử show phpinfo() trong ứng dụng Laravel của bạn, bạn có thể tìm thấy các thông tin cấu hình trên.

 

Cách mà tôi mã hóa thông tin cấu hình của ứng dụng Laravel bao gồm 2 việc:

  • Tạo một secret key và lưu nó vào ứng dụng
  • Lưu các cấu hình ứng dụng dưới dạng đã hóa dựa vào secret key ở trên

Note: Trong phần thực hiện có sử dụng một tính năng của Laravel là Tinker. Tinker là một tính năng ít được biết đến trong Laravel artisan giúp bạn nhanh chóng đọc dữ liệu ngay trong project của mình. Tinker cho phép chúng ta tương tác trực tiếp với ứng dụng của mình thông qua các lệnh như stop() hay dd() thậm chí là cả print_r() mà không cần thao tác qua các bước như tạo Routes, Model, Controller, …

Bước 1: Vào Tinker tạo một secret key và lưu vào ứng dụng

D:xampphtdocslaravel>php artisan tinker
>>> IlluminateSupportStr::random(16);
=> "65TwDjDRWfwz3auF"

Lưu key vừa tạo ra vào config/env.php:

<?php
return [
'key' => '65TwDjDRWfwz3auF'
];

 

Bước 2: Tiếp tục sử dụng Tinker mã hóa tất cả các biến cấu hình mà bạn muốn. Ở ví dụ của tôi, tôi sẽ mã hóa 3 thông tin ứng dụng của tôi trên máy local bao gồm:

DB_DATABASE=laravel_db
DB_USERNAME=root
DB_PASSWORD=123456

như sau:

# khởi tạo Encrypter với key đã tạo vào lưu ở trên
>>> $c = new IlluminateEncryptionEncrypter(config("env.key"));
=> IlluminateEncryptionEncrypter {#655}

# mã hóa 3 thông tin trên với tiền tố "ENC:"
>>> "ENC:". $c->encrypt("laravel_db");
=> "ENC:eyJpdiI6IncxN0M5...NyJ9"

>>> "ENC:". $c->encrypt("root");
=> "ENC:eyJpdiI6ImM2Ujc...ifQ=="

>>> "ENC:". $c->encrypt("123456");
=> "ENC:eyJpdiI6ImhcL05...In0=="

Note: Nếu bạn gặp lỗi RuntimeException with message ‘The only supported ciphers are AES-128-CBC and AE
S-256-CBC with the correct key lengths.’ khi khởi tạo Encrypter hãy tạm thoát Tinker và xóa config cache rồi tiếp tục

>>> exit
D:xampphtdocslaravel>php artisan config:clear
=> Configuration cache cleared!

 

Bước 3: Lưu các thông tin đã mã hóa lại file .env

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=ENC:eyJpdiI6IncxN0M5...NyJ9
DB_USERNAME=ENC:eyJpdiI6ImM2Ujc...ifQ==
DB_PASSWORD=ENC:eyJpdiI6ImhcL05...In0==

 

Bước 4: Thêm vào đầu file bootstrap/app.php đoạn code sau để xử lý giải mã

$env = require __DIR__ . './../config/env.php';
$crypt = new IlluminateEncryptionEncrypter($env['key']);
$secEnv = [];

function secEnv($name, $fallback = '')
{
    global $crypt, $secEnv;
    if ( ! isset($secEnv[$name]) && env($name) && strpos(env($name), "ENC:") === 0)
    {
        $secEnv[$name] = $crypt->decrypt(substr(env($name), 4));
    }
    return isset($secEnv[$name]) ? $secEnv[$name] : env($name, $fallback);
}

 

Bước 5: Cuối cùng sử dụng secEnv(“ENV_NAME”, “fallback value”) ở bất kỳ đâu để truy cập biến môi trường đã mã hóa. Trong ví dụ đang xét là config/database.php

// ..
'connections' => [
    // ..
    'mysql' => [
        // ..
        'database' => secEnv('DB_DATABASE', ''),
        'username' => secEnv('DB_USERNAME', ''),
        'password' => secEnv('DB_PASSWORD', ''),
        // ..
    ],
],

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *