Bảo mật tham số URL PHP _GET

Giao thức truyền tải siêu văn bản (HTTP) được thiết kế để cho phép liên lạc giữa máy khách và máy chủ

HTTP hoạt động như một giao thức phản hồi yêu cầu giữa máy khách và máy chủ

Ví dụ. Máy khách (trình duyệt) gửi yêu cầu HTTP đến máy chủ; . Phản hồi chứa thông tin trạng thái về yêu cầu và cũng có thể chứa nội dung được yêu cầu


  • ĐƯỢC
  • BƯU KIỆN
  • ĐẶT
  • CÁI ĐẦU
  • XÓA BỎ
  • TÙY CHỌN
  • LIÊN KẾT
  • DẤU VẾT

Hai phương thức HTTP phổ biến nhất là. NHẬN và ĐĂNG


Phương thức NHẬN

GET được sử dụng để yêu cầu dữ liệu từ một tài nguyên được chỉ định

Lưu ý rằng chuỗi truy vấn (cặp tên/giá trị) được gửi trong URL của yêu cầu GET

/test/demo_form. php?name1=value1&name2=value2

Một số lưu ý về yêu cầu GET

  • Yêu cầu GET có thể được lưu trữ
  • Yêu cầu GET vẫn còn trong lịch sử trình duyệt
  • Yêu cầu GET có thể được đánh dấu
  • Yêu cầu GET không bao giờ được sử dụng khi xử lý dữ liệu nhạy cảm
  • Yêu cầu GET có giới hạn độ dài
  • Yêu cầu GET chỉ được sử dụng để yêu cầu dữ liệu (không sửa đổi)

Phương thức ĐĂNG

POST được sử dụng để gửi dữ liệu đến máy chủ để tạo/cập nhật tài nguyên

Dữ liệu được gửi đến máy chủ bằng POST được lưu trữ trong phần thân yêu cầu của yêu cầu HTTP

ĐĂNG /test/demo_form. php HTTP/1. 1
Máy chủ. w3schools. com

name1=value1&name2=value2

Một số lưu ý về yêu cầu POST

  • Yêu cầu POST không bao giờ được lưu trữ
  • Yêu cầu POST không còn trong lịch sử trình duyệt
  • Yêu cầu POST không thể được đánh dấu
  • Yêu cầu POST không có hạn chế về độ dài dữ liệu

So sánh NHẬN với. BƯU KIỆN

Bảng sau đây so sánh hai phương thức HTTP. NHẬN và ĐĂNG

Nút GETPOSTBACK/ReloadHarmlessDữ liệu sẽ được gửi lại (trình duyệt sẽ thông báo cho người dùng rằng dữ liệu sắp được gửi lại) Đã đánh dấu Có thể đánh dấu Không thể đánh dấu Đã lưu vào bộ đệm Có thể lưu vào bộ đệm Không lưu vào bộ đệm Loại ứng dụng mã hóa/x-www-form-urlencodedapplication/x-www-form . Sử dụng mã hóa nhiều phần cho dữ liệu nhị phânLịch sửCác tham số vẫn còn trong lịch sử trình duyệtCác tham số không được lưu trong lịch sử trình duyệtHạn chế về độ dài dữ liệuCó, khi gửi dữ liệu, phương thức GET sẽ thêm dữ liệu vào URL; . Dữ liệu nhị phân cũng được phépSecurityGET kém an toàn hơn so với POST vì dữ liệu được gửi là một phần của URL

Không bao giờ sử dụng GET khi gửi mật khẩu hoặc thông tin nhạy cảm khác

POST an toàn hơn một chút so với GET vì các tham số không được lưu trữ trong lịch sử trình duyệt hoặc trong nhật ký máy chủ webVisibilityData hiển thị cho mọi người trong URLDữ liệu không được hiển thị trong URL



Phương pháp PUT

PUT được sử dụng để gửi dữ liệu đến máy chủ để tạo/cập nhật tài nguyên

