https://github.com/nguyen-cong-thanh.png

An toàn thông tin cơ bản – Bài 2: Tư duy bảo mật

Nhà bạn có một cửa chính chắc chắn, khóa ba chốt. Nhưng cửa sổ phòng tắm ở tầng hai không bao giờ đóng, và chìa khóa dự phòng nằm dưới chậu cây ngay cạnh cửa. Bạn không hề cẩu thả: bạn chỉ quen nhìn nhà mình từ bên trong, nơi cửa sổ phòng tắm trông vô hại.

Người muốn vào nhà thì nhìn từ bên ngoài. Họ không quan tâm cửa chính chắc cỡ nào, họ đi vòng quanh nhà tìm chỗ yếu nhất. An toàn thông tin phần lớn là tập làm quen với việc đứng ở bên ngoài nhìn vào ứng dụng của chính mình.

Ở bài trước, Enrichlead và hàm đăng nhập đều có chỗ hở mà người làm ra không thấy, vì họ chỉ nhìn từ bên trong. Bài này là cách nhìn từ bên ngoài, đi qua vài khái niệm nền tảng, và mình sẽ dùng một ứng dụng ghi chú nhỏ xuyên suốt để các khái niệm có chỗ bám.

An toàn thông tin cơ bản – Bài 1: Vì sao vibe code cần an toàn thông tin

Mình muốn mở series bằng một câu chuyện của người khác.

Tháng 3/2025, người sáng lập Enrichlead, một dịch vụ tìm khách hàng tiềm năng cho đội bán hàng, khoe trên mạng xã hội rằng toàn bộ sản phẩm do Cursor viết, không có dòng nào viết tay. Vài ngày sau khi ra mắt, chính người đó đăng lên: sản phẩm đang bị tấn công. Hạn mức API bị dùng cạn, người dùng vượt qua được gói trả phí, dữ liệu bị tạo lung tung.

Theo các bài phân tích về vụ này, nguyên nhân khá cơ bản. Việc kiểm tra gói trả phí chỉ nằm ở giao diện, nên đổi một giá trị trong trình duyệt là dùng được tính năng trả phí. API key nằm ngay trong JavaScript phía client, ai mở tab Network cũng thấy. Người sáng lập nhờ Cursor sửa tiếp thì theo lời kể, các chỗ khác lại hỏng theo, và sản phẩm đóng cửa.

Điều đáng chú ý là sản phẩm đó chạy ổn khi demo. Không có thông báo lỗi nào, không có gì đỏ trên màn hình. Mọi thứ hoạt động đúng theo cách người làm ra nó thử. Chỉ đến khi người khác thử những điều người làm không nghĩ tới thì mọi chuyện mới lộ ra.

Bài này nói về chuyện đó, và vì sao khi vibe code nhiều thì chuyện đó càng đáng để ý.

Python cơ bản – Bài 10: File và exception

Mọi chương trình từ đầu series tới giờ đều quên sạch dữ liệu khi kết thúc, và dừng ngay khi gặp lỗi. Chương trình thực tế thì cần đọc dữ liệu từ file, lưu kết quả lại cho lần chạy sau, và không sập chỉ vì người dùng gõ chữ vào chỗ cần nhập số. Bài cuối của series giới thiệu cách đọc ghi file với pathlib, xử lý lỗi bằng exception, và lưu dữ liệu bằng module json.

Python cơ bản – Bài 9: Class

Ở bài 6, mình dùng dictionary để lưu thông tin một món đồ uống, và ở bài 8 dùng hàm để xử lý dữ liệu. Nhưng dữ liệu và hàm xử lý nó vẫn nằm tách rời nhau. Class gom cả hai vào một chỗ: một chiếc xe vừa có hãng, mẫu, số km đã chạy, vừa có các hành động như cập nhật số km. Đây là nền tảng của lập trình hướng đối tượng (object-oriented programming, OOP), cách tổ chức code mà bạn sẽ gặp ở hầu hết các thư viện Python. Bài này giới thiệu cách viết class, tạo đối tượng, kế thừa, và import class từ module.

Python cơ bản – Bài 8: Hàm

Chương trình càng dài, bạn càng thấy mình viết đi viết lại những đoạn code giống nhau: in lời chào, ghép họ tên, tính tổng tiền. Mỗi lần cần sửa, bạn lại phải sửa ở tất cả những chỗ đó. Hàm giải quyết chuyện này: đặt tên cho một đoạn code, rồi gọi tên đó mỗi khi cần. Bài này giới thiệu cách viết hàm, truyền dữ liệu vào hàm, nhận kết quả trả về, và tách hàm ra file riêng.

Python cơ bản – Bài 7: Nhập dữ liệu và vòng lặp while

Các chương trình từ đầu series tới giờ đều dùng dữ liệu viết sẵn trong code. Chương trình thực tế thì phải hỏi người dùng: bạn bao nhiêu tuổi, bạn muốn đặt món gì, bạn có muốn tiếp tục không. Bài này giới thiệu hàm input() để nhận dữ liệu người dùng nhập vào, và vòng lặp while để chương trình chạy tới khi người dùng muốn dừng.