URL https với thông số mã thông báo: nó an toàn như thế nào?


88

Trên trang web của chúng tôi, chúng tôi cung cấp cho người dùng mô phỏng dựa trên thông tin cá nhân của họ (được cung cấp thông qua biểu mẫu). Chúng tôi muốn cho phép họ lấy lại kết quả mô phỏng sau này, nhưng không buộc họ phải tạo tài khoản đăng nhập / mật khẩu.

Chúng tôi đã nghĩ đến việc gửi cho họ một email có liên kết, từ đó họ có thể lấy lại kết quả của mình. Tuy nhiên, theo lẽ tự nhiên, chúng tôi phải bảo mật URL này, vì dữ liệu cá nhân đang bị đe dọa.

Vì vậy, chúng tôi đang có ý định chuyển một mã thông báo (như sự kết hợp 40 ký tự của các chữ cái và chữ số, hoặc MD5 Hash) trong URL và sử dụng SSL.

Cuối cùng, họ sẽ nhận được một email như vậy:

Xin chào,
Lấy lại kết quả của bạn trên https://www.example.com/load_simulation?token=uZVTLBCWcw33RIhvnbxTKxTxM2rKJ7YJrwyUXhXn

Bạn nghĩ gì về nó? Nó có đủ an toàn không? Bạn sẽ khuyên tôi điều gì cho việc tạo mã thông báo? Điều gì về việc chuyển các tham số URL trong một yêu cầu https?


Câu trả lời:


97

SSL sẽ bảo vệ các tham số truy vấn khi chuyển tiếp; tuy nhiên, bản thân email không an toàn và email có thể bị trả lại dọc theo bất kỳ số lượng máy chủ nào trước khi đến đích.

Cũng tùy thuộc vào máy chủ web của bạn, URL đầy đủ có thể được ghi vào các tệp nhật ký của nó. Tùy thuộc vào mức độ nhạy cảm của dữ liệu, bạn có thể không muốn nhân viên CNTT của mình có quyền truy cập vào tất cả các mã thông báo.

Ngoài ra, URL với chuỗi truy vấn sẽ được lưu trong lịch sử người dùng của bạn, cho phép những người dùng khác trên cùng một máy truy cập vào URL.

Cuối cùng và điều làm cho điều này trở nên rất không an toàn là, URL được gửi trong tiêu đề Người giới thiệu của tất cả các yêu cầu cho bất kỳ tài nguyên nào, ngay cả tài nguyên của bên thứ ba. Vì vậy, nếu bạn đang sử dụng Google Analytics chẳng hạn, bạn sẽ gửi cho Google mã thông báo URL trong và tất cả cho họ.

Theo tôi đây là một ý kiến ​​tồi.


1
Tôi đã không nghĩ về vấn đề HTTP-reference, nhưng liên kết url sẽ chuyển hướng đến trang kết quả, nó sẽ không phải là một trang thích hợp (không có google analytics hoặc tập lệnh của bên thứ ba khác).
Flackou

5
Hầu hết các trình duyệt không xóa liên kết giới thiệu khi chuyển từ HTTPS sang HTTP?
Kevin Mark

2
Điều này tương tự với liên kết kích hoạt người dùng (hoặc đặt lại mật khẩu) phải không? Vậy trường hợp đó nên xử lý như thế nào? Nhiều trang web gửi url đặt lại đến email, POST không phải là một tùy chọn vì nó có thể nhấp được. Cảm ơn bạn.
pinkpanther

2
vậy giải pháp là gì?
RT

1
điều gì sẽ xảy ra nếu mã thông báo trong url không giống với mã thông báo được sử dụng cho các yêu cầu api và nó chỉ tồn tại trong một giờ, tác hại sau đó là gì?
user1709076

13

Tôi sẽ sử dụng một cookie cho điều đó. Quy trình làm việc phải như thế này:

  1. Người dùng đến trang web của bạn lần đầu tiên.
  2. Trang web đặt một cookie
  3. Người dùng nhập dữ liệu. Dữ liệu được lưu trữ trong DB bằng một số khóa được lưu trữ trong cookie.
  4. Khi người dùng rời đi, bạn sẽ gửi cho họ một email có liên kết https:
  5. Khi người dùng quay lại, trang web phát hiện ra cookie và có thể hiển thị cho người dùng dữ liệu cũ.

Bây giờ, người dùng muốn sử dụng một trình duyệt khác trên một máy khác. Trong trường hợp này, hãy đưa ra một nút "chuyển". Khi người dùng nhấp vào nút này, cô ấy sẽ nhận được một "mã thông báo". Cô ấy có thể sử dụng mã thông báo này trên một máy tính khác để đặt lại cookie. Bằng cách này, người dùng quyết định mức độ an toàn mà họ muốn chuyển mã thông báo.


4

SSL bảo mật nội dung của dữ liệu khi chuyển tiếp, nhưng tôi không chắc về URL.

