Vì sao hosting chặn một số hàm PHP
Hướng dẫn Web Hosting · cập nhật 26/07/2026
Máy chủ hosting chặn một số hàm PHP vì chúng cho phép chạy lệnh hệ điều hành, đọc ghi ngoài thư mục của website hoặc can thiệp vào tiến trình khác. Đọc bài này khoảng 7 phút là biết hàm nào bị chặn, vì sao, và làm gì khi mã nguồn của bạn cần tới chúng.
Bạn gặp chuyện này khi cài một plugin rồi nhận thông báo Call to undefined function, hoặc khi công cụ kiểm tra hệ thống của mã nguồn báo có hàm bị vô hiệu hoá. Danh sách hàm bị chặn nằm ở tham số disable_functions trong cấu hình PHP.
- Ba nhóm rủi ro khiến một hàm PHP bị đưa vào danh sách chặn.
- Bảng các hàm thường bị chặn và lý do từng hàm.
- Cách kiểm tra máy chủ đang chặn hàm nào.
- Làm gì khi mã nguồn cần một hàm đã bị chặn.
Danh sách chặn khác nhau giữa các nhà cung cấp và giữa các gói dịch vụ. Bài này liệt kê nhóm hàm bị chặn phổ biến trên hosting chia sẻ. Trên VPS và máy chủ riêng, bạn có quyền tự sửa danh sách này.
Ba nhóm rủi ro khiến một hàm PHP bị chặn
PHP có thư viện hàm rất rộng, trong đó một phần chạm thẳng vào hệ điều hành chứ không chỉ xử lý dữ liệu trong website. Trên hosting chia sẻ, nhiều website của nhiều khách chạy trên cùng một máy, nên một hàm chạm được ra ngoài phạm vi website là một đường cho mã độc lan sang tài khoản khác.
| Nhóm rủi ro | Hàm tiêu biểu | Kẻ tấn công làm được gì |
|---|---|---|
| Chạy lệnh hệ điều hành | system, exec, shell_exec, passthru, popen | Tải mã độc về máy chủ rồi chạy, mở cửa hậu |
| Can thiệp tiến trình | proc_open, proc_close, proc_terminate, proc_nice | Ngắt tiến trình đang chạy, giành tài nguyên của máy |
| Đổi cấu hình lúc chạy | ini_alter, dl, virtual | Bật lại tính năng đã tắt, nạp phần mở rộng lạ |
Một website bị chiếm quyền trên hosting chia sẻ mà chạy được lệnh hệ điều hành thì máy chủ coi như bị chiếm. Vì vậy nhóm hàm chạy lệnh gần như luôn nằm trong danh sách chặn ở mọi nhà cung cấp.
Bảng các hàm PHP thường bị chặn và lý do từng hàm
Bảng dưới đây liệt kê các hàm hay nằm trong disable_functions trên hosting chia sẻ, kèm việc hàm đó làm và lý do bị chặn. Đọc cột lý do là hiểu vì sao yêu cầu mở lại thường bị từ chối trên gói chia sẻ.
| Hàm | Chức năng | Vì sao bị chặn |
|---|---|---|
| system | Chạy một chương trình bên ngoài và in kết quả ra | Chạy được lệnh bất kỳ của hệ điều hành với quyền của tiến trình web |
| exec | Chạy một chương trình bên ngoài | Giống system, dùng để tải và chạy chương trình độc hại |
| shell_exec | Chạy lệnh qua shell, trả kết quả về dạng chuỗi | Cùng nhóm với exec, kết quả trả về dạng chuỗi tiện cho kẻ tấn công đọc |
| passthru | Chạy lệnh và truyền thẳng dữ liệu thô về trình duyệt | Dùng để lấy dữ liệu nhị phân từ lệnh hệ thống |
| popen | Mở con trỏ tệp tới một tiến trình | Cùng khả năng như proc_open, ít bị để ý hơn |
| proc_close | Đóng tiến trình mở bằng proc_open, trả mã thoát | Đi kèm nhóm điều khiển tiến trình, mở một cái là mở cả nhóm |
| proc_get_status | Lấy thông tin tiến trình mở bằng proc_open | Lộ thông tin về tiến trình đang chạy trên máy chủ |
| proc_terminate | Gửi tín hiệu kết thúc cho một tiến trình | Ngắt được tiến trình quan trọng đang chạy dở, gây mất dữ liệu |
| proc_nice | Đổi mức ưu tiên của tiến trình hiện tại | Nâng ưu tiên để chiếm CPU, làm chậm website của khách khác |
| escapeshellcmd | Thoát ký tự đặc biệt trong chuỗi lệnh shell | Chỉ có ý nghĩa khi đi cùng exec hay system, chặn cả cụm cho gọn |
| escapeshellarg | Thêm dấu nháy quanh một đối số shell | Cùng lý do với escapeshellcmd |
| dl | Nạp một phần mở rộng PHP lúc đang chạy | Nạp được thư viện lạ vào tiến trình PHP, vượt qua cấu hình đã chốt |
| show_source | In mã nguồn một file PHP có tô màu cú pháp | Lộ mã nguồn kèm thông tin kết nối cơ sở dữ liệu trong file cấu hình |
| ini_alter | Bí danh của ini_set, đổi giá trị cấu hình lúc chạy | Bật lại các tính năng quản trị viên đã tắt |
| virtual | Gọi một yêu cầu phụ của Apache | Truy cập được tài nguyên nằm ngoài phạm vi mã nguồn đang chạy |
| openlog | Mở kết nối tới bộ ghi nhật ký hệ thống | Ghi rác vào nhật ký hệ thống, che dấu vết tấn công |
| Gửi thư trực tiếp qua chương trình mail của máy chủ | Gửi thư rác không qua xác thực, làm IP máy chủ bị đưa vào danh sách chặn | |
| symlink | Tạo liên kết tượng trưng tới file khác | Trỏ ra ngoài thư mục website để đọc file của tài khoản khác trên cùng máy |
Cách kiểm tra máy chủ đang chặn hàm PHP nào
Đừng đoán theo danh sách chung, mỗi máy chủ khai một danh sách riêng. Cách nhanh nhất là tạo một file PHP trong thư mục website, gọi phpinfo() rồi tìm dòng disable_functions. Xoá file đó ngay sau khi xem xong vì nó phơi bày cấu hình máy chủ cho bất kỳ ai truy cập.
<?php phpinfo();
Cách thứ hai không cần tạo file lộ thông tin, chỉ hỏi đúng một hàm bạn quan tâm:
<?php
var_dump(function_exists('exec'));
var_dump(ini_get('disable_functions'));
Trên bảng điều khiển, đường đi có sẵn: DirectAdmin có mục xem cấu hình PHP theo từng tài khoản, còn Plesk hiện danh sách trong Websites & Domains ở phần PHP Settings.
Làm gì khi mã nguồn cần một hàm PHP đã bị chặn
Trước khi xin mở, hãy xem có cách khác không. Phần lớn trường hợp mã nguồn gọi hàm chạy lệnh là để làm những việc PHP đã có hàm sẵn an toàn hơn, chỉ là người viết chọn đường tắt.
- Tìm hàm thay thế trong PHP. Nén file dùng lớp
ZipArchivethay vì gọi lệnhzip. Xử lý ảnh dùng phần mở rộng GD hoặc Imagick thay vì gọi ImageMagick qua dòng lệnh. - Bỏ tính năng không cần. Nhiều plugin gọi hàm chạy lệnh chỉ để hiện thông tin hệ thống trong trang quản trị, tắt phần đó là hết lỗi.
- Đổi cách chạy tác vụ nền. Mã nguồn gọi lệnh để chạy tác vụ định kỳ thì chuyển sang cron job của bảng điều khiển. Xem hướng dẫn sử dụng Cron Jobs trên DirectAdmin.
- Chuyển sang VPS. Mã nguồn buộc phải chạy lệnh hệ điều hành thì hosting chia sẻ không phải chỗ chạy nó. Trên VPS bạn tự quyết danh sách chặn.
Không có hàm nào tên exec_safe hay system_safe trong PHP. Nếu tài liệu nào đó khuyên bạn thay exec bằng những tên này thì tài liệu đó sai. Cách thay thế đúng là dùng lớp và phần mở rộng có sẵn của PHP cho từng việc cụ thể.
Chặn hàm PHP chỉ là một lớp bảo mật
Danh sách chặn ngăn kẻ tấn công leo thang sau khi đã vào được, nhưng không ngăn họ vào. Website vẫn bị chiếm qua plugin lỗi thời, qua mật khẩu yếu hoặc qua lỗ hổng tải file lên. Chặn hàm chỉ giới hạn thiệt hại khi chuyện đó xảy ra.
Ba việc cần làm song song: cập nhật mã nguồn và plugin đúng hạn, xác thực dữ liệu người dùng nhập vào trước khi xử lý, và không để file cấu hình chứa mật khẩu nằm trong thư mục truy cập được từ trình duyệt.
Việc nên kiểm tra trên hosting của bạn
Chạy thử đoạn function_exists ở trên cho đúng những hàm mã nguồn của bạn cần, rồi đối chiếu với bảng hàm PHP phía trên để biết hàm nào có khả năng được mở và hàm nào chắc chắn không.
Nếu website đang lỗi vì một phần mở rộng chưa bật chứ không phải vì hàm bị chặn, đó là chuyện khác và xử lý theo hướng dẫn bật tắt extension PHP trên DirectAdmin. Hai lỗi này hay bị nhầm vì cùng cho thông báo Call to undefined function.