Sự khác biệt giữa POST và PUT là các yêu cầu PUT là bình thường. Nghĩa là, gọi cùng một yêu cầu PUT nhiều lần sẽ luôn tạo ra cùng một kết quả. Ngược lại, gọi một yêu cầu POST liên tục có tác dụng phụ là tạo cùng một tài nguyên nhiều lần


Phương pháp HEAD

HEAD gần giống với GET, nhưng không có phần thân phản hồi

Nói cách khác, nếu GET /users trả về danh sách người dùng, thì HEAD /users sẽ đưa ra yêu cầu tương tự nhưng sẽ không trả về danh sách người dùng

Các yêu cầu HEAD rất hữu ích để kiểm tra xem yêu cầu GET sẽ trả về cái gì trước khi thực sự thực hiện yêu cầu GET - như trước khi tải xuống một tệp lớn hoặc nội dung phản hồi


Phương thức XÓA

Phương thức DELETE xóa tài nguyên đã chỉ định


Phương pháp PATCH

Phương thức PATCH được sử dụng để áp dụng các sửa đổi một phần cho tài nguyên


Phương pháp TÙY CHỌN

Phương thức TÙY CHỌN mô tả các tùy chọn giao tiếp cho tài nguyên đích


Phương thức KẾT NỐI

Phương thức CONNECT được sử dụng để bắt đầu liên lạc hai chiều (đường hầm) với tài nguyên được yêu cầu


Phương pháp TRACE

Phương pháp TRACE được sử dụng để thực hiện kiểm tra lặp lại thông báo kiểm tra đường dẫn cho tài nguyên đích (hữu ích cho mục đích gỡ lỗi)

PHP $_GET là một biến siêu toàn cầu PHP được sử dụng để thu thập dữ liệu biểu mẫu sau khi gửi biểu mẫu HTML với method="get"

$_GET cũng có thể thu thập dữ liệu được gửi trong URL

Giả sử chúng ta có một trang HTML chứa một siêu liên kết với các tham số


Kiểm tra $GET


Khi người dùng nhấp vào liên kết "Test $GET", các thông số "subject" và "web" được gửi đến "test_get. php", và sau đó bạn có thể truy cập các giá trị của chúng trong "test_get. php" với $_GET

Sự khác biệt cơ bản giữa METHOD="GET" và METHOD="POST" là chúng tương ứng với các yêu cầu HTTP khác nhau, như được định nghĩa trong HTTP. Quá trình gửi cho cả hai phương pháp bắt đầu theo cùng một cách - a được trình duyệt xây dựng và sau đó được mã hóa theo cách được chỉ định bởi thuộc tính enctype. Đối với METHOD="POST, thuộc tính mã hóa có thể là nhiều phần/biểu mẫu dữ liệu hoặc ứng dụng/x-www-form-urlencoding, trong khi đối với METHOD="GET", chỉ cho phép ứng dụng/x-www-form-urlencoding. Tập dữ liệu biểu mẫu này sau đó được truyền đến máy chủ

Để gửi biểu mẫu bằng METHOD="GET", trình duyệt sẽ tạo một URL bằng cách lấy giá trị của thuộc tính hành động, nối thêm ? . Sau đó, trình duyệt xử lý URL này như thể theo một liên kết (hoặc như thể người dùng đã nhập trực tiếp URL). Trình duyệt chia URL thành các phần và nhận ra một máy chủ, sau đó gửi tới máy chủ đó một yêu cầu GET với phần còn lại của URL làm đối số. Máy chủ lấy nó từ đó. Lưu ý rằng quy trình này có nghĩa là dữ liệu biểu mẫu được giới hạn ở mã ASCII. Cần đặc biệt cẩn thận để mã hóa và giải mã các loại ký tự khác khi chuyển chúng qua URL ở định dạng ASCII

