1. Trang chủ
  2. » Luận Văn - Báo Cáo

Đồ án tốt nghiệp nghiên cứu giải pháp bảo mật trong ứng dụng ruby on rails

51 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Nghiên cứu giải pháp bảo mật trong ứng dụng ruby on rails
Tác giả Trần Quốc Hiệp
Người hướng dẫn ThS. Đinh Hoàng Gia
Trường học Học Viện Kỹ Thuật Mật Mã
Chuyên ngành An toàn thông tin
Thể loại Đồ án tốt nghiệp
Năm xuất bản 2022
Thành phố TP.HCM
Định dạng
Số trang 51
Dung lượng 6,6 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Cấu trúc

  • CHƯƠNG 1: TỔNG QUAN VỀ RUBY ON RAILS (9)
    • 1. Giới thiệu sơ lược về Ruby on Rails (9)
      • 1.1. Giới thiệu chung (9)
  • CHƯƠNG 2: CÁC LỖ HỔNG VÀ CÁCH NGĂN CHẶN (22)
    • 2.1. Mass Assignment (22)
    • 2.2. SQL Injection (26)
    • 2.3. XSS (Cross-site scripting) (29)
    • 2.4. Form Hijacking (Cross-Site Request Forgery - CSRF) (36)
  • CHƯƠNG 3: XÂY DỰNG ỨNG DỤNG RUBY ON RAILS (39)
    • 1. Đặt vấn đề (39)
    • 2. Triển khai (40)
    • 3. Kết quả và kết quả thực nghiệm (51)
  • Tài Liệu Tham Khảo (51)

Nội dung

Vì vậy, bảo mật thông tin luôn là vấn đề khiến nhiều người lo ngại nhất khi thực hiện hoạt động nào đó trên mạng internet, ví dụ: giao dịch, mua bán trên các trang thương mại điện tử,…Nh

TỔNG QUAN VỀ RUBY ON RAILS

Giới thiệu sơ lược về Ruby on Rails

Ruby là một ngôn ngữ lập trình mạnh mẽ, nổi bật với kiến trúc linh hoạt và mô hình lập trình hướng đối tượng Nó cung cấp nhiều tiện ích và tính năng nổi bật, giúp lập trình viên phát triển ứng dụng một cách hiệu quả và dễ dàng Với cú pháp đơn giản và rõ ràng, Ruby hỗ trợ việc xây dựng các ứng dụng web và phần mềm phức tạp, đồng thời khuyến khích phong cách lập trình sáng tạo và năng động.

Trong chương này, em nên tổng quan về các rủi ro và mất an toàn liên quan đến ba yếu tố chính: (1) Tính xác thực và toàn vẹn, đảm bảo nguồn gốc và ngăn chặn lừa đảo, đồng thời giữ cho dữ liệu không bị sửa đổi; (2) Tính bí mật, bảo vệ thông tin nhạy cảm khỏi việc bị xem trộm; và (3) Tính sẵn sàng, đảm bảo hệ thống luôn hoạt động hiệu quả Những thông tin này sẽ tạo nền tảng cho chương 2 Chương 2 sẽ được sửa lại thành: "ĐẢM BẢO AN TOÀN CHO ỨNG DỤNG WEB DỰA TRÊN RUBY", giúp nội dung trở nên logic hơn.

Chương 2 thì em đưa những giải pháp của thằng RUBY vào

Chương 3 thì để nội dung DEMO, hoặc TRIỂN KHAI THỬ NGHIỆM, và cần nêu bật được KẾT QUẢ đã làm được gì, chống được tấn công gì

Ruby on Rails, hay còn gọi là Rails, là một bộ khung ứng dụng web được phát triển bằng ngôn ngữ Ruby, lần đầu tiên ra mắt vào tháng 8 năm 2004 bởi David Hanson, người Đan Mạch Phiên bản hiện tại của Rails là 7.0.2.3 Rails là một full-stack framework theo mô hình MVC, tích hợp cả web server và kết nối cơ sở dữ liệu, giúp xây dựng các ứng dụng web một cách hiệu quả.

