API Flask để cung cấp các tệp JSON cho ứng dụng web HTML + JS + CSS đơn giản trong khi vẫn bảo mật


8

Tôi đã tạo một ứng dụng web đơn giản sẽ hiển thị một số dữ liệu trong bảng, sẽ được cập nhật hàng tuần.

Bản cập nhật này được thực hiện trong phần phụ trợ với một số mã python, loại bỏ và thay đổi một số dữ liệu, trước khi đưa nó vào cơ sở dữ liệu SQLite.

Sau khi đọc xong, tôi đã học được rằng để phân phối dữ liệu đó vào ứng dụng web của mình, tôi nên tạo API bằng Flask, có thể lấy dữ liệu đó và gửi nó đến JS trong ứng dụng web của tôi dưới dạng JSON, sau đó có thể sử dụng dữ liệu để điền vào bàn. Tuy nhiên, tôi nên bảo mật API của mình bằng tên người dùng và pw. Nhưng vì một giao diện JS sẽ lấy dữ liệu từ API, nên thực sự không có điểm nào, vì tên người dùng và pw sẽ phải được mã hóa thành JS, sau đó người dùng có thể đọc được. (Tôi nghĩ)

Tôi có nên đưa API của mình cho mọi người hay đây không phải là cách để có thể sử dụng dữ liệu SQLite làm phụ trợ cho ứng dụng web của tôi? Tôi ổn chỉ giữ API ở chế độ NHẬN.


1
Người dùng của bạn sẽ được xác thực vào trang web khi họ truy cập nó hay nó giống như google nơi mọi người có thể truy cập trang web? Cá nhân tôi sẽ không bao giờ phơi bày một api nếu không có một số hình thức xác thực.
Daniel Butler

1
Câu trả lời này của Miguel dường như trả lời sâu sắc câu hỏi của bạn. Tôi đánh giá cao tác giả ông rất thành thạo trong bình.
Daniel Butler

@DanielButler Cảm ơn hai bình luận của bạn. Trang web tôi có trong đầu là một bảng hiển thị tổng hợp một số dữ liệu đã được công khai. Tôi sẽ đọc liên kết của bạn, cảm ơn bạn.
bjornasm

Câu trả lời:


2

Bạn đã đúng, việc bảo mật API của bạn là vô nghĩa. Bảo mật API chỉ cần thiết trong một số trường hợp nhất định.

Nếu bạn đang truy cập dữ liệu mà bạn không muốn bất kỳ ai nhìn thấy, có lẽ thông qua cuộc gọi phụ trợ, thì việc thêm vào một số hình thức bảo mật (thông thường là khóa API hoặc mã thông báo ủy quyền trong tiêu đề yêu cầu của bạn) sẽ rất hợp lý.

Tuy nhiên, nếu bạn đang thực hiện các cuộc gọi từ mặt trước của mình (tức là phía máy khách) đến API phụ trợ, thì không có lý do nào đặt bảo mật bổ sung ở đó vì người dùng có thể thấy yêu cầu và đã có quyền truy cập vào dữ liệu mà API đang trả về - vì vậy bằng cách đảm bảo nó bạn không đạt được gì.

Thông thường, nếu trang mà người dùng đang truy cập chứa dữ liệu nhạy cảm mà bạn không muốn mọi người nhìn thấy, bạn sẽ thực hiện các bước để bảo mật trang web của mình thay vào đó (ví dụ: bảo vệ trang đó bằng thông tin đăng nhập cho tên người dùng và mật khẩu trước khi bạn có thể truy cập trang đó) . Nếu bạn đã thực hiện phương pháp này, nơi trang web được bảo vệ bởi tên người dùng và mật khẩu, thì bạn có thể cập nhật API để đảm bảo nó không đáp ứng với các yêu cầu mà người dùng không được xác thực (ví dụ: bằng cách tạo mã thông báo phiên hoặc một cái gì đó duy nhất cho mỗi người dùng đăng nhập).

Nếu bạn có một cái nhìn xung quanh trên các trang web có sẵn nhiều dữ liệu miễn phí, bạn sẽ thấy tất cả chúng đều có các lệnh gọi API mặt trước hoàn toàn không được bảo mật (vì sẽ vô nghĩa nếu dữ liệu đã được truy cập miễn phí). Một số trang web thực hiện các bước để cố gắng đảm bảo rằng đó là trang web của riêng họ đang gọi API, nhưng ngay cả khi đó cũng hơi vô nghĩa vì các trình quét web luôn có thể trích xuất dữ liệu từ HTML.


1

Hãy xem trang này trong đó phác thảo các tiêu đề xác thực. Lộ trình đơn giản hơn này là mã cứng thông tin tiêu đề trong Flask để làm cho nó an toàn hơn một chút. Bạn cũng có thể thử lộ trình đọc thông tin tiêu đề liên quan nhiều hơn từ db của bạn. Những gì hiện đang làm việc cho tôi để đọc từ postgres db bên dưới để bạn có thể sửa đổi nó một chút cho sqlite.

def valid():
  headers = request.headers
  auth = headers.get("X-Api-Key")
  user = User.query.filter_by(apikey=auth).first_or_404()
  print('from search of db ',user,'',auth)
  return str(user)

0
  1. Như bạn đã đề cập, bạn có kế hoạch hiển thị dữ liệu công khai - sau đó nó có thể được sử dụng ngay cả khi không cần xác thực. Nếu không, tôi nghĩ rằng nó có thể mất quá nhiều thời gian không cần thiết cho việc đó.
  2. Vì bạn chỉ có một bảng đơn giản và duy nhất từ ​​cơ sở dữ liệu, tôi tin rằng bạn không cần API. Bạn chỉ có thể tạo mẫu HTML và kết xuất nó với dữ liệu. Một số ví dụ có thể được tìm thấy ở đâymột vài ví dụ ở đây .
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.