Code Audit Report - Tour Booking Management System#
ตรวจสอบเมื่อ: 2026-03-25
Stack: Laravel 8.83.29 + Vue.js 2 + PHP 8.4.1
สถานะ: ยังไม่พร้อม Production
สรุปภาพรวม#
| ระดับ | จำนวน | สถานะ |
|---|
| 🔴 Critical | 5 | ต้องแก้ก่อน deploy |
| 🟠 High | ~45 จุด | Route/Controller/Model หัก |
| 🟡 Medium | 6 ประเภท | คุณภาพ code & performance |
| 🔵 Low | 7 ประเภท | Cleanup & housekeeping |
🔴 CRITICAL - ต้องแก้ทันที#
C1. PHP 8.4 + Laravel 8 ไม่เข้ากัน#
ปัญหา: Laravel 8 EOL ตั้งแต่ Jan 2023, ไม่รองรับ PHP 8.4 - เกิด deprecation warnings หลายร้อยจุด
ผลกระทบ: จะกลายเป็น fatal errors ใน PHP 9
แก้ไข: อัพเกรด Laravel → 10/11 หรือ ดาวน์เกรด PHP → 8.1
C2. SQL Injection#
ปัญหา: Request parameters ถูกใส่ตรงๆ ใน raw SQL โดยไม่ใช้ parameter binding
ไฟล์: app/Http/Controllers/Admin/Api/AdmindashboardController.php (lines 116, 122, 128)
แก้ไข: ใช้ parameterized queries: ->where('series.country_id', $request->country_id)
C3. Security Middleware ว่างเปล่า#
ปัญหา: Middleware สำหรับ API authentication ไม่มี code ตรวจสอบเลย - pass through ทุก request
app/Http/Middleware/RestApi.php - body ว่าง, มีแค่ TODO comment
app/Http/Middleware/AdminApi.php - bearer token validation ถูก comment out
ผลกระทบ: API routes ที่ใช้ middleware เหล่านี้ไม่มีการ authenticate
แก้ไข: Implement token validation logic
C4. SSL Verification ปิดอยู่#
ปัญหา: HTTP helper ปิด SSL verify ทำให้เสี่ยง Man-in-the-Middle attack
ไฟล์: app/Helpers/Utility.php (lines 69-70)
แก้ไข: เปิด SSL verification กลับ หรือใช้ CA bundle ที่ถูกต้อง
C5. ereg() Functions ถูกลบใน PHP 7+#
ปัญหา: ใช้ ereg() / eregi() ที่ถูกลบออกตั้งแต่ PHP 7.0 - validation ไม่ทำงานเลย (ใช้ @ suppress error)
ไฟล์: app/Library/Form/Val.php (lines 102, 112, 117, 122, 127)
ผลกระทบ: Form validation ทุกจุดที่ใช้ class นี้จะ pass ทุก input
แก้ไข: เปลี่ยนเป็น preg_match()
🟠 HIGH - Route/Controller/Model ที่หัก#
H1. Controller Methods ที่ไม่มีอยู่จริง (~30 methods)#
Routes อ้างอิงถึง methods ที่ไม่มีใน controller - จะ error 500 เมื่อเข้าหน้านั้นroutes/payment.php → PaymentController#
| Missing Method | มีอยู่จริง |
|---|
search() | ไม่มี |
create() | ไม่มี |
edit() | ไม่มี |
update() | ไม่มี |
updateStatus() | ไม่มี |
delete() | ไม่มี |
Controller มีแค่: index, fillterPayment, approve, approveV2, reject, auto_booking_status
routes/agency.php → AgencyController & CompanyController#
| Missing Method | Controller |
|---|
delete() | AgencyController |
export() | AgencyController |
save() | CompanyController |
update() | CompanyController |
suspend() | CompanyController |
delete() | CompanyController |
getApiToken() | CompanyController |
updatestatus() | CompanyController (มี updateStatus() - case mismatch) |
routes/booking.php → BookingController#
| Missing Method | มีอยู่จริง |
|---|
overview() | ไม่มี |
passport() | ไม่มี |
routes/invoice.php → InvoiceController#
| Missing Method |
|---|
dev() |
showDev() |
updateDev() |
routes/web.php → TourPeriodController#
| Missing Method |
|---|
addEstimate() |
incomeEstimate() |
routes/web.php → BookingController (Reports)#
| Missing Method | มีอยู่จริง |
|---|
updateStatus() | มี toggleStatus() แทน |
routes/document.php → SeriesDocumentController#
| Missing Method |
|---|
printMultiple() |
routes/incentive.php#
| Missing Method | Controller |
|---|
paymentDestroy() | IncentivePaymentController |
pdfPrograme() | IncentiveController |
routes/web-api.php (Internal API)#
| Missing Method | Controller |
|---|
exportZipStatus() | CostSeatController |
exportZipDownload() | CostSeatController |
getBookingSummarize() | AllBookingController |
saveBooking() | AllBookingController |
updateBooking() | AllBookingController |
deleteBooking() | AllBookingController |
onInit() | CostingController |
getIncomeSummarize() | IncomeController |
getPeriodSummarize() | PeriodController |
create() | PeriodController |
saveSeries() | SeriesController |
updateSeries() | SeriesController |
H2. Models ที่ไม่มีอยู่จริง (~15 models)#
Namespace App\Models\Quotation\* - ไม่มี directory นี้เลย#
| Model | อ้างอิงใน |
|---|
QuotationInvoice | IncentiveProgramController, QuotationInvoiceController |
QuotationInvoicePrice | IncentiveProgramController, QuotationInvoiceController |
QuotationInvoiceProgram | IncentiveProgramController, QuotationInvoiceController |
QuotationInvoiceDetails | QuotationInvoiceController |
QuotationInvoicePaymentDue | QuotationInvoiceController |
QuotationFlight | QuotationInvoiceController |
QuotationInvoicePayment | QuotationInvoicePaymentController |
Namespace App\Models\Reports\*#
| Model | อ้างอิงใน |
|---|
ReceiptDep | InvioceReportController, InvoiceController |
ReceiptDev | InvioceReportController |
CostingSeriesPrice | CostionSeriesController |
CostingSeriesSummary | CostionSeriesController |
CostingSeriesSummaryDetail | CostionSeriesController |
อื่นๆ#
| Model | อ้างอิงใน |
|---|
App\Models\Promotions\Promotions | Admin\Api\PromotionController |
App\Models\Incentive\IncentiveCancelReasonType | IncentivePaymentController |
App\Models\Incentive\IncentiveReasonType | IncentivePaymentController |
Missing Resources#
| Resource | อ้างอิงใน |
|---|
App\Http\Resources\CountryResource | ManageTourController |
App\Http\Resources\Reports\ReportCommittionSummarizeCollection | ReportCommittionController |
Missing Request Class#
| Request | อ้างอิงใน |
|---|
App\Http\Requests\Ticket\RefundRequest | RefundController |
H3. Blade Views ที่ไม่มี#
| View | Expected Path | อ้างอิงใน |
|---|
series.period.index | resources/views/series/period/index.blade.php | SeriesPerioController |
auth.token_login | resources/views/auth/token_login.blade.php | TokenLoginController |
admin.pages.reports.invoice.dev.create | resources/views/admin/pages/reports/invoice/dev/create.blade.php | InvioceReportController |
admin.pages.reports.invoice.pdfReceiptDev_dep | (same dir) | InvioceReportController |
admin.pages.reports.invoice.pdfReceiptDev_client | (same dir) | InvioceReportController |
admin.pages.invoice.dev | resources/views/admin/pages/invoice/dev.blade.php | InvoiceController |
H4. Broken Import Statements#
routes/reports.php line 6: use App\Http\Controllers\Admin\Reports\BookingReportController - controller ไม่มี → route file จะ fatal error ตอน load
Controllers หลายตัว import App\Http\Controllers\Ticket\RefundController แต่ path จริงคือ Admin\Ticket\RefundController
H5. Deleted Migrations แต่ Models ยังอยู่#
Migrations ถูกลบ (git status: deleted) แต่ Models ยังอ้างอิง tables เหล่านี้:2026_03_21_000012_create_costing_series_reports_table.php → Model: CostingSeriesReport
2026_03_21_000013_create_costing_series_type_lists_table.php → Model: CostingSeriesTypeList
2026_03_21_000014_create_costing_series_type_list_details_table.php → Model: CostingSeriesTypeListDetails
H6. Parameter Deprecation ใน Controllers#
Optional parameter ก่อน required parameter (deprecated ใน PHP 8.4):app/Http/Controllers/Admin/Ticket/TicketPaymentController.php (line 21) - tab_($tab, $id)
app/Http/Controllers/Admin/Ticket/PaymentTicketController.php (line 20) - tab_($tab, $id)
app/Http/Controllers/Admin/Ticket/InvoiceTicketController.php (line 14) - tab_($tab, $id)
H7. Missing .env Variables#
Database connections website และ sync_api ถูกกำหนดใน config/database.php แต่ไม่มี ENV variables:WEBSITE_DB_HOST, WEBSITE_DB_DATABASE, WEBSITE_DB_USERNAME, WEBSITE_DB_PASSWORD
SYNC_API_DB_HOST, SYNC_API_DB_DATABASE, SYNC_API_DB_USERNAME, SYNC_API_DB_PASSWORD
M1. dd() ค้างใน Production Code (20+ จุด)#
dd() (dump and die) จะหยุดการทำงานทั้งหมดถ้าโดนเรียก:app/Http/Controllers/Reports/ReportReceiptController.php (line 140) - block ทั้ง method
app/Http/Controllers/Operation/Booking/OperationBookingController.php
app/Http/Controllers/Booking/BookingController.php
M2. XSS Risk - Unescaped Blade Output#
ใช้ {!! !!} โดยไม่ sanitize:resources/views/forms/booking/formlock/body.blade.php (lines 102, 141): {!!$btn_status!!}, {!!$url!!}
resources/views/admin/pages/settings/land_operations/index.blade.php (line 115): {!! $item->description !!}
resources/views/admin/pages/reports/rush_to_sell.blade.php (line 308): {!! $item['rush_badge'] !!}
resources/views/components/datatable.blade.php (line 91): {!!$actions_right!!}
M3. env() เรียกนอก Config Files (30+ จุด)#
env() จะ return null หลัง php artisan config:cache - ทำให้ production พัง:app/Http/Middleware/EnsureTwoFactorIsConfirmed.php
แก้ไข: ใช้ config('key') แทน env('KEY') ในทุกที่นอก config/ directoryM4. Mass Assignment - 82 Models ไม่มี $fillable/$guarded#
Models เหล่านี้ไม่มี $fillable หรือ $guarded ซึ่งเสี่ยงต่อ mass assignment ถ้าใช้ forceFill() หรือ unguard():app/Models/Agency/Agency.php
app/Models/Booking/BookingDetail.php
app/Models/Booking/BookingRefund.php
app/Models/Booking/BookingDeduct.php
app/Models/Invoice/Invoices.php
M5. 2FA Middleware เขียน DB ทุก Request#
EnsureTwoFactorIsConfirmed middleware ทำ $user->save() ทุก request:ไฟล์: app/Http/Middleware/EnsureTwoFactorIsConfirmed.php (lines 44-46)
ผลกระทบ: DB write ทุก authenticated request → performance issue
แก้ไข: เขียนเฉพาะเมื่อค่าเปลี่ยน
M6. Raw SQL Usage มากเกินไป (90+ จุด)#
DB::raw(), whereRaw(), selectRaw(), orderByRaw(), havingRaw() ใช้มากกว่า 90 จุด - เพิ่มความเสี่ยง SQL injection และยากต่อการ maintain
🔵 LOW - Cleanup & Housekeeping#
L1. ไฟล์สำรอง/ซ้ำซ้อนค้าง#
| ไฟล์ | ปัญหา |
|---|
app/Http/Controllers/Period/PeriodBookingController copy.php | ไฟล์สำเนา (มี space ในชื่อ) |
app/Helpers/TourBookingDetailHelper_Fixed.php | สำเนา "fixed" |
app/Helpers/_bak.php | Backup file 792 บรรทัด (comment out ทั้งหมด) |
L2. Typo ในชื่อ Class/File#
| ชื่อผิด | ชื่อที่ถูกต้อง | ไฟล์ |
|---|
IncentivePaymentCencel | IncentivePaymentCancel | app/Models/Incentive/ |
TourEsttimateHelper | TourEstimateHelper | app/Helpers/ |
TourCerditHelper | TourCreditHelper | app/Helpers/ |
DataTabel | DataTable | app/Helpers/ |
PRICE_ADILT | PRICE_ADULT | app/Helpers/TourBookingDetailHelper.php:228 |
Serise/ directory | Series/ | app/Http/Controllers/ (มีทั้ง 2 directories) |
InvioceReportController | InvoiceReportController | app/Http/Controllers/Admin/Reports/ |
CostionSeriesController | CostingSeriesController | app/Http/Controllers/Admin/Reports/ |
L3. node_modules/ ไ ม่มี#
package.json มี dependencies (Vue 2, jQuery, etc.) แต่ไม่ได้ install
Compiled assets (public/css/, public/js/) มีอยู่แล้ว → ไม่กระทบ runtime
แก้ไข: npm install ถ้าต้องการ build frontend ใหม่
L4. public/storage Symlink ไม่มี#
storage/app/public/ มีอยู่ แต่ public/storage symlink ไม่มี
ผลกระทบ: Upload files ที่เก็บผ่าน storage disk จะ 404
แก้ไข: php artisan storage:link
L5. Mail Configuration#
.env ตั้ง MAIL_FROM_ADDRESS=null
ผลกระทบ: ส่ง email ไม่ได้ หรือถูก reject
แก้ไข: ตั้งค่า email address ที่ถูกต้อง
L6. Deprecated Package#
composer.json มีทั้ง phpoffice/phpexcel (abandoned 2017) และ phpoffice/phpspreadsheet (replacement)
แก้ไข: Migrate code จาก PHPExcel → PHPSpreadsheet แล้วลบ phpexcel ออก
L7. TODO/FIXME ที่ยังไม่ implement (14 จุด)#
| ไฟล์ | บรรทัด | เนื้อหา |
|---|
app/Http/Middleware/RestApi.php | 12 | TODO: Implement the middleware |
app/Helpers/TourBookingHelper.php | 1036 | TODO: recalculate price |
app/Console/Commands/SyncDataToApi.php | 190 | TODO make env |
| และอีก 11 จุด | | |
Security Concerns เพิ่มเติม#
S1. Authentication Token ใน URL#
app/Helpers/Utility.php (lines 6-12): officeURL() ส่ง rememberToken เป็น query parameter
Token จะถูก log ใน browser history, server logs, referer headers
S2. Database Password#
.env ใช้ root user กับ password เดียวกันสำหรับ 6 databases
DB_HOST ตั้งเป็น Docker container name (mysql-mariadb-1) - ใช้นอก Docker ไม่ได้
S3. Duplicate Route Names#
payment.export ถูกกำหนด 2 ครั้งใน web-api.php
income.init ถูกกำหนด 2 ครั้งใน web-api.php
ลำดับความสำคัญในการแก้ไข#
Phase 1 - Security (แก้ก่อน deploy)#
1.
แก้ SQL Injection ใน AdmindashboardController
2.
Implement RestApi/AdminApi middleware
3.
เปิด SSL verification กลับ
4.
แก้ ereg() → preg_match()
5.
ย้าย auth token ออกจาก URL
Phase 2 - Stability (แก้ให้ระบบทำงานได้)#
1.
แก้ broken route → controller mappings (~30 จุด)
2.
สร้าง missing models หรือลบ import ที่ไม่ใช้
3.
สร้าง missing blade views
4.
ลบ dd() ออกจาก controllers
5.
แก้ broken import ใน routes/reports.php
Phase 3 - Quality (ปรับปรุงคุณภาพ)#
1.
เปลี่ยน env() → config() นอก config files
2.
เพิ่ม $fillable/$guarded ใน models
3.
แก้ 2FA middleware performance
4.
แก้ XSS risks ใน blade views
Phase 4 - Cleanup#
Phase 5 - Infrastructure#
1.
อัพเกรด Laravel 8 → 10/11
2.
อัพเกรด PHP compatibility
3.
จัดการ database connections ให้ครบ
Modified at 2026-03-25 09:05:40