Ruby on Rails là framework phổ biến nhất trong cộng đồng lập trình viên Ruby, chiếm 86% thị phần theo số liệu của JetBrains năm 2021, trong khi Sinatra chỉ chiếm 20%.

Điểm khác biệt nổi bật của Ruby on Rails (RoR) so với các framework khác là khả năng cung cấp đầy đủ các chức năng như gửi mail, xác thực dữ liệu và tính linh động cho cả các dự án nhỏ và lớn Hơn nữa, RoR được hỗ trợ bởi một cộng đồng lớn với nhiều Gem hữu ích, giúp việc phát triển tính năng trở nên dễ dàng và hiệu quả hơn.

Ban đầu chúng ta cần tạo một project rails, quá trình tạo như sau: rails new simple-new

Thư mục app trong ứng dụng chứa nhiều thành phần quan trọng như controllers, models, views, helpers, mailers và assets Controllers điều hướng luồng chạy của ứng dụng, trong khi models tương tác với cơ sở dữ liệu Views được sử dụng để hiển thị nội dung trang web, còn helpers chứa các hàm hỗ trợ cho controllers, views hoặc models Assets lưu trữ các tệp hình ảnh, JavaScript và CSS, trong khi mailers chứa các hàm gửi mail cho ứng dụng.

Thư mục bin: chứa các file để khởi động ứng dụng RoR hoặc dùng để thiết lập hay deploy

Thư mục config: Dùng để cấu hình ứng dụng như cấu hình các thông số của database, định nghĩa các routes

Thư mục db: Chứa các tập tin dùng để tạo cấu trúc schema cho database và các tập tin migrations.

Thư mục lib chứa các thư viện cần thiết cho ứng dụng, thường được phát triển bởi các lập trình viên tham gia vào quá trình viết ứng dụng.

Thư mục log: Chứa các bản ghi log các thông tin trong quá trình cài đặt, khởi động, chạy hay ngừng ứng dụng.

The node_modules directory contains functional files generated by Node.js, while the public directory holds common files for the web application This typically includes a sitemap and handles various HTTP errors such as 404, 402, and 500, along with essential files like favicon and robots.txt.

Thư mục test: Đây là folder chứa source test cho dự án hoặc bạn dùng Rspec thì sẽ có một folder spec.

Thư mục tmp: Đây được coi những một nơi chứa toàn bộ cache của dự án như build assets, mail nếu bạn dùng open_letterer.

Thư mục vendor: Đay là nơi chứa các thư viện của bên thứ 3 như là cho javascript.

Tập tin config.ru: Tập tin này dùng để cấu hình cho Rack server nếu sử dụng Rack để chạy ứng dụng.

Tập tin Gemfile là nơi liệt kê các gem cần thiết cho ứng dụng, trong khi Gemfile.lock ghi lại thông tin chi tiết về quá trình cài đặt các gem đó.

Tập tin Rakefile trong Rails được sử dụng để xác định các tác vụ có thể thực hiện qua dòng lệnh với rake Thay vì định nghĩa trực tiếp các tác vụ trong Rakefile, bạn nên định nghĩa chúng thông qua các tập tin trong thư mục lib/tasks.

Trên là một số thư mục, tập tin quan trọng mà ta cần phải biết

1.3 Cách hoạt động của mô hình MVC

Rails áp dụng mô hình MVC (Model – View – Controller), tương tự như nhiều ngôn ngữ lập trình khác MVC là một kiến trúc phần mềm nổi tiếng trong kỹ thuật phần mềm, giúp các lập trình viên phân chia ứng dụng thành ba phần riêng biệt: Model, View và Controller Mỗi phần đảm nhận một nhiệm vụ độc lập, góp phần tạo nên sự tổ chức và hiệu quả trong phát triển phần mềm.