Bất kể, một cách để giảm thiểu kẻ tấn công sử dụng lại mã thông báo URL đó là đảm bảo mỗi mã thông báo chỉ có thể được sử dụng một lần. Bạn thậm chí có thể đặt một cookie để người dùng hợp pháp có thể tiếp tục sử dụng liên kết, nhưng sau lần truy cập đầu tiên, nó sẽ chỉ hoạt động đối với người có cookie.

Nếu email của người dùng bị xâm phạm và kẻ tấn công lấy được liên kết trước tiên thì bạn đã bị tấn công. Nhưng người dùng còn có những vấn đề lớn hơn.


10
Kết nối SSL được bảo mật trước khi truyền URL.
David

1

Thư điện tử vốn dĩ không an toàn. Nếu ai đó có thể nhấp vào liên kết đó và truy cập vào dữ liệu, bạn không thực sự bảo vệ nó.


Chính xác nhưng nhiều trang web không bận tâm về điều đó và gửi thông tin đăng nhập / mật khẩu qua thư. Nhưng đó không phải là lý do để bắt chước họ ...
Flackou

Tôi đồng ý không có lý do gì để bắt chước họ, nhưng họ thường yêu cầu bạn thay đổi mật khẩu sau khi bạn đăng nhập lần đầu tiên.
Jason Punyon

1

Mã thông báo được bảo mật khi được chuyển qua SSL. Vấn đề bạn sẽ gặp phải là nó có thể sử dụng được cho mọi người (những người không dành cho nó) bằng cách có thể xem URL.

Nếu đó là thông tin riêng tư như SSN, tôi không nghĩ mình sẽ gửi URL qua email. Tôi muốn họ tạo tên người dùng và mật khẩu cho trang web. Quá dễ dàng để thỏa hiệp một email với loại thông tin đó đang bị đe dọa cho bạn và cho họ. Nếu tài khoản của ai đó bị so sánh, nó sẽ rơi vào tình trạng khó xử, đó thực sự là lỗi của ai. Bạn càng an toàn càng tốt theo quan điểm CYA nghiêm ngặt.


1
Bạn nói đúng: ví dụ: URL sẽ vẫn còn trong lịch sử trình duyệt
Flackou

0

Tôi thực sự sẽ không cho rằng điều đó đủ an toàn cho tình huống có các vấn đề nghiêm trọng về quyền riêng tư. Thực tế là bạn đang gửi URL trong một email (có thể là văn bản rõ ràng) cho đến nay là liên kết yếu nhất. Sau đó là nguy cơ bị tấn công vũ phu vào các mã thông báo (thiếu cấu trúc của cơ chế xác thực thực) có khả năng dễ bị tấn công hơn so với tên người dùng và mật khẩu được xây dựng tốt.

Không có vấn đề gì với các tham số trong một yêu cầu https, ngẫu nhiên.


Bạn nói đúng về nguy cơ bị tấn công vũ phu. Tôi không biết làm thế nào chúng ta có thể ngăn chặn bot khỏi kiểu tấn công này. Cấm các IP "khăng khăng" sẽ không phải là một biện pháp bảo vệ đầy đủ. Bạn có ý tưởng về chủ đề này không?
Flackou

Trên thực tế, với loại không gian chính mà chúng ta đang nói đến, hãy đặt if (this_ip_number_has_requested_an_invalid_token_today ()) sleep (5); trong tập lệnh load_simulation của bạn sẽ được bảo vệ hoàn hảo. (Giới hạn tỷ lệ là một trong những tính năng của cơ chế xác thực tốt.)
hỗn loạn

Cảm ơn câu trả lời của bạn. Nhưng tôi nghĩ rằng cùng một bot có thể dễ dàng lấy các IP khác nhau khiến giới hạn tỷ lệ IP không đủ. Tôi có lầm không?
Flackou

Tất cả những gì nhận được chúng là một nỗ lực không chậm trễ trên mỗi IP. Không gian địa chỉ IP không dễ dàng có sẵn nên điều đó hữu ích.
hỗn loạn

0

Đúng như vậy, đó sẽ là một ý tưởng tồi. Bạn sẽ xác minh bảo mật với cách sử dụng dễ dàng. Như đã nói trước đây, SSL sẽ chỉ bảo vệ việc truyền thông tin giữa máy chủ và trình duyệt máy khách và sẽ chỉ ngăn chặn cuộc tấn công của kẻ trung gian. Email rất rủi ro và không an toàn.

Tốt nhất là xác thực tên người dùng và mật khẩu để truy cập thông tin.

Tôi thích ý tưởng cookie ít nhiều. Bạn cũng nên mã hóa thông tin cookie. Bạn cũng nên tạo mã thông báo với muối và cụm từ khóa cộng với $ _SERVER ['HTTP_USER_AGENT'] để hạn chế xác suất bị tấn công. Lưu trữ càng nhiều thông tin vô nghĩa về khách hàng trong cookie để sử dụng xác minh.

Cụm từ khóa có thể được lưu trong cookie để dễ sử dụng nhưng hãy nhớ rằng cookie cũng có thể bị đánh cắp = (.

Tốt hơn hãy để khách hàng nhập cụm từ khóa mà anh ta đã cung cấp, cụm từ này cũng được lưu trữ trong cơ sở dữ liệu cùng với dữ liệu của anh ta.

Hoặc, khóa có thể được sử dụng trong trường hợp một người sử dụng một máy khác có thông số $ _SERVER ['HTTP_USER_AGENT'] hoặc đơn giản là bỏ lỡ cookie. Vì vậy, cookie có thể được chuyển giao hoặc thiết lập.

Cũng đảm bảo rằng dữ liệu nhạy cảm được mã hóa trong cơ sở dữ liệu. Bạn không bao giờ biết ;)


-1

Bạn có biết rằng nếu bất kỳ hacker nào truy cập vào cơ sở dữ liệu của bạn thì rất nhiều thông tin cá nhân có thể được cung cấp miễn phí?

Sau đó, tôi sẽ nói rằng điều này không tồi như ý tưởng. Tôi sẽ không sử dụng MD5 hoặc SHA1 vì chúng không an toàn lắm để băm. Chúng có thể được "giải mã" (tôi biết đó không phải là mã hóa) khá dễ dàng.

Nếu không, tôi có thể sử dụng thông tin thứ hai không được gửi qua email như một loại mật khẩu. Lý do khá đơn giản, nếu ai đó có quyền truy cập vào email của người dùng (khá dễ dàng với hotmail nếu bạn không giết phiên của mình) thì người đó sẽ có quyền truy cập vào bất kỳ thông tin nào mà người dùng đã gửi.

Lưu ý rằng HTTPS sẽ bảo mật và mã hóa dữ liệu được gửi từ trang web của bạn đến người dùng cuối. Không có gì khác, hãy coi nó như một tunel an toàn. Không có gì hơn nothign ít hơn.


Làm thế nào chính xác một băm SHA1 muối được giải mã theo bất kỳ nghĩa nào của từ này?
Eli

"Bạn có biết rằng nếu bất kỳ hacker nào truy cập được vào cơ sở dữ liệu của bạn thì rất nhiều thông tin cá nhân có thể được cung cấp miễn phí không?" Có, nhưng nó không phải là một vấn đề cho tất cả các trang web ??
Flackou

@Flackou vâng nhưng nếu bạn có quyền truy cập vào db của paypal, bạn sẽ không tìm thấy thông tin thẻ tín dụng được lưu rõ ràng, mọi thứ đều được mã hóa. @Eli: theregister.co.uk/2005/02/17/sha1_hashing_broken
Erick

-1

Theo những gì tôi hiểu về ý tưởng của bạn, về lý thuyết, ai đó có thể nhập một chuỗi 40 ký tự ngẫu nhiên hoặc mã băm MD5 và nhận được thông tin chi tiết của ai đó. Trong khi điều này có thể rất khó xảy ra nhưng chỉ cần xảy ra một lần.

Một cách độc lập tốt hơn có thể là gửi cho người dùng một mã thông báo sau đó yêu cầu họ nhập một số thông tin chi tiết, chẳng hạn như tên, mã bưu điện, ssn hoặc kết hợp các thông tin này.


5
SSN? Bạn nghiêm túc chứ? Dù sao, tôi khuyên bạn nên làm phép toán trên có bao nhiêu chuỗi 40 ký tự ngẫu nhiên. Nó không chỉ là "rất khó xảy ra"
Eli

Bạn nói đúng, có lẽ chúng ta nên thêm một tham số khác vào url, như email (ngay cả khi a..z + A..Z + 0..9 = 62 ký tự và 62 ^ 40 là một số khá lớn).
Flackou

Các bạn, 62 ^ 40 nhiều hơn đáng kể so với số nguyên tử trong vũ trụ. Nó đúng là không thể đoán được.
Eli

1
Tôi ngạc nhiên khi nhiều người không thể nắm bắt được quy mô của những con số này. Nếu bạn đã đoán một TRIỆU tokens một thứ hai, đó là nhiều khả năng rằng mặt trời sẽ ghi ra trước khi bạn nhận được một hit
Eli

4
Richard, có vẻ như bạn đang chỉ ra cái thường được gọi là Nghịch lý Sinh nhật ... vấn đề không chỉ là số lượng các kết hợp có thể có mà quan trọng là bao nhiêu trong số chúng được sử dụng. Trong trường hợp này, bạn cần sử dụng khoảng 2 ^ 119 trong số 62 ^ 40 kết hợp trước khi cơ hội trở nên quan trọng.
erickson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.