2008-12-15 38 views
8

Bên cạnh thực tế là $_REQUEST lần đọc từ cookie, có bất kỳ lý do nào khiến tôi nên sử dụng $_GET$_POST thay vì $_REQUEST không? Lý do và lý do thực tế để làm như vậy là gì?

Trả lời

8

Tôi sử dụng $ _REQUEST khi tôi chỉ muốn một số dữ liệu nhất định từ người dùng trả về một số dữ liệu nhất định.

Không bao giờ sử dụng $ _REQUEST khi yêu cầu sẽ có tác dụng phụ. Các yêu cầu tạo ra các hiệu ứng phụ phải là POST (vì lý do ngữ nghĩa và cũng vì các công cụ CSRF cơ bản, một thẻ img giả có thể nhấn bất kỳ điểm cuối GET nào mà không cần người dùng biết).

$ _GET nên được sử dụng khi GET hoặc POSTING vào một trang sẽ tạo ra các kết quả khác nhau.

+4

Xin chúc mừng, bạn vừa nhận được câu trả lời được chấp nhận đầu tiên :) Chào mừng bạn đến với stackoverflow.com! – Tom

4

Việc sử dụng $ _REQUEST mở một số vectơ tấn công vào ứng dụng của bạn nơi các biến có thể bị ghi đè ở nơi bạn không muốn điều đó xảy ra.

Cũng xem xét đơn đặt hàng GPC (Nhận, Đăng, Cookie) trên đó $ _REQUEST sẽ được điền.

tức là một yêu cầu với:

$_GET['foo'] = 'bar' 
$_POST['foo'] = 'baz' 

sẽ dẫn đến

$_REQUEST['foo'] == 'bar'

+0

Lưu ý rằng bạn có thể thay đổi thứ tự Biến yêu cầu được điền vào, nếu bạn kiểm soát php.ini – gnud

+1

Chỉ có tôi hoặc POST sẽ đến sau khi GET trong ví dụ của bạn, do đó nội dung của biến bị ghi đè? Không chắc chắn, đó là lý do tại sao tôi yêu cầu ... – Franz

5

Bạn đã đưa ra một trong những câu trả lời, vì vậy tôi sẽ cung cấp cho khác:

Đó là nhiều hơn một sự lựa chọn phong cách. Ví dụ: bạn thường không muốn thông tin thay đổi trạng thái trên máy chủ để có thể lưu vào bộ nhớ cache, vì vậy bạn có thể muốn hạn chế nó thành các biến số $_POST.

+0

Câu trả lời hay! Tôi hy vọng sẽ thấy nhiều hơn trong số này. – Tom

2

sự không an toàn thường được đề cập là $ _REQUEST là không có thật. tất cả những cách này để lấy dữ liệu từ người dùng, có một máy không được bảo mật. bạn luôn phải vệ sinh đầu vào, vì vậy không có lợi thế bảo mật thực sự nào khi sử dụng một trong hai.

chỉ có ý nghĩa nếu bạn có các cách sử dụng khác nhau cho các giá trị có cùng tên trên các kênh khác nhau. trong trường hợp đó, bạn nên đổi tên một số trong số đó.

+0

Rất đúng, mọi người muốn hét lên yêu cầu đó là lỗ hổng bảo mật lớn, nhưng ngay cả GET và POST cũng không an toàn, dễ dàng xen vào các bit nghịch ngợm, bạn cần phải luôn luôn khử trùng tất cả dữ liệu, ngay cả những thứ xuất phát từ cơ sở dữ liệu của bạn . – TravisO

8

Bên cạnh thực tế là $ _REQUEST đọc từ tập tin cookie

Bên cạnh thực tế rằng đây là undefined (Đó là cấu hình về mặt kĩ mỗi cài đặt), vấn đề sử dụng $_REQUEST là nó quá đơn giản hoá mọi thứ . Có (hoặc phải là) sự khác biệt ngữ nghĩa giữa yêu cầu GET và yêu cầu POST. Vì vậy, nó sẽ quan trọng đối với ứng dụng của bạn nếu bạn nhận được đầu vào từ một nguồn này hoặc nguồn khác. Đây là cách giao thức HTTP được định nghĩa, vì vậy bằng cách bỏ qua nó, bạn đang phá hoại giao thức, điều này làm cho ứng dụng của bạn ít tương thích hơn. Đó là cùng một đối số kiểu có thể được thực hiện để sử dụng đánh dấu HTML ngữ nghĩa, thay vì đánh dấu theo định hướng trình bày. Hay nói chung, theo ý định của một giao thức hơn là chỉ làm bất cứ điều gì làm việc trong tình huống cụ thể.

2

HTTP GET là ngữ nghĩa có nghĩa là được sử dụng để tìm nạp một trang, trong khi POST có thể được lập luận rằng khi được sử dụng, bạn mong muốn rằng một số loại trạng thái được thay đổi.

Ví dụ: có một kỳ vọng rằng việc sử dụng GET với cùng thông số nhiều lần mang lại kết quả tương tự, trong khi sử dụng POST, chúng có thể không.

Không sử dụng POST khi bạn nên mang lại các vấn đề. Tôi nghĩ rằng các thư viện AJAX của Ruby on Rails đã sử dụng GET thay vì POST, và dẫn đến rất nhiều dữ liệu bị mất khi bị các trình thu thập dữ liệu web chạm vào.

Do đó, có thể bạn nên tránh sử dụng $ _REQUEST. Bạn nên biết mục đích của trang, và quyết định cách trả lời yêu cầu GET và cách trả lời yêu cầu POST.

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