Thành phần Model là phần quan trọng trong kiến trúc ứng dụng, bao gồm tất cả các nghiệp vụ logic, truy xuất cơ sở dữ liệu, và các phương thức xử lý Nó cũng bao gồm các đối tượng mô tả dữ liệu như Class và hàm xử lý, giúp tổ chức và quản lý dữ liệu một cách hiệu quả.

Thành phần View chịu trách nhiệm hiển thị thông tin và tương tác với người dùng, bao gồm tất cả các đối tượng giao diện người dùng (GUI) như textbox, hình ảnh, và các thành phần khác Nói một cách đơn giản, View là tập hợp của tất cả các form và file HTML.

Thành phần Controller là một phần quan trọng trong ứng dụng, chịu trách nhiệm nhận và xử lý các yêu cầu từ người dùng Nó thực hiện việc điều hướng các yêu cầu thông qua việc gọi đúng các phương thức cần thiết Ví dụ, Controller sẽ nhận request từ URL và form để tương tác trực tiếp với Model, đảm bảo các thao tác được thực hiện một cách chính xác và hiệu quả.

Cách hoạt động của chúng được biểu diễn như hình dưới đây:

Người dùng tương tác với giao diện bằng cách nhấn nút, từ đó gửi yêu cầu Controller sẽ nhận yêu cầu này và chuyển hướng đến phương thức xử lý phù hợp trong Model.

Model sẽ làm nhiệm vụ nhận thông tin và thực thi các yêu cầu.

Khi Model hoàn tất việc xử lý, View sẽ nhận kết quả từ Model & hiển thị lại cho người dùng.

2 Giới thiệu về các Gem phổ biến

CÁC LỖ HỔNG VÀ CÁCH NGĂN CHẶN

Mass Assignment

Lỗi bảo mật mass assignment là một trong những vấn đề phổ biến nhất, xảy ra khi hacker cố gắng cập nhật nhiều trường trong cơ sở dữ liệu cùng lúc Hành vi này bao gồm cả việc sửa đổi những trường không được phép thay đổi với quyền truy cập của người dùng thông thường.

Ví dụ: ta có form sửa thông tin user:

Và đây là file controller

2 @user.=.User.find(params[:id])

3 @user.update_attributes(params[:user]) if

Dù bề ngoài có vẻ bình thường, nhưng thực tế lại tiềm ẩn một lỗ hổng bảo mật nghiêm trọng Nếu trong bảng người dùng có một quản trị viên, tên tin tặc có thể dễ dàng sửa đổi thông tin này chỉ bằng cách thêm một trường ẩn vào trang.

Điều gì sẽ xảy ra, lúc này, params được gửi từ form sẽ là

{"name"=>"hiep", "username"=>"hiep", "admin"=>"true"}

Việc thay đổi thông tin dưới quyền admin có thể gây ra những rủi ro lớn, đặc biệt nếu tin tặc có thể chỉnh sửa dữ liệu của toàn bộ người dùng trong cơ sở dữ liệu Nếu mật khẩu không được bảo mật chặt chẽ, tin tặc có khả năng thay đổi cả mật khẩu của người dùng Một ví dụ điển hình là đường link dẫn đến trang thay đổi thông tin cá nhân: https://example.com/user/edit/30.

Để thay đổi thông tin của người dùng khác, bạn chỉ cần thay số 30 trong URL bằng số ID của người dùng mà bạn muốn chỉnh sửa Tuy nhiên, vì không phải là quản trị viên, bạn không có quyền thực hiện thay đổi này Bằng cách khai thác lỗ hổng Mass Assignment, bạn có thể chỉnh sửa thông tin trực tiếp trên URL, ví dụ: https://example.com/user/edit/40?user=”hoang”&username=”abc”&admin=”true”.

