2010-07-28 35 views
5

thể trùng lặp:
How secure is a HTTP POST?mật khẩu được gửi qua bài đăng an toàn?

Giả sử tôi có một trang đăng nhập trong php mà người dùng được yêu cầu nhập tên và mật khẩu của mình. form method là bài đăng trong trường hợp này.

Bây giờ ai đó (bạn tôi) đã nói với tôi rằng thông tin (tên người dùng và mật khẩu) được nhập và gửi đến máy chủ có thể bị tấn công chỉ bằng cách tìm nạp tiêu đề của trang kết quả được tạo. Vì vậy, bạn nên mã hóa tiêu đề và đó là lý do tại sao HTTPS được sử dụng. Điều này không có ý nghĩa với tôi bởi vì tôi nghĩ thông tin (tên người dùng và mật khẩu) được gửi qua phương thức post hoàn toàn an toàn và chỉ bằng cách lấy tiêu đề, người dùng không thể truy cập vào tên người dùng và mật khẩu.

Bạn của tôi có đúng không? Nếu không có cách nào để làm những việc như vậy cho một người không có quyền truy cập vào mã? Làm cách nào để gửi thông tin cá nhân của tôi qua HTTPS (trang được mã hóa bằng php)?

CHỈNH SỬA:

Phương thức qua get được gửi qua tiêu đề. Đúng? Dữ liệu qua post cũng được gửi qua tiêu đề phải không?

+2

Bạn của bạn là chính xác :) – Sarfraz

+0

@sAc: Dữ liệu thông qua nhận mthod được gửi qua tiêu đề. Đúng? Dữ liệu qua bài đăng có được gửi qua tiêu đề không? –

+0

@ user242265: Có điều đó đúng :) – Sarfraz

Trả lời

10

Không có SSL, dữ liệu được gửi qua POST tương đương với dữ liệu được gửi qua GET hoặc nói cách khác, không được mã hóa chút nào.

+5

Không hoàn toàn tương đương. Nếu được gửi qua GET, nó vẫn ở dạng cleartext ngay cả trên kết nối SSL. – JohnFx

+0

Xin lỗi, tôi có nghĩa là hai câu nói đó là hai ý nghĩ riêng biệt, tôi sẽ chỉnh sửa. –

+1

@JohnFx: Yup - gửi dữ liệu qua GET là mất trí: nó sẽ được lưu trữ trong nhật ký truy cập và các địa điểm khác. – Piskvor

8

Mật khẩu của bạn là không phải bảo mật nếu bạn chỉ gửi bằng POST - vẫn hiển thị và không được mã hóa, mặc dù ít rõ ràng hơn một chút.

Gửi mật khẩu không được mã hóa qua POST là cách không an toàn nhất nhưng vẫn tương đối lành mạnh khi thực hiện việc này. (vâng, có những cách an toàn hơn, nhưng chúng hoàn toàn điên rồ - gửi một mẫu mật khẩu qua GET là an toàn như phát sóng trên TV hoặc in trên báo).

Đây là những gì một GET request điển hình trông giống như:

GET http://somedomain.example.com/path/file?here=are&the=GET&parameters=. 
X-Some-Header: header content 
X-Another-Header: 1 

Dưới đây là một yêu cầu POST tương tự (lưu ý rằng bạn có thể gửi cả hai tham số GET và POST trong một yêu cầu POST):

POST http://somedomain.example.com/path/file?here=are&the=GET&parameters=. 
X-Some-Header: header content 
X-Another-Header: 1 
Content-Length: 40 

with_POST&=the&content=is&here_in=the&request=body 

Như bạn có thể thấy, HTTP là một giao thức thuần hoàn toàn - không có mã hóa được thực hiện trên dữ liệu, vì vậy bất kỳ ai cũng có thể xem và/hoặc sửa đổi nó khi chuyển tiếp. Truy cập vào mã không cần thiết chút nào - chỉ xem lưu lượng và dữ liệu của bạn sẽ ở đó, để mọi người xem (bạn có thể xác minh điều này bằng các công cụ như Wireshark cho phép bạn xem lưu lượng mạng).

Để loại bỏ nhu cầu này để tin tưởng toàn thế giới, HTTPS (S là dành cho an toàn) được tạo, cung cấp mã hóa ("chỉ người gửi và người nhận có thể đọc nó") và xác thực ("máy chủ thực sự là yourserver.example .com, và không phải evilserver.example.net ").

HTTPS là trình bao bọc xung quanh HTTP: nơi có HTTP, ứng dụng khách kết nối với máy chủ web và bắt đầu cuộc trò chuyện, HTTPS đầu tiên thiết lập đường hầm SSL an toàn và giao tiếp HTTP đi qua đó. Việc thiết lập máy chủ HTTPS phức tạp hơn một chút so với HTTP, xem ví dụ: this article.

+0

Dữ liệu thông qua 'get' mthod được gửi qua' header'. Đúng? Dữ liệu thông qua 'bài đăng' cũng được gửi qua' tiêu đề'? –

+1

@ user242265: Không, và không. Dữ liệu GET được gửi trong URL và dữ liệu POST được gửi trong phần thân yêu cầu (không phải tiêu đề). Đã chỉnh sửa câu trả lời của tôi bằng một ví dụ. – Piskvor

2

Trong trường hợp biểu mẫu đăng nhập, tôi sử dụng javascript để băm mật khẩu trước khi gửi biểu mẫu. Nó sẽ làm cho nó khó khăn hơn để có được nó.

+2

Nếu không có một số mã hóa, điều này chỉ an toàn hơn là không làm gì cả. – JohnFx

+2

Tôi đồng ý với JohnFx. Trong trường hợp này, * băm * của mật khẩu bây giờ là "mật khẩu". Ai đó vẫn có thể nắm bắt được băm và gửi lại băm sau, cho phép họ truy cập. –

+1

@Adam Paynter: Không phải nếu bạn sử dụng nonce; nhưng vì đây là tất cả trong bản rõ, kẻ tấn công có thể dễ dàng chỉ giả mạo phản hồi máy chủ ban đầu và gửi trang giả mạo của riêng mình mà gửi đến nơi khác. – Piskvor

0

Từ Wikipedia

HTTP là không có bảo đảm và có thể man-in-the-middle và nghe trộm tấn công mà có thể cho những kẻ tấn công đạt được quyền truy cập vào tài khoản trang web và thông tin nhạy cảm. HTTPS là được thiết kế để chịu được các cuộc tấn công như vậy và được coi là an toàn đối với các cuộc tấn công như vậy.

Nếu bạn lo lắng về việc ai đó chặn dữ liệu của mình, hãy sử dụng HTTPS.

+0

Bạn vẫn có thể khởi động các cuộc tấn công trung gian trên các kết nối SSL. Ví dụ: nếu tôi có quyền truy cập vào mạng của máy chủ hoặc máy khách thì nó trở thành một vấn đề tầm thường để thực hiện tấn công ngộ độc ARP, do đó chuyển hướng lưu lượng truy cập thông qua máy tính của tôi và tạo proxy. Vì vậy, nếu bạn truy cập "https://gmail.com", ví dụ máy tính của tôi sau đó sẽ yêu cầu trang web đó và chuyển tiếp nó tới máy tính đích. Nếu người dùng thông minh và giữ một mắt trên khóa nhỏ mà hầu hết các trình duyệt hiển thị ngay bây giờ họ sẽ nhận thấy nó là tự ký, không được ký bởi Google. Không có nhiều người chú ý đến giữa phiên. –

+0

Cách thức hoạt động, proxy của bạn không thể giả vờ là gmail.com vì nó không có khóa riêng tư. Đây hoàn toàn là trường hợp SSL phải ngăn chặn. – jcoder

+0

@Peter Hanneman: tự ký -> không có trong danh sách CA của trình duyệt -> cảnh báo "chứng chỉ không hợp lệ", không phải "chỉ là biểu tượng khóa"; OTOH @JB: 1. proxy phục vụ trang đăng nhập HTTPS gmail giả mạo 2. trình duyệt ném cảnh báo đáng sợ lớn về "chứng chỉ không hợp lệ" 3. nhấp chuột của người dùng "ok ok yes yes cho phép ok" mà không cần đọc hộp thoại, chỉ để thực hiện cảnh báo đáng sợ biến mất. 4. Lợi nhuận !!! – Piskvor

0

Tôi tin rằng tập lệnh php gửi biểu mẫu và biểu mẫu cần phải nằm trong thư mục trên máy chủ web được thiết lập bằng SSL. Bạn cũng phải bật chứng chỉ SSL cho trang web đó.

1

tôi nghĩ các thông tin (tên người dùng và mật khẩu ) gửi qua đường bưu phương pháp là hoàn toàn an toàn

sai. Dữ liệu được gửi qua POST thực tế là không an toàn khi được gửi qua GET. Sự khác biệt duy nhất (biên) là dữ liệu GET hơi "có thể truy cập" hơn, thông qua lịch sử url và có thể là nhật ký. Nhưng nếu ai đó có thể đánh hơi liên kết, anh ta có thể gián điệp người dùng và mật khẩu dễ dàng gửi qua yêu cầu http, (POST hoặc GET) trừ khi SSL (https: //) được sử dụng.

+0

Dữ liệu thông qua nhận được mthod được gửi qua tiêu đề. Đúng? Dữ liệu qua bài đăng có được gửi qua tiêu đề không? –

+0

Dữ liệu POST không được gửi trong tiêu đề http. Điều đó tạo ra sự khác biệt về khía cạnh bảo mật. – leonbloy

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