Việc gửi biểu mẫu có METHOD="POST" khiến yêu cầu POST được gửi, sử dụng giá trị của thuộc tính hành động và thông báo được tạo theo loại nội dung được chỉ định bởi thuộc tính enctype

Ưu và nhược điểm

Vì dữ liệu biểu mẫu được gửi như một phần của URL khi GET được sử dụng --

  • Dữ liệu biểu mẫu được giới hạn ở mã ASCII. Cần đặc biệt cẩn thận để mã hóa và giải mã các loại ký tự khác khi chuyển chúng qua URL ở định dạng ASCII. Mặt khác, dữ liệu nhị phân, hình ảnh và các tệp khác đều có thể được gửi thông qua METHOD="POST"
  • Tất cả dữ liệu biểu mẫu đã điền được hiển thị trong URL. Hơn nữa, nó còn được lưu trữ trong lịch sử/nhật ký duyệt web của người dùng cho trình duyệt. Những sự cố này làm cho GET kém an toàn hơn
  • Tuy nhiên, một lợi thế của dữ liệu biểu mẫu được gửi như một phần của URL là người ta có thể đánh dấu các URL và trực tiếp sử dụng chúng và bỏ qua hoàn toàn quy trình điền biểu mẫu
  • Có giới hạn về lượng dữ liệu biểu mẫu có thể được gửi do độ dài URL bị giới hạn
  • Script kiddies có thể dễ dàng vạch trần các lỗ hổng trong hệ thống để hack nó. Ví dụ: Citibank bị hack do thay đổi số tài khoản trong chuỗi URL. [1] Tất nhiên, các tin tặc hoặc nhà phát triển web có kinh nghiệm có thể để lộ các lỗ hổng như vậy ngay cả khi POST được sử dụng; . Nói chung, máy chủ phải nghi ngờ bất kỳ dữ liệu nào do máy khách gửi và đề phòng các Tham chiếu đối tượng trực tiếp không an toàn

Sự khác biệt trong xử lý phía máy chủ

Về nguyên tắc, việc xử lý dữ liệu biểu mẫu đã gửi phụ thuộc vào việc nó được gửi bằng METHOD="GET" hay METHOD="POST". Do dữ liệu được mã hóa theo nhiều cách khác nhau nên cần có các cơ chế giải mã khác nhau. Do đó, nói chung, việc thay đổi PHƯƠNG PHÁP có thể cần phải thay đổi tập lệnh xử lý việc gửi. Ví dụ: khi sử dụng giao diện CGI, tập lệnh sẽ nhận dữ liệu trong biến môi trường (QUERYSTRING) khi GET được sử dụng. Nhưng khi POST được sử dụng, dữ liệu biểu mẫu được truyền vào luồng đầu vào tiêu chuẩn (stdin) và số byte cần đọc được cung cấp bởi tiêu đề Độ dài nội dung

Điều gì xảy ra khi các biến GET và POST xung đột?

Trong một số ngôn ngữ như PHP, thông tin từ các tham số GET và POST, ngoài việc có sẵn một cách riêng lẻ, còn được kết hợp thành một biến tiện ích e. g. , $_REQUEST trong PHP. Nếu có xung đột—tôi. e. , cùng một tên tham số được sử dụng với các giá trị khác nhau trong GET và POST—sau đó xung đột được giải quyết bằng các quy tắc nhất định. Trong trường hợp của PHP, quyền ưu tiên được quyết định bởi chỉ thị cấu hình. Thứ tự mặc định là EGPCS (môi trường, GET, POST, Cookie, Server). Điều này có nghĩa là biến trong $_GET được ưu tiên hơn $_POST, do đó biến này được ưu tiên hơn $_COOKIE

Cách sử dụng được đề xuất