Như vậy là ta có thể thay đổi thông tin người dùng bằng lỗ hổng Mass Assignment rồi

Kể từ Rails 4, tính năng strong parameters đã được giới thiệu để ngăn chặn lỗ hổng bảo mật bằng cách chỉ cho phép những tham số nhất định mà chúng ta định nghĩa Nhờ đó, các tham số không được phép thêm vào trong form sẽ bị từ chối, giúp tăng cường an toàn cho ứng dụng.

2 @user.=.User.find(params[:id])

3 @user.update_attributes(user_params) if

13 params.require(:user).permit(:name,.:surname)

14 end Đó là cách khắc phục nhanh nhất cho lỗ hổng này, đối với những phiên bản rails cũ hơn 4, thì có cách khắc phục khác đó là attr_accessible và attr_protected có thể được sử dụng để giới hạn việc lỗi này Tuy nhiên, Brakeman sẽ cảnh báo trừ khi sử dụng attr_accessible hoặc việc mass assignment hoàn toàn bị vô hiệu hóa

Có hai loại cảnh báo mass assignment có thể xảy ra Cảnh báo đầu tiên xuất hiện khi việc mass assignment diễn ra thực sự, như trong ví dụ đã nêu.

Unprotected mass assignment near line 61: User.new(params[:user])

Cảnh báo sẽ được đưa ra khi phát hiện mô hình không sử dụng attr_accessible, dẫn đến việc xuất hiện các cảnh báo chung chung.

Mass assignment is not restricted using attr_accessible attr_protected: The BlackList

Sử dụg attr_protected, bạn có thể chỉ định trường nào không thể được truyền vào

2 attr_protected.:can_fire_missiles

Bây giờ, bất kỳ nỗ lực nào để truyền thuộc tính can_fire_missiles sẽ không thành công. attr_accessible: The WhiteList

Vấn đề với attr_protected là tính khả thi của nó bị hạn chế, vì chúng ta không thể dự đoán được các trường mà hacker có thể thêm vào Để khắc phục điều này, attr_accessible được sử dụng, cho phép chỉ định rõ ràng các thuộc tính mà bạn muốn cho phép truyền vào.

Như vậy, chúng ta có thể chuyển cột users của mình sang cách tiếp cận này:

2 attr_accessible.:first,.:last,.:email

Chúng tôi đã liệt kê rõ ràng các tham số được phép truyền vào, và mọi tham số khác sẽ bị từ chối Lợi ích của việc này là nếu chúng ta thêm params[:admin] vào danh sách người dùng, tham số này sẽ tự động bị loại bỏ vì nó không nằm trong danh sách cho phép.

Theo nguyên tắc chung, bạn nên sử dụng attr_accessible hơn attr_protected, vì nó giúp bạn thận trọng hơn.

SQL Injection

SQL Injection là một kỹ thuật tấn công khai thác lỗ hổng trong câu truy vấn của ứng dụng bằng cách chèn thêm mã SQL, từ đó làm sai lệch câu lệnh gốc Kỹ thuật này cho phép kẻ tấn công truy cập và khai thác dữ liệu từ cơ sở dữ liệu, thậm chí thực hiện các thao tác giống như một quản trị viên web.

SQL Injections là một phương thức tấn công nhằm truy cập vào dữ liệu nhạy cảm mà người dùng không có quyền thay đổi Tuy nhiên, trong hầu hết các trường hợp, các lập trình viên Rails được bảo vệ hiệu quả khỏi các cuộc tấn công này.

Trong các ứng dụng Ruby on Rails, bạn thường không cần viết truy vấn SQL thô vì Rails cung cấp thư viện "Active Records" với các phương thức đơn giản để tương tác với cơ sở dữ liệu Mặc dù hầu hết các phương thức này không dễ bị SQL injection, nhưng vẫn có một số phương thức có thể gặp rủi ro Do đó, bạn cần chú ý đến cách xây dựng các truy vấn cơ sở dữ liệu trong Ruby on Rails để đảm bảo an toàn.

