Bài 23 — Checklist bảo mật production: TaskFlow đã có xác thực, policy và test CSRF. Trước khi triển khai, cần kiểm tra cả cấu hình runtime và hạ tầng; một bộ test xanh không chứng minh máy chủ đã an toàn.
1. Chia checklist theo bằng chứng
Kiểm tra code bằng test, kiểm tra cấu hình bằng command và kiểm tra đường mạng bằng request thực tế. Không dùng kết quả của một tầng để kết luận cho tầng khác. Ví dụ APP_URL=https không cài chứng chỉ TLS, còn session driver database không chứng minh các instance đang dùng chung database.
Ở bài này chúng ta thêm taskflow:security-check, một lệnh chỉ đọc config hiện tại, không in key hoặc password và không tự sửa hệ thống. Lệnh trả mã lỗi khi một tiêu chí cấu hình không đạt. Đây là gate hẹp để bắt sai sót phổ biến, không phải trình quét lỗ hổng.
2. Lệnh kiểm tra cấu hình
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class SecurityCheck extends Command
{
protected $signature = 'taskflow:security-check';
protected $description = 'Read-only production configuration checks without printing secrets';
public function handle(): int
{
$checks = [
'Production environment' => app()->environment('production'),
'Debug disabled' => config('app.debug') === false,
'HTTPS application URL' => parse_url((string) config('app.url'), PHP_URL_SCHEME) === 'https',
'Application key present (not cryptographic validation)' => is_string(config('app.key')) && config('app.key') !== '',
'Secure session cookie' => config('session.secure') === true,
'HttpOnly session cookie' => config('session.http_only') === true,
'SameSite is lax or strict' => in_array(config('session.same_site'), ['lax', 'strict'], true),
'Server-side shared-session candidate' => in_array(config('session.driver'), ['database', 'redis'], true),
];
foreach ($checks as $label => $passed) {
$this->line(($passed ? 'PASS ' : 'FAIL ').$label);
}
$this->warn('Configuration only: verify TLS, proxy, storage access, permissions, dependencies and recovery separately.');
return in_array(false, $checks, true) ? self::FAILURE : self::SUCCESS;
}
}php artisan taskflow:security-check
php artisan test --filter=SecurityCheckTest
Chạy command dưới cùng release, môi trường và quyền phù hợp với runtime cần kiểm tra. Local có HTTP/debug có thể FAIL là bình thường; không đổi môi trường thành production chỉ để làm output xanh. Kiểm tra key chỉ xác nhận có chuỗi, không chứng minh độ ngẫu nhiên, độ dài hay khả năng giải mã.
SameSite Lax/Strict và session database/Redis là baseline của TaskFlow, không phải luật phổ quát cho mọi kiến trúc. Ứng dụng cross-site hoặc thiết kế session khác cần tiêu chí riêng và kiểm thử bổ sung. Hai test command xác nhận cấu hình mẫu đạt/thất bại và không echo key; toàn suite đạt 68 test, 290 assertions.
3. Web root, secret và quyền file
Web root phải trỏ vào public, không phải thư mục gốc repository. Xác minh từ bên ngoài rằng file env, source, log và backup không được tải về. Không chỉ dựa vào gitignore: file không commit vẫn có thể bị web server phục vụ nếu root sai.
Chỉ cấp quyền ghi cần thiết cho storage và bootstrap/cache theo user chạy ứng dụng; không chmod 777 toàn dự án. Tài khoản database runtime dùng quyền tối thiểu theo tác vụ; quyền migration có thể tách trong deployment. Key, API token và mật khẩu phải có nơi lưu an toàn, quyền đọc giới hạn và kế hoạch thu hồi khi lộ.
Không chạy key:generate tùy tiện trên ứng dụng đã có dữ liệu mã hóa. Việc đổi key có thể làm mất khả năng giải mã; cần kiểm kê dữ liệu, chiến lược chuyển đổi và kiểm thử phục hồi trước.
4. Ranh giới HTTP và dữ liệu
Giữ APP_DEBUG=false trong production và kiểm tra lỗi 500 thực tế không lộ stack trace. Kiểm tra TLS, cookie Secure/HttpOnly/SameSite và trusted proxy theo mạng thật. Không tin toàn bộ proxy tùy ý nếu client có thể tiếp cận backend trực tiếp.
Giữ policy cho từng endpoint đọc/ghi, scope query theo project, allowlist field/sort và bind giá trị SQL. Blade hiện escape nội dung người dùng; không chuyển sang render HTML thô vì muốn hiển thị mô tả đẹp hơn. Upload và gọi URL bên ngoài sẽ cần giới hạn loại file, dung lượng, quyền tải và phòng SSRF; chưa có những tính năng đó trong mốc này.
CSRF, rate limit và authorization là các lớp riêng. Không tắt CSRF để chữa 419 hoặc coi 429 là bằng chứng đã chặn mọi tấn công. Các bài 20–22 đã có test đối kháng, nhưng chưa có recovery/MFA hay quy trình cấp tài khoản production đầy đủ.
5. Dependency, log và phục hồi
Chạy composer audit và npm audit trong quy trình kiểm tra dependency có mạng, đọc advisory và phân biệt dependency runtime/dev. Không chạy update toàn bộ production như một phản xạ; tạo thay đổi có kiểm thử và kế hoạch rollback. Bài này không tuyên bố đã audit sạch mọi dependency.
Log cần hữu ích nhưng không chứa credential hoặc request body nhạy cảm. Đặt retention và quyền truy cập. Backup cần được mã hóa/bảo vệ, tách quyền khỏi ứng dụng và có lần restore thử trên môi trường cô lập. File backup tồn tại không chứng minh dữ liệu phục hồi được.
Trước mở dịch vụ: lưu bằng chứng config check, test quyền/CSRF, kiểm tra HTTPS/public root, audit dependency và restore. Mỗi mục chưa kiểm chứng phải ghi người phụ trách và cách xác minh. TaskFlow hiện vẫn là dự án local; việc xuất bản bài học không đồng nghĩa deploy TaskFlow lên production.
Tham khảo Laravel Deployment. Điều hướng: Bài 22 · Lộ trình. Tiếp theo: REST API, Resource và validation.




Chưa có bình luận. Hãy là người đầu tiên chia sẻ ý kiến.