Bảo mật Website
Bảo mật trang web đòi hỏi sự cảnh giác trong tất cả các khía cạnh của thiết kế và sử dụng trang web. Bài viết giới thiệu này sẽ không biến bạn thành chuyên gia bảo mật trang web, nhưng nó sẽ giúp bạn hiểu các mối đe dọa đến từ đâu và bạn có thể làm gì để củng cố ứng dụng web của mình trước các cuộc tấn công phổ biến nhất.
Bảo mật trang web là gì?
Internet là một nơi nguy hiểm! Rất thường xuyên, chúng tôi nghe nói về việc các trang web không khả dụng do bị tấn công từ chối dịch vụ hoặc hiển thị thông tin đã sửa đổi (và thường gây tổn hại) trên trang chủ của họ. Trong các trường hợp nổi tiếng khác, hàng triệu mật khẩu, địa chỉ email và chi tiết thẻ tín dụng đã bị rò rỉ vào phạm vi công cộng, khiến người dùng trang web gặp phải cả sự bối rối cá nhân và rủi ro tài chính.
Mục đích của bảo mật trang web là ngăn chặn các loại tấn công này (hoặc bất kỳ). Định nghĩa chính thức hơn về bảo mật trang web là hành động/thực tiễn bảo vệ trang web khỏi bị truy cập, sử dụng, sửa đổi, phá hủy hoặc gián đoạn trái phép.
Bảo mật trang web hiệu quả đòi hỏi nỗ lực thiết kế trên toàn bộ trang web: trong ứng dụng web của bạn, cấu hình máy chủ web, chính sách tạo và gia hạn mật khẩu cũng như mã phía máy khách. Mặc dù tất cả những điều đó nghe có vẻ rất đáng ngại, nhưng tin tốt là nếu bạn đang sử dụng khung web phía máy chủ, nó gần như chắc chắn sẽ kích hoạt “theo mặc định” các cơ chế bảo vệ mạnh mẽ và được cân nhắc kỹ lưỡng trước một số cuộc tấn công phổ biến hơn . Có thể giảm thiểu các cuộc tấn công khác thông qua cấu hình máy chủ web của bạn, chẳng hạn bằng cách bật HTTPS. Cuối cùng, có những công cụ quét lỗ hổng sẵn có công khai có thể giúp bạn tìm hiểu xem mình có phạm phải sai lầm rõ ràng nào không.
Phần còn lại của bài viết này cung cấp cho bạn thêm thông tin chi tiết về một số mối đe dọa phổ biến và một số bước đơn giản mà bạn có thể thực hiện để bảo vệ trang web của mình.
Các mối đe dọa bảo mật trang web
Phần này chỉ liệt kê một số mối đe dọa trang web phổ biến nhất và cách giảm thiểu chúng. Khi bạn đọc, hãy lưu ý cách các mối đe dọa thành công nhất khi ứng dụng web tin tưởng hoặc không đủ hoang tưởng về dữ liệu đến từ trình duyệt.
Tập lệnh chéo trang (XSS)
XSS là một thuật ngữ được sử dụng để mô tả một loại tấn công cho phép kẻ tấn công đưa các tập lệnh phía máy khách thông qua trang web vào trình duyệt của những người dùng khác. Bởi vì mã được tiêm đến trình duyệt từ trang web nên mã này được tin cậy và có thể thực hiện những việc như gửi cookie ủy quyền trang web của người dùng cho kẻ tấn công. Khi kẻ tấn công có cookie, họ có thể đăng nhập vào một trang web như thể họ là người dùng và làm bất cứ điều gì mà người dùng có thể làm, chẳng hạn như truy cập chi tiết thẻ tín dụng của họ, xem chi tiết liên hệ hoặc thay đổi mật khẩu.
Lỗ hổng XSS được phản ánh xảy ra khi nội dung của người dùng được chuyển đến máy chủ được trả lại ngay lập tức và chưa được sửa đổi để hiển thị trong trình duyệt. Mọi tập lệnh trong nội dung người dùng ban đầu sẽ được chạy khi trang mới được tải. Ví dụ: hãy xem xét chức năng tìm kiếm trang web trong đó cụm từ tìm kiếm được mã hóa dưới dạng tham số URL và các cụm từ này được hiển thị cùng với kết quả. Kẻ tấn công có thể tạo liên kết tìm kiếm chứa tập lệnh độc hại làm tham số (ví dụ: http://developer.mozilla.org?q=beer<script%20src=”http://example.com/tricky.js”> </script>) và gửi qua email cho người dùng khác. Nếu người dùng mục tiêu nhấp vào “liên kết thú vị” này, tập lệnh sẽ được thực thi khi kết quả tìm kiếm được hiển thị. Như đã thảo luận trước đó, điều này cung cấp cho kẻ tấn công tất cả thông tin chúng cần để vào trang web với tư cách là người dùng mục tiêu, có khả năng mua hàng với tư cách là người dùng hoặc chia sẻ thông tin liên hệ của họ.
Lỗ hổng XSS liên tục xảy ra khi tập lệnh độc hại được lưu trữ trên trang web và sau đó được hiển thị lại ở trạng thái không sửa đổi để những người dùng khác vô tình thực thi. Ví dụ: một diễn đàn thảo luận chấp nhận nhận xét chứa HTML chưa sửa đổi có thể lưu trữ tập lệnh độc hại từ kẻ tấn công. Khi các bình luận được hiển thị, tập lệnh được thực thi và có thể gửi cho kẻ tấn công thông tin cần thiết để truy cập vào tài khoản của người dùng. Kiểu tấn công này cực kỳ phổ biến và mạnh mẽ, bởi vì kẻ tấn công thậm chí có thể không có bất kỳ sự tương tác trực tiếp nào với nạn nhân.
Mặc dù dữ liệu từ các yêu cầu POST hoặc GET là nguồn phổ biến nhất gây ra lỗ hổng XSS, nhưng mọi dữ liệu từ trình duyệt đều có khả năng bị tấn công, chẳng hạn như dữ liệu cookie do trình duyệt hiển thị hoặc tệp người dùng được tải lên và hiển thị.
Biện pháp bảo vệ tốt nhất chống lại các lỗ hổng XSS là xóa hoặc vô hiệu hóa bất kỳ đánh dấu nào có khả năng chứa các hướng dẫn để chạy mã. Đối với HTML, điều này bao gồm các phần tử, chẳng hạn như <script>, <object>, <embed> và <link>.
Quá trình sửa đổi dữ liệu người dùng để nó không thể được sử dụng để chạy tập lệnh hoặc ảnh hưởng đến việc thực thi mã máy chủ được gọi là khử trùng đầu vào. Theo mặc định, nhiều khung web tự động làm sạch đầu vào của người dùng từ các biểu mẫu HTML.
Lỗ hổng SQL
Lỗ hổng SQL cho phép người dùng độc hại thực thi mã SQL tùy ý trên cơ sở dữ liệu, cho phép truy cập, sửa đổi hoặc xóa dữ liệu bất kể quyền của người dùng. Một cuộc tấn công tiêm chích thành công có thể giả mạo danh tính, tạo danh tính mới với quyền quản trị, truy cập tất cả dữ liệu trên máy chủ hoặc hủy/sửa đổi dữ liệu để khiến dữ liệu không sử dụng được.
Các loại SQL injection bao gồm Error-based SQL injection, SQL injection dựa trên lỗi boolean và Time-based SQL injection.
Lỗ hổng này xuất hiện nếu đầu vào của người dùng được chuyển đến câu lệnh SQL cơ bản có thể thay đổi ý nghĩa của câu lệnh. Ví dụ: đoạn mã sau nhằm liệt kê tất cả người dùng có tên cụ thể (tên người dùng) đã được cung cấp từ biểu mẫu HTML:
Nếu người dùng chỉ định tên thật, câu lệnh sẽ hoạt động như dự định. Tuy nhiên, một người dùng ác ý hoàn toàn có thể thay đổi hành vi của câu lệnh SQL này thành câu lệnh mới trong ví dụ sau, bằng cách chỉ định a’;DROP TABLE users; CHỌN * TỪ thông tin người dùng WHERE ‘t’ = ‘t cho tên người dùng.
Câu lệnh được sửa đổi tạo ra một câu lệnh SQL hợp lệ để xóa bảng người dùng và chọn tất cả dữ liệu từ bảng thông tin người dùng (tiết lộ thông tin của mọi người dùng). Điều này hoạt động vì phần đầu tiên của văn bản được chèn (a’;) hoàn thành câu lệnh ban đầu.
Để tránh kiểu tấn công này, bạn phải đảm bảo rằng bất kỳ dữ liệu người dùng nào được chuyển đến truy vấn SQL đều không thể thay đổi bản chất của truy vấn. Một cách để làm điều này là thoát khỏi tất cả các ký tự trong đầu vào của người dùng có ý nghĩa đặc biệt trong SQL.
Trong câu lệnh sau, chúng ta thoát ký tự ‘. Bây giờ SQL sẽ diễn giải tên dưới dạng toàn bộ chuỗi được in đậm (thực sự đây là một tên rất kỳ lạ, nhưng không có hại).
Các khung web thường sẽ xử lý ký tự thoát cho bạn. Ví dụ, Django đảm bảo rằng mọi dữ liệu người dùng được chuyển đến bộ truy vấn (truy vấn mô hình) đều được thoát.
Giả mạo yêu cầu trên nhiều trang web (CSRF)
Các cuộc tấn công CSRF cho phép người dùng độc hại thực hiện các hành động bằng cách sử dụng thông tin xác thực của người dùng khác mà người dùng đó không biết hoặc không đồng ý.
Loại tấn công này được giải thích tốt nhất bằng ví dụ. Josh là một người dùng độc hại biết rằng một trang web cụ thể cho phép người dùng đã đăng nhập gửi tiền đến một tài khoản được chỉ định bằng cách sử dụng yêu cầu HTTP POST bao gồm tên tài khoản và số tiền. Josh tạo một biểu mẫu bao gồm chi tiết ngân hàng của anh ấy và số tiền dưới dạng các trường ẩn và gửi email đó cho những người dùng trang web khác (với nút Gửi được ngụy trang dưới dạng liên kết đến trang web “làm giàu nhanh chóng”).
Nếu người dùng nhấp vào nút gửi, một yêu cầu HTTP POST sẽ được gửi đến máy chủ chứa chi tiết giao dịch và bất kỳ cookie phía máy khách nào mà trình duyệt liên kết với trang web (việc thêm cookie trang web được liên kết vào yêu cầu là hành vi bình thường của trình duyệt). Máy chủ sẽ kiểm tra cookie và sử dụng chúng để xác định xem người dùng có đăng nhập và có quyền thực hiện giao dịch hay không.
Kết quả là bất kỳ người dùng nào nhấp vào nút Gửi khi họ đăng nhập vào trang web giao dịch sẽ thực hiện giao dịch. Josh trở nên giàu có.
Một cách để ngăn chặn kiểu tấn công này là máy chủ yêu cầu các yêu cầu POST bao gồm bí mật do người dùng tạo trang web cụ thể. Bí mật sẽ được cung cấp bởi máy chủ khi gửi biểu mẫu web được sử dụng để thực hiện chuyển khoản. Cách tiếp cận này ngăn Josh tạo biểu mẫu của riêng mình vì anh ấy sẽ phải biết bí mật mà máy chủ đang cung cấp cho người dùng. Ngay cả khi anh ta tìm ra bí mật và tạo một biểu mẫu cho một người dùng cụ thể, anh ta sẽ không thể sử dụng cùng một biểu mẫu đó để tấn công mọi người dùng.
Các khung web thường bao gồm các cơ chế ngăn chặn CSRF như vậy.
Các mối đe dọa khác
Các cuộc tấn công/lỗ hổng phổ biến khác bao gồm:
- Clickjacking. Trong cuộc tấn công này, một người dùng độc hại chiếm quyền điều khiển các nhấp chuột dành cho một trang web cấp cao nhất có thể nhìn thấy và định tuyến chúng đến một trang ẩn bên dưới. Ví dụ, kỹ thuật này có thể được sử dụng để hiển thị một trang web ngân hàng hợp pháp nhưng thu thập thông tin xác thực đăng nhập vào một <iframe> vô hình do kẻ tấn công kiểm soát. Clickjacking cũng có thể được sử dụng để khiến người dùng nhấp vào một nút trên một trang web hiển thị, nhưng khi làm như vậy thực sự là vô tình nhấp vào một nút hoàn toàn khác. Để bảo vệ, trang web của bạn có thể ngăn không cho chính nó được nhúng trong iframe ở một trang web khác bằng cách đặt các tiêu đề HTTP thích hợp.
- Từ chối dịch vụ (DoS). DoS thường đạt được bằng cách làm tràn ngập trang web mục tiêu với các yêu cầu giả mạo để việc truy cập vào trang web bị gián đoạn đối với người dùng hợp pháp. Các yêu cầu có thể rất nhiều hoặc chúng có thể tiêu thụ một lượng lớn tài nguyên riêng lẻ (ví dụ: đọc chậm hoặc tải lên các tệp lớn). Phòng thủ DoS thường hoạt động bằng cách xác định và chặn lưu lượng “xấu” trong khi vẫn cho phép các thư hợp pháp đi qua. Các biện pháp bảo vệ này thường được đặt trước hoặc trong máy chủ web (chúng không phải là một phần của chính ứng dụng web).
- Directory Traversal (Tệp và tiết lộ). Trong cuộc tấn công này, một người dùng độc hại cố gắng truy cập vào các phần của hệ thống tệp máy chủ web mà họ không thể truy cập được. Lỗ hổng này xảy ra khi người dùng có thể chuyển tên tệp bao gồm các ký tự điều hướng hệ thống tệp (ví dụ: ../../).
Giải pháp là vệ sinh đầu vào trước khi sử dụng, bao gồm tập tin. Trong cuộc tấn công này, người dùng có thể chỉ định một tệp “không mong muốn” để hiển thị hoặc thực thi trong dữ liệu được truyền đến máy chủ. Khi được tải, tệp này có thể được thực thi trên máy chủ web hoặc phía máy khách (dẫn đến tấn công XSS). Giải pháp là vệ sinh đầu vào trước khi sử dụng.
Tiêm lệnh. Các cuộc tấn công chèn lệnh cho phép người dùng độc hại thực thi các lệnh hệ thống tùy ý trên hệ điều hành máy chủ. Giải pháp là làm sạch đầu vào của người dùng trước khi nó có thể được sử dụng trong các cuộc gọi hệ thống.
Để biết danh sách toàn diện về các mối đe dọa bảo mật trang web, hãy xem Thể loại: Khai thác bảo mật web (Wikipedia) và Thể loại: Tấn công (Dự án bảo mật ứng dụng web mở).
Một vài thông điệp chính
Hầu như tất cả các khai thác bảo mật trong các phần trước đều thành công khi ứng dụng web tin cậy dữ liệu từ trình duyệt. Dù bạn có làm gì khác để cải thiện tính bảo mật cho trang web của mình, thì bạn cũng nên làm sạch tất cả dữ liệu do người dùng tạo trước khi dữ liệu đó được hiển thị trong trình duyệt, được sử dụng trong các truy vấn SQL hoặc được chuyển đến một lệnh gọi hệ điều hành hoặc hệ thống tệp.
Một số bước cụ thể khác mà bạn có thể thực hiện là:
Sử dụng quản lý mật khẩu hiệu quả hơn. Khuyến khích mật khẩu mạnh. Xem xét xác thực hai yếu tố cho trang web của bạn, để ngoài mật khẩu, người dùng phải nhập một mã xác thực khác (thường là mã được gửi qua một số phần cứng vật lý mà chỉ người dùng mới có, chẳng hạn như mã trong SMS được gửi tới trang web của họ). điện thoại).
Định cấu hình máy chủ web của bạn để sử dụng HTTPS và HTTP Strict Transport Security (HSTS). HTTPS mã hóa dữ liệu được gửi giữa máy khách và máy chủ của bạn. Điều này đảm bảo rằng thông tin đăng nhập, cookie, dữ liệu yêu cầu POST và thông tin tiêu đề không dễ dàng có sẵn cho những kẻ tấn công.
Theo dõi các mối đe dọa phổ biến nhất (danh sách OWASP hiện tại ở đây) và giải quyết các lỗ hổng phổ biến nhất trước tiên.
Sử dụng các công cụ quét lỗ hổng để thực hiện kiểm tra bảo mật tự động trên trang web của bạn. Sau này, trang web rất thành công của bạn cũng có thể tìm thấy lỗi bằng cách cung cấp tiền thưởng cho lỗi như Mozilla đã làm ở đây.
Chỉ lưu trữ và hiển thị dữ liệu mà bạn cần. Ví dụ: nếu người dùng của bạn phải lưu trữ thông tin nhạy cảm như chi tiết thẻ tín dụng, thì chỉ hiển thị đủ số thẻ mà người dùng có thể nhận dạng và không đủ để kẻ tấn công có thể sao chép và sử dụng trên trang web khác. Mẫu phổ biến nhất tại thời điểm này là chỉ hiển thị 4 chữ số cuối của số thẻ tín dụng.
Các khung web có thể giúp giảm thiểu nhiều lỗ hổng phổ biến hơn.
Lời kết
Bài viết này đã giải thích khái niệm về bảo mật web và một số mối đe dọa phổ biến hơn mà trang web của bạn nên cố gắng bảo vệ. Quan trọng nhất, bạn nên hiểu rằng một ứng dụng web không thể tin cậy bất kỳ dữ liệu nào từ trình duyệt web. Tất cả dữ liệu người dùng phải được khử trùng trước khi hiển thị hoặc sử dụng trong truy vấn SQL và lệnh gọi hệ thống tệp.
Với bài viết này, bạn đã đi đến phần cuối của mô-đun này, bao gồm các bước đầu tiên của bạn trong lập trình trang web phía máy chủ. Chúng tôi hy vọng bạn thích học những khái niệm cơ bản này và bây giờ bạn đã sẵn sàng chọn một Web Framework và bắt đầu lập trình.
CÔNG TY CP ĐÀO TẠO VÀ HUẤN LUYỆN PHÁT TRIỂN DOANH NGHIỆP TC
Fanpage: www.facebook.com/ChuyendoisoDoanhNghiepToandien
Website: hosting.org.vn
Hotline: 1900 2929 44 (Phím 3)
Số điện thoại: 0868 77 39 39
Địa chỉ: 745 Nguyễn Kiệm, Phường 3, Quận Gò Vấp, Tp Hồ Chí Minh