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

Thảo luận trong 'Bảo mật Joomla' bắt đầu bởi ducnt, 3/3/12.

  1. ducnt

    ducnt Mới tham gia

    Bài viết:
    2
    Likes :
    9
    Vì diễn đàn mình thấy chưa có nhiều nội dung với lại bài viết này cũng tương đối bổ ích mà mọi người nên biết khi sử dụng joomla,nên mình xin được copy and paste bài viết này từ joomla.edu.vn

    [​IMG]Hiệ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).

    Đối với người sử dụng cuối (end-user):


    Không dùng tiền tố mặc định 'jos_'


    Khi cài đặt website, Joomla sử dụng tiền tố mặc định cho các bảng của cơ sở dữ liệu: 'jos_'. Tuy nhiên để tránh sự nhòm ngó của các haker bạn nên đổi tiền tố này.
    [​IMG]

    Không dùng tài khoản mặc định 'admin'

    • Tạo một tài khoản quản trị (Super Administrator) mới thay vì dùng tài khoản mặc định có tên 'admin'​
    • Đổi tên và vô hiệu hóa tài khoản mặc định 'admin' mà Joomla đã tạo ra khi cài đặt bằng cách: Mở bảng _users, tìm bản ghi có id=62, đổi username khác 'admin' và thay block bằng '1')​
    [​IMG]
    Không dùng mã bí mật mặc định '$secret'


    Joomla cung cấp một mã bí mật '$secret' đặt trong file "configuration.php". Mã này được kết hợp với mật khẩu và hàm MD5 để tạo ra một mật khẩu được mã hóa rất mạnh (không thể dò ngược) - tất nhiên với điều kiện mã $secret là ngẫu nhiên và chỉ mình bạn biết.

    Mở file "configuration.php" tìm biến '$secret' và thay bằng một chuỗi ký tự ngẫu nhiên (không dùng chuỗi mặc định của Joomla). VD:
    <?php
    class JConfig {
    //...
    var $secret = '2rsf820gaygwer33ty';
    //...
    }
    ?>

    Đối với những người lập trình (developer) thì chú ý những vấn đề 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 = &amp; 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 );
     
  2. AskingMan

    AskingMan Mới tham gia

    Bài viết:
    6
    Likes :
    0
    Cám ơn bạn. Cho mình hỏi làm sao để thay tiền tố hàng loạt mà ko phải làm từng cái một. Và nếu bỏ hẳn tiền tố có sao không? Thay bằng tiền tố của cá nhân mình nghĩ ra được không?
     
  3. bacninhpro.net

    bacninhpro.net Rất nhiệt tình

    Bài viết:
    144
    Likes :
    46
    Ông này hâm à, tiền tố không do ông nghĩ ra thì ông kiếm đâu ra? Tiền tố chỉ để cho phép cài nhiều joomla trên 1 csdl, chỉ dùng 1 joomla thì bỏ tiền tố luôn cũng được. Hình như có phần mềm cho phép đổi tiền tố, còn cách đơn giản là down về pc rồi dùng 1 phần mềm trên máy như notepad, wordpad, frontpage hay gì đó (dùng hỗ trợ để viết code) mở ra, dùng chức năng Tìm kiếm và Thay thế mà thay hết các jos_ thành cái khác rồi up lại lên host/
     
  4. Rubydk1210

    Rubydk1210 Mới tham gia

    Bài viết:
    2
    Likes :
    0
    Cảm ơn bạn! Mình cũng đang bắt đầu tìm hiểu về cách tấn công SQL Injection và một số cách tấn công khác, bài viết rất hữu ích.
     
comments powered by Disqus

Chia sẻ trang này