Chống tấn công SQL Injection trong Joomla


Written by VINAORA
Sunday, 03 August 2008 14:31
SQL Injection trong JoomlaHiện Joomla! ngày càng phát triển mạnh mẽ và ngày càng được ứng dụng rộng rãi ở Việt Nam với số lượng các thành phần mở rộng (extensions) từ các hãng thứ ba cũng tăng không ngừng cả về số lượng và chất lượng. Rất nhiều thành phần mở rộng (gồm component, module, plugin, template…) thực sự tuyệt vời và đáng được cài đặt trên mọi Website.

Tuy nhiên, có một thực tế song hành với mặt ưu điểm trên là số lượng các Website bị tấn công thông qua các lỗi lập trình bất cẩn trong các thành phần mở rộng được cài đặt thêm cũng ngày càng tăng cao. Thậm chí số lượng lỗi bị khai thác còn cao hơn cả Microsoft (theo báo cáo 6 tháng đầu năm 2008 của IBM).

Do vậy, ngay từ lúc này, bạn hãy kiểm tra lại toàn bộ hệ thống của mình để đảm bảo: Chỉ cài đặt các thành phần mở rộng thực sự cần thiết, thực sự uy tín và hãy nhờ một người có kinh nghiệm để kiểm tra các đoạn mã, mà một trong số chúng thường bị hacker khai thác – các lỗi phổ biến về truy vấn SQL (thường gọi là SQL Injection).

Còn nếu bạn là một developer hãy tạo cho mình những thói quen tốt sau:

Ép kiểu dữ liệu

Luôn ép kiểu dữ liệu cho các chuỗi đưa vào câu lệnh truy vấn SQL. Thí dụ:

Nếu muốn kiểu dữ liệu là kiểu nguyên (integer) thì sử dụng câu lệnh SQL:

$sql = 'UPDATE #__mytable SET `id` = ' . (int) $int;

Nếu muốn kiểu dữ liệu là kiểu ngày/tháng (date) thì sử dụng câu lệnh SQL:

$date = & JFactory::getDate($mydate);
$sql = 'UPDATE #__mytable SET `date` = ' . $db->quote( $date->toMySQL(), false);

Luôn gỡ bỏ ý nghĩa của những ký tự đặc biệt

Bạn cần gỡ bỏ ý nghĩa của những ký tự đặc biệt (những ký tự có khả năng gây nguy hiểm cho câu lệnh SQL) nằm trong các chuỗi dữ liệu được đưa vào câu lệnh SQL bằng câu lệnh:

$sql = 'UPDATE #__mytable SET `string` = ' . $db->quote( $db->getEscaped( $string ), false );

Chống tấn công DOS

Trong các mệnh đề WHERE, nếu bạn có sử dụng lệnh LIKE, hãy đảm bảo rằng bạn đã lọc các ký tự đặc biệt như “%” và “_”  thì sử dụng câu lệnh SQL:

$sql = 'UPDATE #__mytable SET .... WHERE `string` LIKE '.
          $db->quote( $db->getEscaped( $string, true ), false )

Chống tấn công XSS

Rất nhiều người có thói quen lấy dữ liệu nhập vào từ người dùng bằng câu lệnh JRequest::getVar(). Tuy nhiên đây là một thói quen không tốt. Thay vào đó bạn nên sử dụng các phương thức ép kiểu. Thí dụ:

Nếu muốn kiểu số nguyên, dùng câu lệnh:

$int = JRequest::getInt( $name, $default );

Nếu muốn kiểu số thực, dùng câu lệnh:

$float = JRequest::getFloat( $name, $default );

Nếu muốn kiểu logic (đúng/sai), dùng câu lệnh:

$bool = JRequest::getBool( $name, $default );

Nếu muốn kiểu từ (word): chỉ có các ký tự chữ cái và ký tự gạch dưới “_”, dùng câu lệnh:

$word = JRequest::getWord( $name, $default );

Nếu muốn kiểu câu lệnh (command): chỉ có các ký tự chữ cái, ký tự số, ký tự “.”  và “_”, dùng câu lệnh:

$cmd = JRequest::getCMD( $name, $default );

Nếu muốn kiểu văn bản không phải HTML (văn bản đã được lọc bỏ các thẻ HTML), dùng câu lệnh:

$string = JRequest::getString( $name, $default );

Tham khảo thêm:

Keyword:

  • câu lệnh, sql, sql injection, ép kiểu, lọc bỏ, số nguyên, số thực, DOS, XSS, interger, float, string, JRequest…
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s