Ví dụ ta có câu truy vấn được viết trong controller để gọi tới model từ đó có thể truy xuất dữ liệu bên trong database:

User.where("username = '#{params[:username]'")

Giả sử params[:username] = “ test ”

Thì câu quy vấn được sinh ra lúc này sẽ là:

Một câu lệnh bình thường nhưng lại không bình thường, hacker có thể lợi dụng sơ hở này bằng cách truyền vào một mệnh đề luôn đúng như

Câu truy vấn được sinh ra sau đó:

Câu truy vấn tìm kiếm username bằng rỗng hoặc TRUE sẽ trả về tất cả người dùng, dẫn đến những hậu quả nghiêm trọng Mặc dù đây có vẻ là một lỗi nhỏ, nhưng tác động của nó lại rất lớn.

SQL Injection có thể dẫn đến hậu quả nghiêm trọng nhất là làm lộ dữ liệu trong cơ sở dữ liệu Mức độ nghiêm trọng của hậu quả này phụ thuộc vào tầm quan trọng của dữ liệu, có thể từ nhẹ đến rất nghiêm trọng.

Lộ dữ liệu khách hàng có thể gây ra hậu quả nghiêm trọng cho công ty, ảnh hưởng xấu đến hình ảnh thương hiệu và khiến khách hàng chuyển sang dịch vụ đối thủ, thậm chí dẫn đến nguy cơ phá sản.

Lỗ hổng bảo mật này ảnh hưởng nghiêm trọng đến người dùng, bởi vì nhiều người thường sử dụng chung một mật khẩu cho nhiều tài khoản Khi một mật khẩu bị lộ, các tài khoản khác cũng sẽ gặp nguy hiểm Do đó, việc mã hóa mật khẩu là rất quan trọng; nếu cơ sở dữ liệu bị tấn công, người dùng vẫn có thể bảo vệ được mật khẩu của mình.

Hacker không chỉ có khả năng đọc dữ liệu mà còn có thể chỉnh sửa nó, thậm chí đăng nhập với quyền admin để lợi dụng hệ thống Điều này có thể dẫn đến việc xóa toàn bộ dữ liệu, khiến hệ thống ngừng hoạt động.

Cách ngăn chặn lỗi SQL injection trong ứng dụng Ruby on Rails cũng khá đơn giản:

1 Khi tìm / lấy thông tin từ cơ sở dữ liệu, nên sử dụng các công cụ tìm dựa trên thuộc tính động để tránh các lỗ hổng SQL Injection Các truy vấn này hoạt động như các truy vấn được tham số hóa và xử lý đối số được truyền vào Hãy minh họa quan điểm bằng một ví dụ:

User.find_by(username:.params[:username]).#.Cách thông thường

User.find_by_username(username).#.Công cụ tìm động

2 Luôn kiểm tra và mã hoá mật khẩu người dùng dưới cơ sở dữ liệu để tránh tối đa việc bị mất tài khoản, thông tin quan trọng của họ

3 Không sử dụng những câu lệnh truyền trực tiếp username hoặc password vào, ví dụ:

