(Post 24/11/2006) Giao dịch thông qua Internet
ngày càng phát triển, hàng loạt ngôn ngữ và giao thức thiết kế trang web
cũng ra đời để phục vụ cho những mục đích nhất định, có thể kể các ngôn
ngữ phổ biến như HTML, Perl, ASP, PHP... Bài viết này đề cập đến một vấn
đề thường gặp là bảo mật và kinh nghiệm phòng tránh để tăng độ an toàn
cho trang web.
Các phần đã đăng
<applet> - Java applet
Thuộc tính này dùng để chạy Java applet. Java được thiết
kế với những tính năng bảo mật cho người dùng khi duyệt các trang web
có nhúng Java applet hoặc Java script, như hạn chế quyền truy cập tài
nguyên trên máy (bộ nhớ, đĩa...), hạn chế thực thi các lệnh hệ thống,
chỉ cho phép truy cập dữ liệu (file, thư mục) ở những vùng chỉ định của
người dùng hiện tại, hạn chế truy cập vào mạng - trừ việc cho phép tạo
kết nối ngược về server chứa applet.
Tuy nhiên những năm gần đây, nhiều sơ hở bảo mật của
Java được khám phá:
Java chạy và gửi thông tin thường dưới dạng plain text
nên có thể dùng các chương trình theo dõi gói tin để bắt các thông tin
này khi chúng đang lưu thông trên mạng.
Mã Java trong các applet có thể dịch ngược để xem mã
nguồn.
Mã Java khi chạy trên các hệ thống Windows 95/98/NT bị
lợi dụng gây lỗi tràn bộ đệm từ đó có thể tác động đến hệ thống file hoặc
thậm chí gây hỏng hệ thống.
Cơ chế bảo mật Java từng bị hạ gục ở một số trình duyệt
version trước và giúp hacker thực hiện các lệnh vốn không được phép.
Kinh nghiệm phòng tránh:
Hầu hết các lỗi bảo mật của Java xuất phát từ các điểm
yếu trong máy ảo Java (Java Virtual Machine) và trình duyệt phía người
dùng. Dưới đây là một số thủ thuật giúp tăng độ an toàn khi truy cập các
trang web có nhúng Java script hoặc Java applet:
Cập nhật các bản sửa lỗi cho hệ thống Windows và các
ứng dụng mới nhất tại http://windowsupdate.microsoft.com
Nếu dùng trình duyệt Internet Explorer 6.x, hãy vào menu
Tools/Internet Options, ở thẻ Security bạn chọn vùng Internet, mức an
toàn là “Medium” (trung bình) –, sau đó chọn phần “Custome level”, trong
hộp thoại “Security Settings” hãy di chuyển thanh trượt đến mục Java VM/Permissions
và chọn mức “High safety”, tiếp tục xuống dưới ở phần Scripting/Scripting
Java applets, bạn chọn Disable . Phương pháp này sẽ hạn chế trình duyệt
không cho phép chạy các Java script và Java applet ở các trang web. Tuy
nhiên mặt hạn chế của nó là phải bật lại chức năng nếu bạn muốn cho phép
mã Java chạy ở các trang web tin cậy.
<object>, <embed>
Thuộc tính này dùng để thể hiện các đối tượng ActiveX
và Java applet. Đặc biệt đối với ActiveX, lợi dụng thuộc tính này hacker
có thể gửi email dạng HTML có nhúng ActiveX control và đánh lừa người
dùng chạy các ActiveX control này để đoạt quyền điều khiển hệ thống hoặc
chạy những chương trình quấy rối, quảng cáo. Đây cũng là một trong những
phương pháp thường được lợi dụng để lan truyền virus trên mạng. Hầu hết
các phiên bản sau này của các trình duyệt đều cung cấp khả năng ngăn chặn
sự hoạt động của ActiveX control, tuy nhiên lại tạo ra những bất tiện
đáng kể cho người dùng.
Kinh nghiệm phòng tránh:
Tương tự như cách phòng tránh cho thẻ <Java> vừa
đề cập, hầu hết các lỗi bảo mật liên quan đến đối tượng nhúng xuất phát
từ trình duyệt phía người dùng và một số dịch vụ của Windows. Sau đây
là 1 số cách bảo vệ trình duyệt và hệ thống của bạn:
Cập nhật các bản vá lỗi mới nhất cho hệ thống Windows
tại http://windowsupdate.microsoft.com
Thiết lập các thông số cho trình duyệt. Tương tự như
phần <Java>, các trình duyệt thông dụng hiện nay như IE, Firefox
đều cho phép người dùng thay đổi các thiết lập ngầm định giúp duyệt web
an toàn hơn.
Sử dụng các phần mềm ngăn chặn popup/spyware/adsware
như CounterSpy, WebRoot SpySweeper, MS AntiSpy...
Thiết lập
Security cho IE |
|
PERL (PRATICAL EXTRACTION AND REPORT LANGUAGE)
Perl là ngôn ngữ lập trình cấp cao được phát triển từ
năm 1987. Rất mạnh, tiện dụng và đồng thời là ngôn ngữ được phổ biến miễn
phí, hỗ trợ cho hầu hết các hệ thống từ Windows x/NT/2k/XP, các phiên
bản biến thể của Unix đến hệ thống AS/400, MacOS, Novell NetwarePerl...
Perl đã và đang được sử dụng rộng rãi trên Internet.
Perl được dùng chủ yếu cho các xử lý phía server, tuy
nhiên ta cũng có thể dùng perl để viết các ứng dụng client, thậm chí có
thể tạo nên ứng dụng chạy độc lập để thực hiện một tác vụ tính toán nào
đó.
Trên web server, perl thường được thực thi với CGI tạo
nên cơ chế xuất thông tin ra trình duyệt web. Hãy xem ví dụ dùng perl
để xử lý các thông tin nhập vào từ người dùng trong đoạn html dưới đây:
<form method=POST action=”/admin/login.pl”></form>
<html>
Username:
<input value=”” size=80 maxlength=80 name=”username”>
Password:
<input value=”” size=80 maxlength=80 name=”password”>
<input type=submit value=”Login”>
</html>
Sau khi người dùng nhập tên, mật khẩu và nhấn nút Login
những thông tin này sẽ được gửi đến chương trình perl có tên login.pl
nằm ở thư mục /admin/ trên web server. Chương trình login.pl sau khi xử
lý sẽ gửi kết quả ngược về trình duyệt web phía người dùng.
Kinh nghiệm phòng tránh:
Khi sử dụng perl để thực hiện các xử lý phía server,
ta cần lưu ý một số điểm quan trọng sau có khả năng gây nên những nguy
cơ về bảo mật nghiêm trọng:
Tránh thực thi các web server dưới quyền quản trị (root
trong Unix và administrator trong Windows). Các script ở web server được
chạy với quyền quản trị sẽ rất nguy hiểm nếu ai đó dùng nó để thực hiện
các lệnh điều khiển hệ thống. Script cgi-telnet được phổ biến trên Internet
là một ví dụ cụ thể.
Luôn thực hiện tiền xử lý các thông tin người dùng nhập
vào, như các giá trị tên người dùng, mật khẩu, giá cả... Tạo một chuỗi
các kí tự hợp lệ tương ứng với thông tin cần nhập và lọc ra những kí tự
được nhập không chính xác. Chẳng hạn với tên và mật khẩu người dùng, ta
có thể giới hạn ở các kí tự hợp lệ sau: “0..9”, “a..z”, “A..Z”; không
cho phép hoặc lọc bỏ các kí tự đặc biệt như: “/ \ + ) ( { } [ ] - _ =.|
& !”... Một ví dụ khác về việc dùng perl thực hiện tiền xử lý với
email người dùng, với yêu cầu email phải có kí hiệu @ và dấu chấm “.”
ở ít nhất là phần sau dấu @:
if ($email !~ /^[\w-]+\@[\w.-]+$/){
print “<br>#Error in your email. Please re-enter<br>”;
}else{
# thực hiện xử lý đối với thông tin email hợp lệ;
}
Hạn chế không cho phép thực thi các lệnh hệ thống (shell
command) như open(), fork(), system(), exec() hoặc cho thực hiện sau khi
đã kiểm tra chặt chẽ các tham số truyền vào. Ở các hệ thống bảo vệ lỏng
lẻo, hacker có thể lợi dụng truyền các tham số không thích hợp vào các
hàm trên để thực hiện các lệnh xem thông tin và điều khiển hệ thống.
Trên các hệ thống Unix, cần thiết lập các thông số $PATH
và $IFS bằng các giá trị chính xác cụ thể, tránh dùng các biến môi trường.
Ví dụ ta đặt như sau:
$ENV{“PATH”}=”/bin:/usr/bin:/opt”;
$ENV{“IFS”}=”/”;
Việc chỉ định không rõ ràng các thông tin trên có thể
tạo điều kiện cho hacker sửa đổi chúng và bắt các chương trình của chúng
ta phải thực thi một chương trình nguy hiểm nào đó ở nơi khác thay vì
tại vị trí ta mong muốn.
Kiểm tra kích thước và chiều dài của các thông tin người
dùng nhập vào hoặc dùng biến $ENV{CONTENT_LENGTH} để hạn chế chiều dài
của chuỗi dữ liệu cho các yêu cầu GET/POST. Nếu không được kiểm tra chính
xác, hacker có thể gửi đi một lượng dữ liệu có giá trị rất lớn hoặc rất
dài gây nên các lỗi tràn bộ đệm, hỏng web server và thậm chí tìm được
các điều kiện phát sinh lỗi tràn bộ đệm và thực thi các lệnh nguy hiểm
từ xa.
Tránh cho phép chỉ định đường dẫn cụ thể ở các trường
dữ liệu hoặc ở các tham số truyền vào các chương trình. Chỉ nên cho phép
các đường dẫn mang tính tương đối, cắt bỏ các giá trị có dạng dot dot
“..” hoặc slash “/\”. Ở rất nhiều chương trình web không kiểm tra đúng
đã cho phép người dùng nhập các tham số ví dụ /../../../../etc/passwd
(Unix) hoặc /../../../winnt/repair/sam._ (NT/2k) và dễ dàng lấy được các
thông tin về mật khẩu.
Các chương trình perl được lưu trữ dưới dạng text đơn
giản do đó có thể dễ dàng bị xem mã nguồn và lấy các thông tin có giá
trị như tên, mật khẩu truy cập cơ sở dữ liệu... nếu hacker đoạt được quyền
điều khiển hệ thống hoặc có quyền xem hệ thống file. Ta có thể dùng một
số chương trình ví dụ perl2exe cho phép chuyển đổi các tệp perl dạng text
sang dạng chương trình thực thi .exe, như vậy có thể tránh được việc tiết
lộ mã nguồn và không cần trình thông dịch perl khi chạy.
PHP (PERSONAL HOME PAGE)
Được phát triển từ năm 1995, PHP trở thành một trong
những ngôn ngữ script phía server phổ biến nhất bên cạnh Perl và ASP (Active
Server Pages). Tương tự như Perl, PHP có dạng cú pháp câu lệnh đơn giản,
dễ hiểu, đặc biệt thích hợp với các lập trình viên có hiểu biết về ngôn
ngữ C/C++ đồng thời có ưu điểm là thực thi rất nhanh và có thể chạy ở
máy client hoặc như một ứng dụng độc lập. Hiện nay người ta thường dùng
PHP để thực hiện các tác vụ xử lý phía server ở các web server trên nền
Unix, điển hình như Apache. Các chương trình PHP thường có phần mở rộng
là .php, .php3, .php4. Mã PHP cũng có thể nhúng vào một trang HTML. Hãy
xem ví dụ sau thực hiện in lên trình duyệt một chuỗi kí tự:
<!## PHP Example in HTML
<html>
<?php
echo “<br>Hello World!<br>”;
?>
</html>
Chú ý thẻ <? và ?> dùng để đánh dấu nơi bắt đầu
và kết thúc mã PHP.
Đoạn mã ví dụ sau là một trang Login đơn giản, thực hiện
kiểm tra thông tin người dùng và mật khẩu so với cơ sở dữ liệu:
<?
...
function check_user($user, $password) {
if(connect()) {
$password = substr($password, 0, 8);
$sql = “select * from users where username = $user and password =$password”;
$result = mssql_query($sql);
if (mssql_num_rows($result) == 1) {
setcookie(“user”,$user);
setcookie(“password”,$password);
return (true);
}
else {
?>
<h3>Đăng nhập không thành công!</h3>
<?
return (false);
}
}
}
if(!check_user($user, $password)) {
?>
<h1>Nhập thông tin đăng nhập:</h1>
<form action = “Login.php” method=”post”>
<P>Tên người dùng: <input type=”text” name=”user”><br>
Mật khẩu: <input type=”password” name=”password”
maxlength=”8” size=”8”><br>
<input type=”submit” name=”submit” value=”Submit”>
</form>
<?
}
else {
?>
<h1>Đăng nhập thành công!</h1>
<?
}
?>
Ví dụ trên không kiểm tra giá trị tên người dùng và
mật khẩu trước khi kết nối vào cơ sở dữ liệu và hacker có thể lợi dụng
để chèn các kí hiệu và lệnh đặc biệt để thực thi các thao tác nguy hiểm.
Kinh nghiệm phòng tránh:
Cho đến nay, những điểm yếu của PHP được phát hiện tương
tự như ở ngôn ngữ Perl. Đặc biệt khi sử dụng PHP để nhận các thông tin
nhập từ người dùng thông qua trình duyệt và xử lý cơ sở dữ liệu bên dưới;
hoặc thực thi các lệnh hệ thống như system(), shellexec(), exec(), passthru()...
ta cần chú ý thực hiện việc kiểm tra và lọc những dữ liệu truyền vào không
hợp lệ để tránh trường hợp người dùng nhập dữ liệu sai, đánh lừa hệ thống
sinh ra những kết quả không mong muốn, thậm chí thực thi các lệnh từ xa.
Ví dụ sau thực hiện việc kiểm tra đơn giản trên chuỗi
$value có kiểu số, dùng hàm định nghĩa sẵn trong thư viện PHP preg_match():
if (preg_match(“/^[0-9]+$/i”, $value))
echo “Invalid number!\n”;
return 1;
break;
Bổ sung cho ví dụ ở trên, ta thêm đoạn mã kiểm tra tính
hợp lệ của 2 trường tên và mật khẩu, giả định rằng tên và mật khẩu chỉ
được chứa các kí tự chữ và số:
<?
...
function check_user($user, $password)
{
//hàm ereg kiểm tra các kí tự đặc biệt trong trường
Tên và Mật khẩu
if (!ereg (“([0-9,a-z,A-Z])”, $user))) return false;
if (!ereg (“([0-9,a-z,A-Z])”, $password))) return
false;
if(connect()){
...
}
}
?>
Hàm ereg sử dụng Regular Expression để kiểm tra tính
hợp lệ của dữ liệu rất nhanh và hiệu quả. Dưới đây là các ví dụ trích
từ trang http://www.php.net sử dụng các hàm built-in của PHP để kiểm tra
và lọc dữ liệu:
// Hàm kiểm tra tính hợp lệ của e-mail:
function check_email ($string)
{
if (ereg(“^[A-Za-z0-9_\.\-]+@[A-Za-z0-9_\.\-]”+ “+\.[A-Za-z0-9_\-][A-Za-z0-9_\-]+$”,
$string, $result))
return (true);
return (false);
}
//Hàm loại bỏ các kí tự đặc:
function replace_data ($string)
{
$string = preg_replace(“/[^a-zA-Z0-9\-\.\@\_]/”,
“”, $string);
return ($string);
}
Để tìm hiểu chi tiết thông tin về các hàm và các ví dụ
cụ thể, các bạn hãy tham khảo thêm tại trang
chủ PHP.
LỜI KẾT
Bảo mật ngôn ngữ web chỉ là một trong các bước tăng cường
an toàn cho hệ thống của bạn. Trong vai trò người phát triển và quản trị
web, một trang web được xem là an toàn khi máy chủ được bảo vệ và tối
ưu hóa ở mức cao nhất, các ứng dụng web cần được kiểm tra độ tin cậy và
tính toàn vẹn dữ liệu trước khi công bố rộng rãi đến người dùng, điều
đó cần một quy trình phát triển ứng dụng mang tính chuyên nghiệp và được
hoạch định rõ ràng.
Đối với người dùng, chúng ta cũng phải chủ động tự bảo
vệ hệ thống của mình trước những hiểm họa tiềm tàng trên Internet bằng
cách tăng cuờng các hệ thống phòng thủ như tường lửa, phòng chống virus
và spyware, liên tục cập nhật các bản sửa lỗi mới nhất và đặc biệt là
tuyệt đối tránh duyệt các trang web có nội dung không lành mạnh, vì chúng
là những điểm có nguy cơ lây lan cao.
Bảo mật máy tính, đó là một câu chuyện dài không bao
giờ kết thúc.
Nguyễn Văn Sơn
Global Cybersoft Vietnam
(theo PC World VN) |