Kết nối frontEnd với database

Hi !
Nếu bỏ qua tính bảo mật, làm web đơn giản không xử lý gì nhiều, tại sao không kết nối trực tiếp database với frontEnd ? Không biết có hàm hay thư viện JS nào cho phép làm điều này không ? ( hình như firebase cho kết nối database với frontEnd thì phải )
Em không phục với câu trả lời này lắm !

không hiểu sao nó lại được nhiều người đồng tình như vậy, mình nghĩ cmt của anh ta không liên quan. VD vẫn có thể làm web đọc, ghi, hiển thị dữ liệu từ database lên UI, còn user muốn truy cập trực tiếp database, phá như nào thì mặc kệ. Còn chiếc xe muốn lăn bánh được thì phải có động cơ, không có cách nào khác để kết nối bánh xe với vô- lăng mà không thông qua động cơ, ly hợp, hộp số. Mình thấy một số app offline kết nối trực tiếp UI với local database.

1 Like

web đơn giản ko xử lý gì nhiều vậy tại sao lại cần tới database? Database lưu cái gì? Nếu lưu thông tin người dùng như user account này nọ thì cần bảo mật rồi.

8 Likes

Rất tiếc, anh sẽ nói về tính bảo mật :rofl:. Nói về bảo mật thì cách làm này cực kì không tốt. Để kết nối với một db thì chúng ta cần phải có mật khẩu, và trong trường hợp này, mật khẩu được giấu trong một file javascript nào đó. Mấy thanh niên có kiến thức về javascript và DevsTool hoàn toàn có thể mò vào file javascript đó để tìm mật khẩu. Có minify hay obfuscate lại code thì vẫn bị mò ra thôi.

Ngoài ra còn có một vấn đề nữa là làm sao có thể kết nối frontEnd tới db? Trình duyệt hiện đại giờ đều có một cơ chế đặc biệt có tên same-origin policy. Cơ chế này chặn không cho javascript code có thể tạo ra những request đến những nguồn khác với nguồn mà nó được trả về (ví dụ đơn giản như request tới những domain khác).

4 Likes

Điều bạn nghĩ đến (kết nối FrontEnd với DB) về lý thuyết là hoàn toàn có thể được nha, thực tế người ta cũng làm các dạng tương tự rồi.
VD:
Kết nối trực tiếp từ site đến Firebase (nếu bạn xem Firebase là một DB).
Các windows app kết nối trực tiếp đến một DB nào đó (như bạn đã đưa ra ví dụ).

Tuy nhiên, việc kết nối trực tiếp website đến DB có nhiều khuyết điểm
VD:
Khi bỏ đi server trung gian, bạn đã:
|_ Mất đi một resource dành cho việc lưu trữ file, cache, v.v.
|_ Mất đi một resource dành cho việc xử lý tác vụ (các tính toán nặng mà Javascript ở browser không xử lý nổi)
|_ Trao các thông tin config quan trọng cho hacker (tài khoản DB, tài khoản thanh toán online, v.v…)
|_ Trao 100% source code xử lý cho hacker (họ có thể debug JS và đổi luồng xử lý một cách dễ dàng)
|_ v.v…

Windows app ít bị các hạn chế như website, vì nó có thể sử dụng ổ cứng của máy tính để lưu trữ, source code, các thông tin config thì ở dạng binary, lại được mã hóa nên rủi ro bị hack cũng ít.
Website thì phụ thuộc vào browser nên không có các lợi điểm trên.

Tóm lại, dù khả thi về mặt lý thuyết và kỹ thuật, cũng chẳng ai kết nối trực tiếp từ website đến DB cả, lợi ích mà nó mang lại chẳng thấm vào đâu so với rủi ro, nên thế giới không ai làm và cũng không khuyến khích làm.

Nói qua về Firebase, nếu bạn nghĩ nó chỉ đơn thuần là 1 DB thì sai lầm nhé,
cả một hệ thống backend ở đằng sau đấy, cho phép bạn phân quyền, viết function, v…v… như 1 server thực thụ.

9 Likes

Tính làm online database hay sao mà kết nối trực tiếp vậy? :thinking:

6 Likes

App mà bạn nói nó chạy trên hệ điều hành, hệ điều hành (người dùng) mà nó phép thì nó muốn làm gì cũng được
Còn web nó chạy trên trình duyệt, nó không chạy ra khỏi trình duyệt được
Còn bạn vẫn thích chơi kiểu đó thì viết một cái trình duyệt web khác có khả năng cho phép code frontend có thể affect ra khỏi cái trình duyệt đó

7 Likes

nếu web online cho nhiều người dùng mà database lộ thiên như vậy thì chả khác gì đem con bỏ chợ , vì dữ liệu được hiển thị trên web là lấy từ database mà databse lộ thiên >> ai cũng vào chọc phá thì trang web nó ra cái gì nữa , nó vào database bỏ ảnh 18+ , phản động hoặc nó tải 1 đống file rác nặng crash database luôn

6 Likes

Sau khi đọc thảo luận này, mình nhận thấy có vẻ không riêng gì chủ topic mà có cả một số lượng N người có nick ở Dạy Nhậu Học vẫn chưa nắm (hoặc nắm nhưng không chú tâm => lơ mơ, mơ màng) căn bản về thế giới web, tức WWW và HTML. Xin vắn tắt lại như sau:

  • WWW được thiết kế theo mô hình client - server
  • Giao thức HTTP/ HTTPS đều là stateless protocol
  • Trang web khi được người dùng xem, bản chất nó được trình duyệt web nạp về, hoạt động phía client. Vì là stateless nên khi trang web nạp về, giữa trình duyệt và server dứt điểm một phiên.

Như vậy, kết nối frontend với database là muốn nói ý gì, diễn giải làm sao nghe thử xem? Có biết thuở ban đầu HTML hoàn toàn là tĩnh, và chỉ có một chiều từ trên server chảy về client mà người dùng không gửi thông tin lên đó? Hay là do thiếu kiến thức về WWW?

Ở đây ta phải hiểu đúng nghĩa của frontend tức là phía client (client-side). Mô hình client - server thì client phải gửi yêu cầu phía server cung cấp thêm những thứ mà nó cần. Hoặc lập trình web nói chung (không phân biệt frontend, backend) người lập trình tuỳ chọn để cho backend (tức server-side) xử lý, hoặc bắt buộc phải dùng server-side xử lý do không thể làm cách nào khác ở client-side. Chỉ làm được ở client những cái vốn thuộc về client. Không có chuyện phích cắm điện ở nhà mà đòi cắm trực tiếp vào… turbin của trạm thuỷ điện :smiley:

Tất nhiên là nếu bạn không dùng trình duyệt web, không dùng giao thức HTTP/HTTPS thì bạn vẫn có thể viết một phần mềm client để kết nối tới một server. Cách đó giờ vẫn tồn tại, vẫn có nhiều phần mềm hoạt động theo cách đó. Nhưng nó lại không phải là đề tài front-end, back-end mà chủ topic đang muốn thảo luận ở đây. Trong thực tế ta thấy phần mềm gửi email như Outlook, FTP như Cyberduck, SSH client, MySQL Workbench, các phần mềm cài ở máy tính người chơi để tính tiền ở tiệm NET, Games … là những phần mềm mà client kết nối trực tiếp đến server (nhưng không ai gọi back-end, front-end gì cả đâu nhé)

Những trình duyệt hiện đại đã không còn là trình duyệt như ngày xưa nữa, giờ nó đã đóng vai trò gần như một hệ điều hành (nhất là trên máy ChromeBook), kèm với HTML5 thì giờ nó có cái gần như database nằm ở phía client (thực ra đã có từ thời có cookie, nhưng vì cookie bé quá nên dùng nó làm database thì… điên đến nơi) như HTML Web Storage (kèm hệ phái của nó localStorage and sessionStorage), IndexedDB.

Nhưng kích thước của cái database ở phía client này cũng nhỏ (IndexedDB lớn nhưng khá rắc rối và cũng chưa phổ biến lắm), chưa thể/ không thể thay thế vai trò database ở server-side (tức backend) được, hoặc có những cái vốn cần nằm ở server, để ở client sẽ không đúng bản chất mạng máy tính nữa.

Thực tế có nhiều ứng dụng web, về bản chất nó cần phải cất giữ/ lưu lại dữ liệu ở phía người sở hữu trang web. Vì thế nên, cho dù có thể sử dụng được database nằm ở client nhưng chỉ tạm thời, không phải là cái mục đích để dùng “database” Web Storage với giới hạn chỉ đâu đó chục MB hoặc có nhồi nhét vào IndexDB vì nó đủ lớn.