User.where(“username = ‘#{params[:username]}’”)

Thay vào đó sử dụng hàm mã hoá câu lệnh sql do rails cung cấp

User.where(username: params[:username])

User.where([“username = ?”, “#{params[:username]}”])

Với cách này Không thể sử dụng SQL Injection khi sử dụng phần tử trên, vì phần tử đầu tiên của mảng là một bản mẫu

4 Lọc đầu vào của người dùng, không chấp nhận những kí tự nháy đơn hay nháy kép, hoa thị,…

5 Ngoài ra để phát hiện trong quá trình phát triển ứng dụng Rails, ta có dính phải những lỗi về bảo mật hay không, ta nên dùng gem Brakeman để kiểm tra, dưới đây là kết quả khi ứng dụng dính lỗi SQL injection

Nó chỉ ra lỗi rõ ràng và lỗi ở dòng nào, file nào, lỗi như nào Rất tiện lợi để kiểm tra

Để bảo vệ hệ thống của bạn khỏi các tấn công, luôn luôn tham số hóa hoặc tuần tự hóa đầu vào của người dùng trước khi xử lý ở phía back-end Điều này không chỉ giúp ngăn chặn SQL injection mà còn các loại tấn công khác Lỗ hổng SQL rất nguy hiểm, có thể dẫn đến việc xóa dữ liệu trong cơ sở dữ liệu và đánh cắp thông tin nhạy cảm của người dùng Ngăn chặn SQL injection chỉ cần thay đổi một vài dòng mã, vì vậy hãy đảm bảo thực hiện điều này để bảo vệ an toàn cho dữ liệu của bạn.

XSS (Cross-site scripting)

Bảo mật ứng dụng web hiện nay là điều thiết yếu, vì nhiều bot đang cố gắng khai thác các trang web trên Internet, khiến cả những trang mới cũng dễ trở thành mục tiêu của các cuộc tấn công mạng Một trong những hình thức tấn công phổ biến là Cross-site scripting (XSS), một kiểu tấn công tiêm, trong đó kẻ tấn công chèn mã độc vào ứng dụng, và mã này sẽ được thực thi trên máy của nạn nhân.

XSS là một trong những loại tấn công phổ biến nhất, do đó, việc bảo vệ các ứng dụng của bạn khỏi lỗ hổng này là rất quan trọng Nếu bạn muốn tìm hiểu sâu hơn về các cuộc tấn công XSS, hãy tham khảo tổng quan chi tiết dưới đây.

XSS (Cross-Site Scripting) là một loại lỗ hổng bảo mật phổ biến trên các trang web, xảy ra khi người dùng có thể chèn mã JavaScript vào biểu mẫu Ví dụ, nếu một trang web yêu cầu người dùng nhập tên và họ lại nhập mã JavaScript thay vì một chuỗi văn bản đơn giản, điều này có thể dẫn đến những hậu quả nghiêm trọng như đánh cắp thông tin hoặc tấn công vào người dùng khác.

alert("This is a XSS attack!")

Nếu sau khi gửi biểu mẫu, bạn thấy cửa sổ bật lên trong trình duyệt, điều này cho thấy ứng dụng của bạn có thể bị tấn công XSS Mặc dù một cửa sổ bật lên đơn giản không gây ra rủi ro thực sự, nhưng kẻ tấn công có thể sử dụng mã JavaScript để đánh cắp thông tin đăng nhập của người dùng hoặc chiếm quyền điều khiển phiên của họ Điều này có thể dẫn đến việc kẻ tấn công tải cookie của người dùng và gửi chúng đến máy chủ của mình mà người dùng không hề hay biết.

Rails đã tích hợp tính năng ngăn chặn XSS bằng cách tự động escape tất cả dữ liệu gửi từ Rails đến đầu ra HTML Tuy nhiên, điều này không ngăn chặn hoàn toàn các cuộc tấn công XSS, vì việc dán mã JavaScript vào trường văn bản vẫn có thể dẫn đến XSS Khi sử dụng các thẻ HTML hợp lệ cho script(), trình duyệt của nạn nhân sẽ hiểu mã này như bất kỳ mã HTML nào khác, mà không nhận ra rằng nó đến từ kẻ tấn công thay vì từ máy chủ.

Khi chúng ta nói rằng Rails tự động escape đầu ra HTML, điều đó có nghĩa là Rails chuyển đổi các thẻ mở, thẻ đóng và các ký tự đặc biệt thành các ký tự an toàn hơn Chẳng hạn, ký tự mở thẻ HTML “

Ngày đăng: 15/02/2025, 22:18

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm