11 Bàn thêm về lập trình bảo mật

(Post 07/03/2008) Phần trả lời về khả năng bảo mật của ngôn ngữ Python trên TGVT A trước đây, theo ý kiến của cá nhân tôi thì chưa thật chính xác và cần được làm rõ thêm.

Trước hết, chúng ta cần xem xét lại khái niệm lập trình bảo mật. Đó không chỉ là xác nhận người dùng hay mật mã hóa thông tin mà cần được hiểu là các phương pháp trong lập trình nhằm phục vụ việc bảo mật thông tin. Cụ thể hơn, chúng ta cần nhận thức mật mã hóa và các kỹ thuật liên quan là một trong những phương tiện để bảo mật thông tin trong khi mục đích của lập trình bảo mật là nhằm ngăn chặn mọi con đường dẫn đến nguy cơ truy xuất thông tin bất hợp pháp. Có thể nêu một ví dụ dễ hiểu và nhiều người biết đến là kiểu tấn công SQL Injection. Với cách tấn công đó, mọi biện pháp mã hóa hay xác nhận người dùng đều trở nên vô nghĩa. Để ngăn chặn SQL Injection (và kiểu tấn công tràn bộ đệm cũng như những kiểu tấn công khác mà có thể hiện nay chưa được biết đến), lập trình viên phải ghi nhớ và thực hiện nguyên tắc kiểm tra dữ liệu đầu vào – các lệnh để thực hiện việc này có mặt trong mọi ngôn ngữ lập trình. Vì thế, câu “Bản thân ngôn ngữ lập trình Python … không có lệnh nào phục vụ trực tiếp việc bảo mật” có thể là đúng nhưng cũng có thể là sai nếu hiểu theo nghĩa các lệnh phục vụ trực tiếp việc bảo mật (chỉ) là các lệnh để xác thực người dùng và mã hóa thông tin – cách hiểu này hiện còn rất phổ biến.

Xét trên phương diện khả năng và mức độ hỗ trợ sẵn có cho lập trình bảo mật, chúng ta lại thấy rằng một số ngôn ngữ lập trình thực sự “mạnh” hơn các ngôn ngữ khác nhưng chỉ trong một số lĩnh vực cụ thể. Chẳng hạn Java không cho phép lập trình viên thao tác với con trỏ như C++ và điều này có thể giúp cho họ tránh khỏi cảnh “tự chặt vào chân mình” và như thế cũng có nghĩa là ứng dụng sẽ an toàn hơn và khả năng lộ thông tin vì lỗi ứng dụng cũng thấp hơn. Lấy một ví dụ khác, khi lập trình với C bạn có thể dùng lệnh memset để xóa các biến lưu thông tin nhạy cảm như mật khẩu, trong khi với VB6 thì điều đó là bất khả thi (ít nhất là qua kinh nghiệm của tôi, dù đã gán lại biến lưu mật khẩu thành các khoảng trắng bằng rất nhiều cách khác nhau thì “nhìn” vào vùng nhớ của ứng dụng bằng các công cụ tiện ích vẫn có thể thấy được giá trị cũ của nó). Ngược lại, một số trình biên dịch có khả năng cảnh báo và có tùy chọn biên dịch để ngăn chặn các trường hợp có thể sinh lỗi run-time như chỉ số mảng nằm ngoài phạm vi cho phép, … trong khi một số khác thì không. Ngoài ra, các thư viện do cộng đồng phát triển cũng sẽ phong phú và đầy đủ hơn đối với những ngôn ngữ lập trình được sử dụng phổ biến hơn (cho một mục đích nhất định). Tuy nhiên, nếu phân tích quá sâu theo hướng này chúng ta sẽ có thể sa lầy vào cuộc tranh cãi bất tận về “ngôn ngữ lập trình mạnh nhất”. Vấn đề là ở chỗ bạn định xây dựng ứng dụng loại nào và bạn thạo ngôn ngữ lập trình nào, vì rất có thể nếu không biết sử dụng thì ngay cả với những công cụ hiện đại chúng ta cũng sẽ làm ra những sản phẩm xấu xí hơn những người thợ lành nghề với công cụ thô sơ!

Cuối cùng, xin giới thiệu để các bạn tìm đọc một cuốn sách khá nổi tiếng và toàn diện về lập trình bảo mật của Microsoft: Writing secure code (download tại đây hoặc tại đây)

Nguyễn Anh Tuấn
124 Vương Thừa Vũ, Hà Nội

Ý KIẾN BẠN ĐỌC

OpenSource Supporter(n0w0rd@yahoo.com)
Ý kiến rất đúng. Tuy nhiên tôi vẫn xin có một số comment:

– Trong một số trường hợp, trình biên dịch sẽ tự động loại bỏ lệnh memset vì lý do tối ưu hóa. Ví dụ sau sẽ giúp các bạn hình dung rõ hơn
#include
using std::string;

#include

// The specifics of this function are
// not important for our purpose here
const string getPasswordFromUser() const;

bool isPasswordCorrect() {
bool isPasswordCorrect = false;
string Password(“password”);

if(Password == getPasswordFromUser()) {
isPasswordCorrect = true;
}

// This line is removed from the optimized code
memset(Password, 0, sizeof(Password));

return isPasswordCorrect;
}

– Perl có chế độ “taint” buộc lập trình viên phải kiểm tra giá trị đầu vào, trong đó
print $form_data{“email”} . “\n”;
được chấp nhận nhưng
system(“mail ” . $form_data{“email”});
thì bị chặn

– Việc lựa chọn ngôn ngữ lập trình cho “lập trình bảo mật” cần được thảo luận kỹ hơn, dưới đây là một bài viết đáng giá: (click vào đây)

(theo PC World VN)

FPT Aptech – Hệ Thống Đào Tạo Lập Trình Viên Quốc Tế

FPT Aptech trực thuộc Tổ chức Giáo dục FPT có hơn 25 năm kinh nghiệm đào tạo lập trình viên quốc tế tại Việt Nam, và luôn là sự lựa chọn ưu tiên của các sinh viên và nhà tuyển dụng.
0981578920
icons8-exercise-96