Chủ topic nếu lại cứ khăng khăng database là ở frontend thì xin mời gia nhập thế giới của Service Workers, PWA - là những thử nghiệm vẫn còn khá mới mẻ trong làng web.

Nếu bạn định làm trang web tự nó chạy được mà không cần trình duyệt mà bạn đóng gói trang web như một phần mềm hoặc app, có thể chạy trên máy mà không viện đến trình duyệt web, cứ vô tư kết nối front-end với back-end, điều đó là trong tầm tay. Còn nếu làm web mà người dùng cần đến trình duyệt web, ở thời điểm này là chưa thể từ trang web kết nối thẳng đến database của bạn, trừ khi bạn cho rằng các Web API cũng là database.

Do đó, người ta trả lời như kia là đúng, vì họ hiểu bản chất vấn đề. Còn cái ông hỏi thì chả biết mình hỏi gì, bị cười nhạo là không oan tí nào.

10 Likes

Thật vậy, bạn chủ thread chưa nắm rõ căn bản là đúng, vì nếu có kiến thức thì không ai đi hỏi câu “ngô nghê” như thế này.
Tuy nhiên, câu mà bạn ấy hỏi không phải là vô nghĩa, nó có tính chất của “think out of the box”,
bước ra khỏi con đường lớn mà mọi người đang đi (tuy rằng sau đó rẽ vào ngõ cụt :smiley: )
Thay vì đưa ra một câu trả lời “thượng đẳng” trớt quớt, thì giải thích với lý do, dẫn chứng thuyết phục, hợp tình hợp lý (và cách nói phù hợp với trình độ của người nghe) để bạn ấy hiểu được vấn đề và quay lại chính đạo, là một cách đúng đắn hơn trong việc thể hiện trình độ của bản thân.

13 Likes

Client kết nối trực tiếp đến db thì performance k đc tốt, client tăng thì connection đến db cũng tăng theo -> db tạch. -> cần 1 chỗ để cache, pool connection lại -> server

4 Likes

FB_IMG_1593409422365

11 Likes

và mình cũng từng thắc như này, ai đó sẽ vào web và drop database, drop table thì die web. xem thêm câu trả lời tại

3 Likes

À nhóm riêng tư mà bạn ơi :thinking:?

4 Likes

vậy để mình chụp màn hình lại ! ( ảnh hơi dài :sweat_smile: )

Ngoài ra, câu hỏi trên đã được đăng lên Quora và được một anh User Experience Engineer của Google trả lởi:

https://www.quora.com/Why-do-we-need-a-back-end-in-web-development-Cant-the-front-end-directly-send-requests-to-the-database

5 Likes

Nếu mình làm web luyện code SQL giống w3chool, hackerRank, …(mức độ basic thôi chứ không professional như vậy) Mình tạo ra các câu hỏi SQL cho user tự run nó thì có cách nào cài đặt database server chỉ được query mà không được alter, drop, … table không? database tự động reset về giá trị mặc định mỗi khi session timeout giống kiểu đóng băng ổ cứng windows vậy? Cảm ơn

Docker thẳng tiến!
Luyện SQL mà không có những lệnh đó thì hơi thiếu :kissing:

2 Likes

Được thì vẫn được mà. Nhưng người ta tách front end với back end để bảo trì dễ hơn. Còn nếu bạn muốn không chia front end back end thì có thể dùng java web hay ASP.NET nó kết nối luôn đến DataBase đấy

2 Likes

java web dùng JSP để viết câu SQL. Nó là server side render nên connect với database vẫn diễn ra ở phía server. Ý bạn đó thích làm kiểu dị dị: frontend là trang SPA connect trực tiếp tới database luôn á (bao nhiêu client là bấy nhiêu connect tới database) :joy: có trang web cho query database SQLite trên giao diện luôn đây https://sqlcss.xyz

Em tổng kết lại như này:

Về techinal thì nguyên nhân là do:

  • Database Management System chỉ cho phép khoảng vài nghìn kết nối đồng thời trong khi web server có thể chịu tải đến vài chục nghìn request đồng thời.
  • Bộ 3 client phổ biến là web, app desktop, mobile app sử dụng giao thức http để lấy data còn DBMS không hỗ trợ http.

Về bảo mật:

  • Như những comment ở trên.
  • Không muốn để lộ schema database.
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?