0

Session 4 - Securing Software: Đừng bao giờ tin tưởng dữ liệu đầu vào!

Session 4 - Securing Software

Mục tiêu của Session

Qua ba Session trước, chúng ta đã tìm hiểu:

  • Session 1: Bảo vệ tài khoản.
  • Session 2: Bảo vệ dữ liệu.
  • Session 3: Bảo vệ hệ thống và mạng.

Đến Session 4, trọng tâm chuyển sang bảo vệ chính phần mềm.

Đây là một trong những Session mình đánh giá hay nhất vì nó giới thiệu một nguyên tắc mà gần như mọi lập trình viên đều phải ghi nhớ:

Never Trust User Input

Đừng bao giờ tin tưởng dữ liệu do người dùng gửi lên.

Cho dù bạn là Developer hay End User, việc hiểu những kỹ thuật tấn công phổ biến sẽ giúp bạn xây dựng phần mềm an toàn hơn và tránh trở thành nạn nhân của các cuộc tấn công mạng.

1. Phishing

Khi những gì bạn nhìn thấy không phải là nơi bạn sẽ đến

Website được xây dựng bằng HTML.

Một đường dẫn thông thường có dạng:

<a href="https://harvard.edu">Harvard</a>

Người dùng nhìn thấy:

Harvard

và khi nhấn vào sẽ được chuyển tới:

https://harvard.edu

Vấn đề nằm ở đâu?

HTML cho phép phần hiển thịđịa chỉ thực sự hoàn toàn khác nhau.

Ví dụ:

<a href="https://evil.com">
https://harvard.edu
</a>

Người dùng sẽ thấy:

https://harvard.edu

Nhưng khi nhấn vào lại bị chuyển tới:

https://evil.com

hoặc một website giả mạo có giao diện gần như giống hệt.

Cách phòng tránh

Trước khi nhấn vào bất kỳ liên kết nào:

  • Di chuột (Hover) lên đường link.
  • Kiểm tra URL thật ở góc dưới trình duyệt.
  • Quan sát kỹ tên miền.

Ví dụ:

google.com

khác hoàn toàn với

g00gle.com

hay

gooogle.com

2. Cross-Site Scripting (XSS)

Một website tìm kiếm thường hiển thị:

Bạn đã tìm kiếm:

cats

Nếu website chỉ đơn giản in dữ liệu người dùng nhập vào:

cats

thì không có vấn đề.

Điều gì xảy ra nếu người dùng nhập JavaScript?

Ví dụ:

<script>
alert("attack")
</script>

Nếu website không xử lý dữ liệu đúng cách.

Trình duyệt sẽ hiểu đây là mã JavaScript và thực thi ngay lập tức.

User Input

↓

Website

↓

Browser

↓

Execute JavaScript

Đây chính là:

Cross-Site Scripting (XSS)

Hacker có thể làm gì?

Thông qua XSS, hacker có thể:

  • Đánh cắp Session Cookie.
  • Thay đổi giao diện website.
  • Gửi request thay người dùng.
  • Chèn mã độc vào trang web.

Nếu Cookie bị đánh cắp.

Hacker hoàn toàn có thể thực hiện:

Session Hijacking

như chúng ta đã học ở Session trước.

3. SQL Injection (SQLi)

Đây là một trong những lỗ hổng nổi tiếng nhất trong lịch sử bảo mật.

Giả sử website kiểm tra đăng nhập bằng câu lệnh:

SELECT *
FROM users
WHERE username='...'
AND password='...';

Điều gì xảy ra nếu hacker nhập:

' OR '1'='1

Câu lệnh sẽ trở thành:

SELECT *
FROM users
WHERE username='admin'
AND password=''
OR '1'='1';

Do:

1 = 1

luôn đúng.

Database có thể trả về kết quả hợp lệ.

Hacker đăng nhập thành công mà không cần biết mật khẩu.

Nguy hiểm hơn

Nếu ứng dụng viết không an toàn.

Hacker còn có thể:

DROP TABLE users;

hoặc

DELETE FROM users;

để xóa toàn bộ dữ liệu.

4. Client-side Validation không đủ

Nhiều lập trình viên sử dụng HTML để ngăn người dùng nhập sai.

Ví dụ:

<input required>

hoặc

<button disabled>

Nhìn có vẻ an toàn. Thực tế thì không.

Developer Tools

Chỉ cần nhấn:

F12

Người dùng có thể chỉnh sửa HTML ngay trên trình duyệt.

Ví dụ:

disabled

↓

(xóa)

↓

Button hoạt động

hoặc

required

↓

(xóa)

↓

Submit

HTML chỉ tồn tại trên máy của người dùng.

Người dùng hoàn toàn có quyền sửa nó.

Bài học quan trọng

Client-side Validation chỉ giúp:

  • Trải nghiệm người dùng tốt hơn.
  • Giảm lỗi nhập liệu.