GET được khuyến nghị khi gửi các biểu mẫu "bình thường" - những biểu mẫu không 'làm thay đổi đáng kể trạng thái của thế giới'. Nói cách khác, các biểu mẫu chỉ liên quan đến truy vấn cơ sở dữ liệu. Một quan điểm khác là một số truy vấn tạm thời sẽ có tác dụng tương tự như một truy vấn đơn lẻ. Nếu có liên quan đến cập nhật cơ sở dữ liệu hoặc các hành động khác như kích hoạt email, thì nên sử dụng POST

Từ blog nhà phát triển Dropbox

trình duyệt không biết chính xác chức năng của một biểu mẫu HTML cụ thể, nhưng nếu biểu mẫu được gửi qua HTTP GET, thì trình duyệt sẽ biết rằng sẽ an toàn để tự động thử gửi lại nếu có lỗi mạng. Đối với các biểu mẫu sử dụng HTTP POST, việc thử lại có thể không an toàn nên trình duyệt sẽ yêu cầu người dùng xác nhận trước

Yêu cầu "NHẬN" thường được lưu vào bộ đệm, trong khi yêu cầu "POST" khó có thể được. Đối với các hệ thống truy vấn, điều này có thể có tác động hiệu quả đáng kể, đặc biệt nếu các chuỗi truy vấn đơn giản, vì các bộ đệm có thể phục vụ các truy vấn thường xuyên nhất

Trong một số trường hợp nhất định, nên sử dụng POST ngay cả đối với các truy vấn bình thường

  • Nếu dữ liệu biểu mẫu chứa các ký tự không phải ASCII (chẳng hạn như các ký tự có dấu), thì về nguyên tắc, METHOD="GET" không thể áp dụng được, mặc dù nó có thể hoạt động trong thực tế (chủ yếu cho )
  • Nếu tập dữ liệu biểu mẫu lớn - giả sử, hàng trăm ký tự - thì METHOD="GET" có thể gây ra sự cố thực tế với việc triển khai không thể xử lý các URL dài đó
  • Bạn có thể muốn tránh METHOD="GET" để làm cho người dùng ít nhìn thấy biểu mẫu hoạt động hơn, đặc biệt là để làm cho các trường "ẩn" (INPUT TYPE="HIDDEN") ẩn hơn bằng cách không xuất hiện trong URL. Nhưng ngay cả khi bạn sử dụng các trường ẩn với METHOD="POST", chúng vẫn sẽ xuất hiện trong mã nguồn HTML

Còn HTTPS thì sao?

Cập nhật ngày 15 tháng 5 năm 2015. Cụ thể là khi sử dụng HTTPS (HTTP qua TLS/SSL), POST có cung cấp bảo mật nào cao hơn GET không?

Đây là một câu hỏi thú vị. Giả sử bạn thực hiện một yêu cầu GET tới một trang web

 GET https://www.example.com/login.php?user=mickey&passwd=mini

Giả sử rằng kết nối Internet của bạn đang bị theo dõi, thông tin nào về yêu cầu này sẽ có sẵn cho kẻ rình mò?

Câu trả lời là không. Nếu bạn thực hiện một yêu cầu GET như vậy, kẻ tấn công sẽ chỉ biết những thông tin sau khi theo dõi lưu lượng truy cập web của bạn

  1. Thực tế là bạn đã thực hiện kết nối HTTPS
  2. Tên máy chủ - www. ví dụ. com
  3. Tổng chiều dài của yêu cầu
  4. Độ dài của câu trả lời

Phần đường dẫn của URL — tôi. e. , trang thực tế được yêu cầu, cũng như các tham số chuỗi truy vấn — được bảo vệ (được mã hóa) khi chúng "qua dây" i. e. , đang trên đường đến máy chủ đích. Tình hình hoàn toàn giống với các yêu cầu POST

Tuy nhiên, phương thức POST vẫn giữ được một lợi thế ngay cả trong trường hợp HTTPS. Các máy chủ web có xu hướng ghi lại toàn bộ URL được yêu cầu ở dạng văn bản thuần túy trong nhật ký truy cập của chúng; . Điều này áp dụng bất kể HTTP hay HTTPS được sử dụng