2009-09-14 37 views
8

Tôi chỉ thấy mã này khi nghiên cứu mã nguồn wordpress (PHP), Bạn có thể thấy chúng hợp nhất/biến tất cả các giá trị nhận và gửi thành 1 mảng yêu cầu.

Bây giờ như tôi đã biết, $ _GET và $ _POST đã có sẵn bằng cách gọi $ _REQUEST WITHOUT sử dụng hàm array_merge(), vì vậy bất kỳ ý tưởng nào tại sao chúng sẽ làm điều này?

$_REQUEST = array_merge($_GET, $_POST); 

Trả lời

17

Đó là do mặc định $_REQUEST là sự hợp nhất của $_GET, $_POST$_COOKIE. Ngoài ra, thứ tự các biến superglobals này được hợp nhất thành $_REQUEST phụ thuộc vào thiết lập ini variables_order và của PHP 5.3.0 cũng có thể bị ảnh hưởng bởi request_order. Vì vậy, dự đoán của tôi là nhà phát triển muốn đảm bảo $_REQUEST chỉ bao gồm $_GET$_POST, được hợp nhất theo thứ tự cụ thể đó, nếu anh ấy không có quyền truy cập vào cài đặt ini (trên máy chủ chia sẻ chẳng hạn). Bạn thấy, variables_orderrequest_order không thể định cấu hình trên cơ sở mỗi tập lệnh.

HTH

3

Nếu bạn có biến GET và biến POST có cùng tên, nó sẽ chọn biến POST trên biến GET.

Ngoài ra, bạn có thể không muốn cookie trong biến $ _REQUEST.

+2

Thực ra, nó sẽ chọn $ _POST trên $ _GET. hướng dẫn array_merge: http://www.php.net/manual/en/function.array-merge.php – Havenard

+0

"[...] nó sẽ chọn biến GET trên POST". Đo không phải sự thật; Đó là một cách khác. Giá trị của các mảng sau cùng với các khóa tương ứng sẽ ghi đè các giá trị cũ. Xem http://www.php.net/array_merge –

+0

Thông tin cố định. –

1

Tôi không biết lý do tại sao nó được thực hiện khi bạn nhìn thấy nó, nhưng tôi đã thấy điều đó được thực hiện trước khi xử lý một số đã được thực hiện trên các giá trị trong một mảng này hoặc mảng khác và bạn muốn kết hợp những thay đổi đó lại thành $ _REQUEST để bất kỳ ai sử dụng $ _REQUEST sẽ nhận được các thay đổi mặc dù chúng đã được thực hiện cho các biến $ _POST hoặc $ _GET.

Điều này xuất hiện trong các tình huống như Wordpress vì các nhà phát triển plugin có thể sử dụng bất kỳ biến nào để truy cập dữ liệu và lõi Wordpress cần đảm bảo tất cả chúng đều có cùng dữ liệu.

Tại sao bạn không muốn thực hiện điều đó trực tiếp với $ _REQUEST? Bởi vì $ _REQUEST chứa một tấn thông tin bổ sung mà $ _POST và $ _GET không có. Bạn có thể không muốn áp dụng quá trình xử lý của mình cho tất cả các bit phụ đó.

6

$_REQUEST chứa nội dung của $_GET, $_POST$_COOKIE mảng theo mặc định. Có thể họ muốn loại trừ các biến COOKIE khỏi nó, vì nó thường không được sử dụng cho mục đích đó.

+0

+1 Chỉ cần viết cùng một thứ. – Havenard

+0

ya, có lẽ vì lý do bảo mật, họ muốn loại bỏ COOKIES khỏi $ _REQUEST, có thể sử dụng GET và POST cùng nhau. 1 cho tâm trí tuyệt vời suy nghĩ như nhau. – mauris

+0

có, đây là một vector tấn công XSS phổ biến, vì JavaScript độc hại có thể đặt các cookie cookie mà không cần người dùng chú ý và thứ tự GPC mặc định của PHP có nghĩa là các giá trị cookie này sẽ ghi đè bất cứ điều gì người dùng nhập vào biểu mẫu. – joelhardi

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