Không có giá trị bảo mật.

Mọi dữ liệu gửi lên Server đều phải được kiểm tra lại.

Đây gọi là:

Server-side Validation

5. Cross-Site Request Forgery (CSRF)

CSRF là một kiểu tấn công rất thông minh.

Hacker không cần đánh cắp tài khoản.

Họ chỉ lợi dụng việc:

Bạn đã đăng nhập sẵn.

Ví dụ.

Website có API:

https://shop.com/buy?id=100

Hacker tạo một website khác:

<img src="https://shop.com/buy?id=100">

Khi trình duyệt tải hình ảnh.

Nó sẽ tự động gửi request.

Nếu bạn vẫn còn đăng nhập.

Website sẽ nghĩ:

Đây là yêu cầu của chủ tài khoản.

và tiến hành mua hàng.

Cách phòng chống

Hầu hết framework hiện đại đều sử dụng:

CSRF Token

Mỗi Form sẽ có một Token ngẫu nhiên.

Form

↓

CSRF Token

↓

Server kiểm tra

↓

Token đúng

↓

Request hợp lệ

Website khác sẽ không thể biết Token này.

6. Viết phần mềm an toàn

Chống XSS

Không bao giờ hiển thị trực tiếp dữ liệu người dùng.

Thay vào đó.

Escape các ký tự đặc biệt.

Ví dụ:

<

thành

&lt;

>

thành

&gt;

Trình duyệt sẽ hiểu đây là văn bản.

Không phải mã HTML.

Chống SQL Injection

Không nối chuỗi SQL.

Thay vào đó.

Luôn sử dụng:

  • Prepared Statement
  • Parameterized Query

Database sẽ tự xử lý dữ liệu đầu vào an toàn.

Chống CSRF

Sử dụng:

  • CSRF Token
  • SameSite Cookie
  • Kiểm tra Origin hoặc Referer khi cần

Đây đều là những cơ chế được hầu hết framework hiện đại hỗ trợ.

7. Cài đặt phần mềm an toàn

Không phải mọi ứng dụng trên Internet đều đáng tin cậy.

Một phần mềm độc hại có thể khai thác các lỗi như:

Buffer Overflow

để ghi đè bộ nhớ và chiếm quyền điều khiển hệ thống.

Digital Signature

Các kho ứng dụng chính thống như:

  • Apple App Store
  • Google Play
  • Microsoft Store

đều yêu cầu ứng dụng được ký bằng:

Digital Signature

Điều này giúp đảm bảo:

  • Phần mềm đúng từ nhà phát triển.
  • Không bị chỉnh sửa trong quá trình phát hành.
  • Khó bị cài cắm mã độc.

Tổng kết Session

Sau Session này, mình hiểu được:

  • Không bao giờ được tin tưởng dữ liệu người dùng nhập vào.
  • HTML có thể bị lợi dụng để thực hiện các cuộc tấn công Phishing.
  • XSS cho phép hacker chèn JavaScript độc hại vào website.
  • SQL Injection có thể làm lộ hoặc phá hủy toàn bộ cơ sở dữ liệu.
  • Client-side Validation không thể thay thế Server-side Validation.
  • CSRF lợi dụng phiên đăng nhập của người dùng để thực hiện các hành động ngoài ý muốn.
  • Việc sử dụng Prepared Statements, Character Escaping và CSRF Token là những kỹ thuật cơ bản nhưng cực kỳ quan trọng đối với mọi Developer.

Những việc mình sẽ áp dụng ngay

Với tư cách người dùng

  • [ ] Luôn kiểm tra URL thật trước khi nhấn vào bất kỳ liên kết nào.
  • [ ] Chỉ cài đặt phần mềm từ App Store, Google Play, Microsoft Store hoặc nguồn chính thức của nhà phát triển.
  • [ ] Hạn chế sử dụng phần mềm crack hoặc các bản cài đặt không rõ nguồn gốc.

Với tư cách Developer

  • [ ] Không bao giờ tin tưởng dữ liệu từ người dùng.
  • [ ] Luôn kiểm tra dữ liệu ở phía Server.
  • [ ] Sử dụng Prepared Statements thay vì nối chuỗi SQL.
  • [ ] Escape dữ liệu trước khi hiển thị lên giao diện.
  • [ ] Bật CSRF Protection cho tất cả Form quan trọng.

Nguồn học tập

  • Harvard CS50's Introduction to Cybersecurity
  • Session 4 – Securing Software

Sau bốn Session, khóa học đã lần lượt đi qua những lớp bảo vệ quan trọng nhất của một hệ thống:

  • Session 1: Securing Accounts
  • Session 2: Securing Data
  • Session 3: Securing Systems
  • Session 4: Securing Software

Session cuối cùng, chúng ta sẽ chuyển sang chủ đề Preserving Privacy. Hẹn gặp mọi người ở bài viết tiếp theo!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí