Nói về “register_globals” trên PHP v5.4

Nguyễn Thành Luân 3 phút đọc

Dạo gần đây chúng tôi thường xuyên nhận được 1 số thông báo của Khách hàng về tình trạng website PHP sau khi được upgrage từ PHPv5.2, PHPv5.3, … lên thành PHPv5.4, thường bị các lỗi phát sinh do không lấy được giá trị POST, GET, SESSION, SERVER, COOKIE.

Chúng ta hãy cùng tìm hiểu nguyên nhân và xây dựng giải pháp khắc phục vấn đề này nhé !

Tôi có 1 ví dụ cụ thể nhất để các bạn dễ hình dung : trường hợp chúng ta mã hóa dữ liệu form enctype=”multipart/form-data” để submit thì website báo lỗi nhưng form không mã hóa thì hoạt động bình thường. Tại sao lại vậy ?

– Nguyên nhân là do register_globals chưa được kích hoạt >>> không lấy được POST value.

– Do đó những Web form khi đưa một giá trị theo phương thức POST (mã hoá enctype=”multipart/form-data”) sẽ phát sinh lỗi ERROR 500 vì không đăng ký được biến đã định nghĩa.

Để khắc phục tình trạng này, chúng ta có thể lựa chọn 1 trong 2 giải pháp sau :

1. Thay đổi version PHP ( <= PHPv5.3 ) để sử dụng register_globals

Chúng tôi hay bất kì nhà cung cấp dịch vụ Web-hosting nào khác cũng sẵn sàng hỗ trợ thay đổi server hosting có version PHP tương ứng với nhu cầu của bạn.

2. Tiếp tục PHPv5.4 trở lên

– Bạn có thể định nghĩa đoạn code sau ngay đầu trang web form :

if (!ini_get('register_globals')) {
            $types_to_register = array('GET','POST','COOKIE','SESSION','SERVER');
            foreach ($types_to_register as $type)
                        if (@count(${'HTTP_' . $type . '_VARS'}) > 0)
                                    extract(${'HTTP_' . $type . '_VARS'}, EXTR_OVERWRITE);
}
– Đoạn code trên thay thế register_globals đã không còn hỗ trợ trên PHPv5.4. Đây cũng là giải pháp tốt nhất để coder tháo gỡ được các lỗi không những liên quan đến POST/GET mà còn fix được các lỗi từ SESSION, SERVER, COOKIE nữa.