12/09/2019, 14:11

Các lỗ hổng thường gặp và cách thực hiện lập trình an toàn trong phát triển ứng dụng web (P1)

Người viết: maiphuoctung 1. Kiểm soát truy vấn cơ sỡ dữ liệu để tránh lỗ hổng SQL Injection – Nguy cơ: Khi truy vấn tới cơ sở dữ liệu, lập trình viên thường sử dụng cách cộng xâu Input từ người dùng, các câu truy vấn này có thể bị mắc lỗi SQL Injection hoặc HQL Injection (nếu ...

Người viết: maiphuoctung

1. Kiểm soát truy vấn cơ sỡ dữ liệu để tránh lỗ hổng SQL Injection

– Nguy cơ: Khi truy vấn tới cơ sở dữ liệu, lập trình viên thường sử dụng cách cộng xâu Input từ người dùng, các câu truy vấn này có thể bị mắc lỗi SQL Injection hoặc HQL Injection (nếu sử dụng Hibernate). Bằng việc lợi dụng các lỗi này, kẻ tấn công có thể xem, sửa, xóa dữ liệu trong database, từ đó chiếm được tài khoản admin, lấy cắp thông tin người dùng ….

– Phòng chống:

  • Truy vấn SQL phải dùng PrepareStatement, tất cả tham số phải được add bằng hàm (setParam…), không được sử dụng cách cộng xâu trong truy vấn.
  • Với một số trường hợp sử dụng ORDER BY, không thể dùng được hàm setParam thì có thể định nghĩa một mảng chứa toàn bộ các column (field) cần ORDER BY gọi là whitelist. Mỗi khi cần ORDER BY thì kiểm tra lại xem column (field) đó có thuộc mảng whitelist đã định nghĩa không. Ví dụ 1: Đoạn code kiểm tra đăng nhập với username/password do người dùng nhập vào:
  • Với đoạn code trên, khi nhập vào username là test’ or ‘1’=’1 thì câu query sẽ là: select from users where username=’test’ or ‘1’=’1′ and password=’…’. Mệnh đề where sẽ tương đương với user_name = ‘test’. Như vậy, dù không có password vẫn đăng nhập được vào hệ thống.
  • Sửa đoạn code trên lại như sau, với userName và password được tham số hóa khi đưa vào câu truy vấn sẽ tránh được lỗi SQL Injection:

Ví dụ 2: Một số trường hợp không thể ngăn chặn được lỗi SQL Injection qua lệnh “order by”. Do không sử dụng được hàm setParam thì có thể sử dụng phương pháp sau:

Có thể bạn quan tâm

67 công cụ hữu ích, thư viện và tài nguyên để tiết kiệm thời gian cho web developer

Từ MVC đến các Modern Web Framework

2. Xử lý dữ liệu đầu vào để tránh lỗ hổng XSS

– Nguy cơ: Kết quả server trả về cho người dùng chủ yếu dưới dạng HTML. Nội dung trả về thường bao gồm cả những giá trị mà người dùng nhập vào hệ thống có thể bị mắc lỗi XSS nếu không kiểm soát dữ liệu đầu vào. XSS (Cross-Site Scripting) là một kỹ thuật tấn công bằng cách chèn vào các website động (JSP, ASP, PHP …) những thẻ HTML hay những đoạn mã script nguy hiểm có thể gây nguy hại cho những người sử dụng khác. Trong đó, những đoạn mã nguy hiểm được chèn vào hầu hết được viết bằng Cross-Site Scrip như JavaScript, JScript, DHTML và cũng có thể là cả các thẻ HTML.

– Phòng chống:

  • Encode dưới dạng HTML các ký tự đặc biệt do client gửi đến bao gồm: <,>,&,’,”,/ trong các trường hợp
    • Dữ liệu client gửi lên máy chủ.
    • Dữ liệu lấy ra từ database khi trả về cho client. Bảng chất của việc encode là thay thế các ký tự trên bằng chuỗi tương ứng trong bảng bên dưới:

Ví dụ 1: Trang JSP bên dưới hiển thị lên lời chào với tên người dùng được lấy từ client

  • Khi nhập vào địa chỉ trình duyệt http://localhost/example?user=abc thì trên trình duyệt sẽ hiện thị dòng Hello abc!
  • Khi nhập vào địa chỉ trình duyệt http://localhost/example?user=abc<script>alert('XSS')</script> thì trên trình duyệt sẽ thực hiện đoạn JavaScript thông báo XSS.
  • Để khắc phục lỗi này ta có thể dùng thư viên JSTL để encode HTML biến user

Mình xin tạm dừng bài viết tại đây! Trong bài sau, mình sẽ nói tiếp với “Sử dụng token để tránh lỗ hổng CSRF” và “Kiểm soát file upload lên hệ thống.”

Techtalk via Viblo

0