(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)
|