Mã hóa phía khách hàng: Làm thế nào để ngăn chặn việc sử dụng độc hại?


60

Trong vài năm qua, xu hướng cho các ứng dụng phía máy khách (trình duyệt) đã thực sự bắt đầu.

Đối với dự án mới nhất của tôi, tôi đã quyết định thử và di chuyển theo thời gian và viết một ứng dụng phía khách hàng.

Một phần của ứng dụng này liên quan đến việc gửi email giao dịch cho người dùng (ví dụ: xác thực đăng ký, email đặt lại mật khẩu, v.v.). Tôi đang sử dụng API của bên thứ ba để gửi email.

Thông thường tôi sẽ có ứng dụng của mình chạy trên một máy chủ. Tôi sẽ gọi API của bên thứ ba từ mã trên máy chủ của mình.

Chạy một ứng dụng phía máy khách có nghĩa là điều này bây giờ cần phải xảy ra trên trình duyệt của người dùng. API của bên thứ ba cung cấp các tệp JavaScript cần thiết để đạt được điều này.

Vấn đề rõ ràng đầu tiên tôi có thể thấy là tôi cần sử dụng khóa API. Điều này thường sẽ được lưu trữ an toàn trên máy chủ của tôi, nhưng bây giờ có lẽ tôi sẽ cần cung cấp khóa này cho trình duyệt máy khách.

Giả sử tôi có thể giải quyết vấn đề này, vấn đề tiếp theo là điều gì ngăn người dùng am hiểu công nghệ tải công cụ nhà phát triển JavaScript trên trình duyệt và sử dụng API email dù họ thích, thay vì tuân thủ bất kỳ quy tắc nào tôi đã đặt trong ứng dụng .

Tôi đoán câu hỏi chung của tôi là - làm thế nào chúng ta có thể ngăn chặn việc sử dụng độc hại ứng dụng phía khách hàng?


24
Bất kỳ lý do nào bạn không có Ứng dụng này liên lạc với máy chủ của riêng bạn và sau đó máy chủ của bạn chuyển tiếp các yêu cầu đó đến bất kỳ dịch vụ bên ngoài nào bạn cần sử dụng? (Nhiều dịch vụ như vậy sẽ cấm sử dụng chúng theo cách này)
thorsten müller

11
Đây là lý do tại sao các khóa API cuối cùng là vô nghĩa. Máy chủ không nên cố gắng tin tưởng vào ứng dụng đang gửi lệnh đó; nó chỉ nên tin tưởng người dùng
Kevin Panko

42
Tôi chưa thấy bất kỳ người tỉnh táo nào từng định nghĩa "ứng dụng phía máy khách" là "trong mọi trường hợp không bao giờ giao tiếp với máy chủ" - điều đó có vẻ giống như một người rơm hơn là một lý lẽ hợp lý. Rõ ràng có một số điều bạn phải xử lý ở phía máy chủ nhưng phần lớn các hành động có thể được thực hiện cục bộ mà không gặp sự cố, điều này sẽ cải thiện đáng kể khả năng phản hồi và khả năng mở rộng ..
Voo

4
Nơi nào bạn thấy sự thúc đẩy về "Ứng dụng chỉ dành cho trình duyệt?" Tôi chưa bao giờ thấy bất cứ điều gì giống như những gì bạn mô tả, giữ bí mật về mã khách hàng trong một ý tưởng cực kỳ tồi tệ, ngay cả những kẻ đầu cuối khó tính nhất mà tôi biết sẽ không bao giờ làm điều đó.
Wheeyls

2
Bất kỳ nỗ lực nào để bảo vệ tài nguyên an toàn phía khách hàng đều bị tiêu diệt vì nó vi phạm một số luật bảo mật bất biến. # 2/3 - nếu phần mềm của bạn đang chạy trên máy tính đối thủ thì đó không phải là máy tính của bạn theo định nghĩa và bạn đã bị mất. # 7 cố gắng bảo vệ tài nguyên bằng mã hóa sẽ bị tiêu diệt do bạn cũng phải cung cấp cho khách hàng khóa giải mã. # 10 không có công nghệ có thể sửa chữa ở trên. blog.technet.com/b/rhalbheer/archive/2011/06/16/iêng
Dan Neely

Câu trả lời:


200

Bạn không thể, và càng nhiều người hiểu điều này, và họ càng hiểu sâu hơn, thì càng tốt cho thế giới.

Mã chạy trên thiết bị dưới sự kiểm soát của người dùng không thể được kiểm soát. Điện thoại thông minh có thể được bẻ khóa. Hộp set-top có thể bị nứt. Các trình duyệt thông thường thậm chí không cố gắng ngăn truy cập vào mã JavaScript. Nếu bạn có thứ gì đó đáng để ăn cắp hoặc lạm dụng, một kẻ tấn công quyết tâm sẽ có thể làm điều đó trừ khi bạn xác nhận mọi thứ bạn trân trọng phía máy chủ.

Obfuscation là rất ít giúp đỡ; loại đối thủ bạn sẽ thu hút ngay khi mọi thứ liên quan đến tài chính từ xa đọc ngôn ngữ lắp ráp như quảng cáo rao vặt. Mã hóa không thể giúp bạn, bởi vì thiết bị bảo vệ khóa là cùng một thiết bị bạn phải giả sử bị bẻ khóa. Có nhiều biện pháp đối phó khác, dường như rõ ràng không hoạt động, vì những lý do tương tự.

Thật không may, đây là một sự thật rất bất tiện. Thế giới đầy những nhà khai thác thời gian nhỏ và lớn, những người nghĩ rằng họ bằng cách nào đó có thể khắc phục được sự đổ vỡ cơ bản của niềm tin từ xa, đơn giản là vì sẽ rất tuyệt nếu chúng ta có thể giả định rằng mã của chúng ta sẽ chạy theo cách chúng ta giả định. Và vâng, nó sẽ làm mọi thứ dễ dàng hơn nhiều đến nỗi nó thậm chí không hài hước. Nhưng mong muốn không làm cho nó trở nên như vậy, và hy vọng chống lại hy vọng rằng bạn là một cookie thông minh có thể tránh được sự khó chịu sẽ chỉ đốt cháy bạn và khách hàng của bạn. Do đó, hãy suy nghĩ rằng Internet là lãnh thổ của kẻ thù, bao gồm chi phí tăng thêm trong ước tính của bạn và bạn sẽ ổn.

Điều đó nói rằng, tất nhiên có một thứ như phòng thủ theo chiều sâu. Làm xáo trộn JavaScript của bạn không loại bỏ một kẻ tấn công xác định, nhưng nó có thể loại bỏ một số kẻ tấn công ít xác định hơn. Nếu tài sản của bạn đủ giá trị để bảo vệ, nhưng không phải bằng bất cứ giá nào, bất kỳ biện pháp nào trong số đó có thể bổ sung giá trị kinh doanh cho hệ thống của bạn; nó không thể hoàn hảo Miễn là bạn nhận thức đầy đủ về sự đánh đổi mà bạn đang thực hiện, đó có thể là một chiến lược hợp lý.


6
Nhưng để đặt điều này trong viễn cảnh: Điều này đúng với MỌI Phần mềm, có thể là Hệ điều hành hoặc bộ đồ giao dịch. Cuối cùng, có một số obfuscators mã rất tốt ngoài kia và bạn có thể nâng thanh rất có thể đủ cao, nếu không có động cơ tài chính ngay lập tức để hack phần mềm của bạn!
Falco

5
Ngày nay, các công ty đã thực hiện để đe dọa hành động pháp lý chống lại những người hack nội dung nhận được từ họ trước khi xử lý (tức là thông qua các trình chặn quảng cáo). Điều đó chỉ đi để cho thấy hành động kỹ thuật là không thể .
Kilian Foth

62
Nếu tôi có thể giải thích hai câu đầu tiên, những người tinh tế thường bỏ lỡ là điểm của các ứng dụng trình duyệt phía khách hàng là giảm tải nặng. Máy chủ của bạn vẫn chịu trách nhiệm cho các hoạt động đáng tin cậy, như gửi email hoặc truy cập dữ liệu. Tuy nhiên, việc máy khách hiển thị biểu đồ từ dữ liệu đó, giúp bạn tiết kiệm thời gian CPU (và tiền) mà không thay đổi mô hình bảo mật.
ssube

11
@Gaz_Edge Điều quan trọng cần lưu ý là vấn đề ở đây không phải là các ứng dụng phía máy khách vốn không an toàn. Vấn đề là viết các ứng dụng phía máy khách này theo cách đòi hỏi phải tin tưởng khách hàng với thông tin mà bạn không muốn công khai. Hoàn toàn có thể viết một ứng dụng nặng cho khách hàng, an toàn như một ứng dụng nơi hầu hết quá trình xử lý xảy ra trên máy chủ. (Để biết thêm về điều đó, hãy xem câu trả lời của jhocking )
Ajedi32

7
@ Ajedi32 Client-side ứng dụng không an toàn. Không thể thiết kế một ứng dụng an toàn nếu bất kỳ logic nào được thực hiện phía máy khách không được kiểm tra phía máy chủ. Tại thời điểm đó, logic phía máy khách trở thành giao diện người dùng hay cách giảm tải các kiểm tra cơ bản, nhưng mọi thứ, phải luôn được kiểm tra trên máy chủ !! .

69

Quy tắc ở đây là:

Làm mọi thứ phía máy khách không ảnh hưởng đến bất kỳ ai khác nếu người dùng ngăn chặn nó. Đặc biệt, điều đó có nghĩa là hiệu ứng đồ họa.

Thực hiện mọi thứ phía máy chủ cần được bảo mật và chỉ gửi các sự kiện UI từ máy khách (ví dụ: máy khách chỉ nói "người dùng đã nhấn nút Mua" trong khi máy chủ thực sự thực hiện giao dịch). Đặc biệt, điều đó có nghĩa là giao dịch tài chính.


28

Đây chính xác là trường hợp làm cho nó trở thành một ứng dụng hoàn toàn phía khách hàng là không phù hợp.

Bạn có thể thực hiện logic và xác thực cơ bản của biểu mẫu phía máy khách (bạn vẫn phải xác nhận lại trên máy chủ, vì ai đó có thể cố gắng giả mạo yêu cầu) để cải thiện khả năng phản hồi, bạn có thể thực hiện các yêu cầu HTTP từ JavaScript truyền dữ liệu ở đó và quay lại JSON tránh gửi lại trang trí trang và những thứ tương tự, nhưng nếu bản thân giao dịch cần được xác thực và ủy quyền, thì nó vẫn sẽ xảy ra trên máy chủ.


11
Lưu ý: Mặc dù thật tuyệt khi xác thực các biểu mẫu phía máy khách, nhưng đừng bao giờ quên xác thực phía máy chủ! Khi bạn gửi mã máy khách của mình tới trình duyệt, nó sẽ không còn là mã của bạn nữa! Bạn phải xác nhận từng bit nó sẽ gửi lại!
Josef

17

Đoạn giữa của bạn là trung tâm của vấn đề:

Chạy một ứng dụng phía máy khách có nghĩa là điều này bây giờ cần phải xảy ra trên trình duyệt của người dùng. API của bên thứ ba cung cấp các tệp js cần thiết để đạt được điều này.

Tại sao ứng dụng phía máy khách có nghĩa là bạn không thể có công việc phía máy chủ? Việc thúc đẩy lập trình phía máy khách không phải là loại bỏ các máy chủ, mà là tận dụng các công nghệ mới hơn mà cuối cùng các trình duyệt hỗ trợ để tạo giao diện người dùng tốt hơn.

Đối với .jstệp bạn nhận được, bạn có chắc chắn nó dành cho trình duyệt không? Nó có thể là một thư viện node.js?


4
+1 cho đề xuất thực sự tốt rằng tệp JS được dành cho máy chủ NodeJS
Machinarius

11

Chúng ta hãy lùi lại từ đây và xem xét mức độ cao hơn .. chúng ta sẽ .. Eudora hay triển vọng (một ứng dụng phía khách hàng, thậm chí không cần trình duyệt) có bao giờ gây tổn thất tài chính cho bất kỳ công ty nào không? Không. Bất cứ ai cũng có thể viết thư cho API POP / SMTP và là khách hàng. Nhưng không mất máy chủ. Máy chủ không giới hạn hành động của máy khách, tính toán, lưu trữ, nhiệt độ, kích thước đĩa, kích thước ram, giám sát DPI, GPU, FPU yada yada của máy khách nhưng chỉ định chính xác những gì nó sẽ trả lời và không hơn thế nữa. Bạn đã bao giờ nghe nói về việc rút tiền nhanh chóng hoặc MS-Money được sử dụng để chuyển sang ngân hàng chưa?

Ứng dụng trình duyệt của bạn (tức là phía khách hàng) có thể sử dụng cùng một kiến ​​trúc.

  1. Bạn xây dựng máy chủ của mình bằng API (mà BTW, luôn nắm bắt được các dẫn xuất của GET POST Head, v.v.).
  2. Trên máy chủ, đảm bảo rằng API chỉ nói chuyện với một máy khách được xác thực và xác minh danh tính cho mỗi cuộc gọi.
  3. Sau đó, bạn không quan tâm khách hàng là ai.
  4. Và sau đó, bạn không quan tâm nếu đó là trình duyệt, thiết bị đã bẻ khóa, kính Google, DOS 3.1 hay Nexus hoàn toàn mới trong tay của một ông cố công nghệ vĩ đại, người đã du hành thời gian đến 2014 và đã bỏ lỡ tất cả công nghệ đang tràn ngập cuộc sống của chúng ta trong 15 thập kỷ qua.
  5. Bây giờ bạn có thể bắt đầu tải mọi thứ khác cho phía khách hàng.

Xà phòng

@KilianFoth nêu lên một điểm nhận thức quan trọng đối với những người ngây thơ và liều lĩnh, chủ yếu là những người đọc các tiêu đề mọi lúc nhưng không bao giờ nghĩ rằng nó sẽ xảy ra với ứng dụng của họ, mã của họ, chủ nhân của họ, khách hàng của họ, tài khoản ngân hàng của họ. Thậm chí, những người sử dụng lao động của họ (đặc biệt là CTO) còn cho phép các ứng dụng thoát ra ngoài để lộ bất kỳ hệ thống nào tiếp xúc không được kiểm soát / không kiểm soát. Tuy nhiên tôi luôn bối rối về việc dường như "chúng ta không bao giờ học".

Xà phòng

Vì vậy, để tóm tắt. Tạo một API phía máy chủ vững chắc và chặt chẽ. Giảm tải mọi thứ khác cho khách hàng dựa trên bất cứ điều gì khách hàng có thể xử lý.


6

Tôi cho rằng bạn thực sự không thể. Nếu bạn sẵn sàng gửi dữ liệu cho khách hàng, bạn phải hy vọng rằng nó sẽ bị lạm dụng - tuy nhiên có thể. Ví dụ của bạn về khóa API là minh họa cho điểm và tôi sẽ không bao gồm điều đó trong JS phía máy khách của bạn - nó sẽ bị đánh cắp và lạm dụng.

Bạn chắc chắn sẽ vẫn cần một số lượng mã máy chủ để giữ an toàn. Thậm chí một cái gì đó đơn giản như chỉ lấy dữ liệu liên quan đến người dùng đã đăng nhập. Xác thực đó không thể được thực hiện phía khách hàng hoặc một lần nữa, bạn sẽ bị lợi dụng và dữ liệu của bạn không an toàn.

Tôi sẽ luôn xem trải nghiệm phía máy khách JS là một bổ sung cho mã máy chủ. Xác thực trên máy khách cung cấp trải nghiệm người dùng tốt, nhưng nếu bạn không xác minh rằng dữ liệu POST trên máy chủ nhận cũng vậy, bạn sẽ tự mở để tấn công. Bất cứ điều gì từ khách hàng nên được coi là nghi ngờ.


4

Nó khá đơn giản, thực sự. Giả sử rằng máy tính khách và tất cả phần mềm chạy trên nó đều nằm dưới sự kiểm soát hoàn toàn của một tin tặc độc hại thông minh.

Điều đó có nghĩa là bất kỳ thông tin nào bạn gửi từ máy chủ đến máy khách sẽ bị kẻ độc hại biết đến, do đó bạn phải đảm bảo không gửi thông tin nào đến máy khách có thể được sử dụng để tấn công máy chủ hoặc doanh nghiệp của bạn.

Điều đó cũng có nghĩa là mọi thứ được gửi từ máy khách đến máy chủ đều do tin tặc độc hại tạo ra, vì vậy mã máy chủ của bạn phải đảm bảo rằng không có gì khách hàng có thể gửi sẽ có khả năng tấn công thành công máy chủ của bạn.

Phải thừa nhận rằng việc triển khai là một vấn đề, nhưng điều quan trọng là thái độ tinh thần, giả định rằng "khách hàng" mà bạn nghĩ rằng máy chủ của bạn đang nói chuyện không phải là khách hàng mà là một kẻ tấn công tích cực.

(Bạn cũng cần cho rằng người dùng là một conman thông minh, người sẽ cố gắng tấn công các phương thức kinh doanh của bạn, nhưng điều đó không liên quan gì đến lập trình phía khách hàng).


0

Theo tôi, ứng dụng phía khách hàng chủ yếu là về UI. Ví dụ, tất cả hệ thống UI của bạn sẽ được gửi một lần đến máy khách và sau đó máy khách sẽ làm bất cứ điều gì nó muốn với nó.

Thông thường tôi sẽ có ứng dụng của mình chạy trên một máy chủ. Tôi sẽ gọi API của bên thứ ba từ mã trên máy chủ của mình.

Chạy một ứng dụng phía máy khách có nghĩa là điều này bây giờ cần phải xảy ra trên trình duyệt của người dùng. API của bên thứ ba cung cấp các tệp JavaScript cần thiết để đạt được điều này.

Nếu bạn có Khóa API, thì nó không có ý định hoạt động ở phía máy khách. Nếu bạn cung cấp Khóa API ở phía máy khách, thì bất kỳ ai cũng có quyền truy cập vào nó và sau đó có thể sử dụng nó cho mục đích riêng của mình. Lưu trữ và sử dụng phía máy chủ khi máy khách cần, sau đó gửi kết quả bằng Ajax / WebSockets.

Giống như nếu ngân hàng của bạn nói: "Chà, tôi sẽ đặt mật khẩu của phía máy khách cơ sở dữ liệu chính để khách hàng có thể tự yêu cầu và anh ta sẽ không làm phiền máy chủ của chúng tôi nữa."

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.