Tôi đã tìm hiểu một số bài đăng của nhóm tin trên PHP Internals và tìm thấy một cuộc thảo luận thú vị về chủ đề này. Chủ đề ban đầu là về một cái gì đó khác, nhưng nhận xét của Stefan Esser, một chuyên gia bảo mật (nếu không phải là ) trong thế giới PHP đã chuyển cuộc thảo luận về các tác động bảo mật của việc sử dụng $ _REQUEST cho một số bài đăng.
Trích dẫn Stefan Esser trên PHP Internals
$ _REQUEST là một trong những điểm yếu thiết kế lớn nhất trong PHP. Mọi ứng dụng sử dụng $ _REQUEST có lẽ rất dễ gặp phải các vấn đề về Truy vấn Yêu cầu Trang web Chậm Chậm. (Về cơ bản, điều này có nghĩa là nếu cookie có tên (tuổi) tồn tại, nó sẽ luôn ghi đè lên nội dung GET / POST và do đó các yêu cầu không mong muốn sẽ được thực hiện)
và trả lời sau cho cùng một chủ đề
Nó không phải là về thực tế là ai đó có thể giả mạo GET, POST; Các biến COOKIE. Đó là thực tế là COOKIEs sẽ ghi đè dữ liệu GET và POST trong REQUEST.
Do đó, tôi có thể lây nhiễm vào trình duyệt của bạn một cookie ví dụ: action = logout và kể từ ngày đó, bạn không thể sử dụng ứng dụng này nữa vì REQUEST [action] sẽ bị đăng xuất vĩnh viễn (cho đến khi bạn xóa cookie theo cách thủ công).
Và để lây nhiễm COOKIE cho bạn rất đơn giản ...
a) Tôi có thể sử dụng XSS vuln trong bất kỳ ứng dụng nào trên tên miền phụ
b) Đã từng thử đặt cookie cho * .co.uk hoặc * .co.kr khi bạn sở hữu một tên miền duy nhất ở đó?
c) Miền chéo khác theo bất kỳ cách nào ...
Và nếu bạn tin rằng đây không phải là vấn đề thì tôi có thể nói với bạn rằng có một khả năng đơn giản là đặt cookie fe * .co.kr dẫn đến một số phiên bản PHP chỉ trả về các trang trắng. Hãy tưởng tượng: Chỉ một cookie duy nhất để giết tất cả các trang PHP trong * .co.kr
Và bằng cách đặt ID phiên bất hợp pháp trong cookie hợp lệ cho * .co.kr trong biến có tên + PHPSESSID = lậu, bạn vẫn có thể DOS cho mọi ứng dụng PHP ở Hàn Quốc bằng các phiên PHP ...
Cuộc thảo luận tiếp tục cho một vài bài đăng nữa và rất thú vị để đọc.
Như bạn có thể thấy, vấn đề chính của $ _REQUEST không phải là nó có dữ liệu từ $ _GET và $ _POST, mà còn từ $ _COOKIE. Một số người khác trong danh sách đề nghị thay đổi thứ tự mà $ _REQUEST được điền, ví dụ: điền nó bằng $ _COOKIE trước, nhưng điều này có thể dẫn đến nhiều vấn đề tiềm ẩn khác, chẳng hạn như với xử lý Phiên .
Bạn có thể $ _COOKIES hoàn toàn omit từ $ mặc dù toàn cầu _REQUEST, do đó nó không được ghi đè bởi bất kỳ của các mảng khác (trong thực tế, bạn có thể giới hạn nó đến bất kỳ sự kết hợp của nội dung tiêu chuẩn của nó, giống như hướng dẫn PHP trên variable_order thiết lập ini nói với chúng tôi:
biến_order Đặt thứ tự phân tích cú pháp biến EGPCS (Môi trường, Nhận, Đăng, Cookie và Máy chủ). Ví dụ: nếu biến_order được đặt thành "SP" thì PHP sẽ tạo siêu cầu thủ $ _SERVER và $ _POST, nhưng không tạo $ _ENV, $ _GET và $ _COOKIE. Đặt thành "" có nghĩa là không có siêu cầu thủ nào được đặt.
Nhưng một lần nữa, bạn cũng có thể cân nhắc việc không sử dụng $ _REQUEST hoàn toàn, đơn giản vì trong PHP, bạn có thể truy cập Môi trường, Nhận, Đăng, Cookie và Máy chủ trong phạm vi toàn cầu của riêng chúng và có ít véc tơ tấn công hơn. Bạn vẫn phải khử trùng dữ liệu này, nhưng đó là một điều ít phải lo lắng hơn.
Bây giờ bạn có thể tự hỏi, tại sao $ _REQUEST lại tồn tại và tại sao nó không bị xóa. Điều này cũng được hỏi trên PHP Internals. Trích dẫn Rasmus Lerdorf về Tại sao $ _REQUEST tồn tại? trên PHP Internals
Càng loại bỏ nhiều thứ như thế này, mọi người càng khó chuyển nhanh sang các phiên bản PHP mới hơn, nhanh hơn và an toàn hơn. Điều đó gây ra sự thất vọng cho mọi người hơn là một vài tính năng kế thừa "xấu xí". Nếu có một lý do kỹ thuật, hiệu suất hoặc bảo mật phù hợp, thì chúng ta cần xem xét kỹ lưỡng. Trong trường hợp này, điều chúng ta nên xem xét không phải là chúng ta có nên xóa $ _REQUEST hay không mà là liệu chúng ta có nên xóa dữ liệu cookie khỏi nó hay không. Nhiều cấu hình đã làm điều đó, bao gồm tất cả cấu hình của riêng tôi và có lý do bảo mật hợp lệ mạnh mẽ để không bao gồm cookie trong $ _REQUEST. Hầu hết mọi người sử dụng $ _REQUEST có nghĩa là NHẬN hoặc ĐĂNG, không nhận ra rằng nó cũng có thể chứa cookie và những kẻ xấu như vậy có thể thực hiện một số thủ thuật chèn cookie và phá vỡ các ứng dụng ngây thơ.
Dù sao, hy vọng rằng làm sáng tỏ một số điều.