Skip to content

Hướng dẫn nâng cấp module từ NukeViet 4.4.02 lên NukeViet 4.5.00

Tan Dung Phan edited this page Dec 16, 2021 · 6 revisions

1. URL chính tắc: $page_url, $base_url và $canonicalUrl

  • $page_url là đường dẫn tuyệt đối từ thư mục gốc của site đến trang đang xử lý, bao gồm cả số trang (nếu có).
  • $base_url là đường dẫn tuyệt đối từ thư mục gốc của site đến trang đang xử lý, không bao gồm số trang.
  • $canonicalUrl là url chính tắc đến trang đang xử lý, là tổ hợp của NV_MAIN_DOMAIN và $page_url.

Các biến $page_url và $canonicalUrl cần được xác định ở tất cả các khu vực hiển thị ra bên ngoài site, biến $base_url cần được xác định nếu khu vực đó có phân trang.

Bắt buộc sử dụng hàm getCanonicalUrl để xác định $canonicalUrl. Hàm này cũng có chức năng kiểm tra chuỗi truy vấn REQUEST_URI với url chính tắc. (Chi tiết về hàm getCanonicalUrl tại https://github.com/nukeviet/nukeviet/blob/0749136b86bcc8cca9711fbcfdf51dc2354aef1e/includes/functions.php#L1773-L1821)

Ví dụ về thiết lập URL chính tắc:

$page_url = $base_url = NV_BASE_SITEURL . 'index.php?' . NV_LANG_VARIABLE . '=' . NV_LANG_DATA . '&' . NV_NAME_VARIABLE . '=' . $module_name;
$page = 1;
if (isset($array_op[0]) and substr($array_op[0], 0, 5) == 'page-') {
    $page = intval(substr($array_op[0], 5));
}
if ($page > 1) {
    $page_url .= '&' . NV_OP_VARIABLE . '=page-' . $page;
}
$canonicalUrl = getCanonicalUrl($page_url);

2.Đánh số trang

Bắt buộc sử dụng betweenURLs - hàm kiểm tra việc đánh số trang và xác định trang trước, trang sau. Ở trang cần đánh số trang, sau khi tính được tổng số item để chia trang xong, cần thêm ngay xuống dưới:

$urlappend = '&' . NV_OP_VARIABLE . '=page-';
betweenURLs($page, ceil($num_items/$per_page), $base_url, $urlappend, $prevPage, $nextPage);

Trong đó:

  • $page: Số trang hiện tại được xác định trước đó
  • $num_items: Tổng số item để chia trang được xác định bằng cách đọc CSDL trước đó
  • $per_page: Số item trên 1 trang
  • $base_url: Đường dẫn từ thư mục gốc đến trang đang xử lý (không có page)
  • $urlappend: phần thêm vào $base_url khi đánh số trang (có thể là '&' . NV_OP_VARIABLE . '=page-', hay '/page-', hay '&page='...)
  • $prevPage và $nextPage: là 2 biến toàn cục được cập nhật sau khi gọi hàm betweenURLs Xem ví dụ tại: https://github.com/nukeviet/nukeviet/blob/38a817001e7961f08379e5a7a90ede0596a3084a/modules/news/funcs/main.php#L64

3. Lỗi Cross-site Scripting (XSS) tiềm ẩn

Tìm tất cả:

nv_rss_generate($channel, $items);

Thay bằng:

$atomlink = NV_BASE_SITEURL . "index.php?" . NV_LANG_VARIABLE . "=" . NV_LANG_DATA . "&" . NV_NAME_VARIABLE . "=" . $module_name . "&" . NV_OP_VARIABLE . "=" . $module_info['alias']['rss'];
nv_rss_generate($channel, $items, $atomlink);

4. Tích hợp reCaptcha v3

Việc quản lý captcha di chuyển từ cấu hình chung toàn site đến cấu hình từng module. Do đó sẽ không còn 2 biến toàn cục $global_config['captcha_type'] và $global_config['gfx_chk']. Thêm biến toàn cục mới $global_config['recaptcha_ver'] có giá trị là phiên bản recaptcha được áp dụng (2 hay 3). Nếu module có sử dụng captcha, cần sửa lại như hướng dẫn sau:

  • Thêm cấu hình sử dụng captcha vào khu vực cấu hình từng module để có được biến $module_config[$module_name]['captcha_type'] với giá trị là captcha/recaptcha/rỗng. Cần thêm vào CSDL cấu hình này. Ví dụ:
INSERT INTO `nv4_config` (`lang`, `module`, `config_name`, `config_value`) VALUES ('vi', 'ten-module', 'captcha_type', 'captcha');

Sau đó chỉnh sửa files, tương tự như ở đây:

  1. https://github.com/nukeviet/nukeviet/commit/efcfdc0324e583ad0c5cef49bc1d46b3a1d7d40f#diff-7499cf11347b213d03431440d71849c245e72c7abd1edc244299fddab8e3051a
  2. https://github.com/nukeviet/nukeviet/commit/efcfdc0324e583ad0c5cef49bc1d46b3a1d7d40f#diff-179c8cb54b1c3019416f50f1027fc58e431ef4c40ff888c1024d6e3347fb696c
  3. https://github.com/nukeviet/nukeviet/commit/efcfdc0324e583ad0c5cef49bc1d46b3a1d7d40f#diff-e541321f578e159ac60c9505ca114ce1ad12e2f40f2d51375c44a7f87529dfe0
  • Sửa ở khu vực xác thực captcha, thường ở trong các file kiểu như modules/ten-module/funcs/ten_file.php: Thêm lên đầu trang:
// Xác định có áp dụng reCaptcha hay không
$reCaptchaPass = (!empty($global_config['recaptcha_sitekey']) and !empty($global_config['recaptcha_secretkey']) and ($global_config['recaptcha_ver'] == 2 or $global_config['recaptcha_ver'] == 3));

Tìm đến khu vực xác thực captcha, thường là ở quanh khu vực có từ khóa "nv_capcha_txt", sửa thành:

    unset($fcaptcha);
    if ($module_config[$module_name]['captcha_type'] == 'recaptcha' and $reCaptchaPass) {
        // Xác định giá trị của captcha nhập vào nếu sử dụng reCaptcha
        $fcaptcha = $nv_Request->get_title('g-recaptcha-response', 'post', '');
    } elseif ($module_config[$module_name]['captcha_type'] == 'captcha') {
        // Xác định giá trị của captcha nhập vào nếu sử dụng captcha hình
        $fcaptcha = $nv_Request->get_title('fcode', 'post', '');
    }

    // Kiểm tra tính hợp lệ của captcha nhập vào, nếu không hợp lệ => thông báo lỗi
    if (isset($fcaptcha) and !nv_capcha_txt($fcaptcha, $module_config[$module_name]['captcha_type'])) {
        nv_jsonOutput([
            'status' => 'error',
            'input' => ($module_config[$module_name]['captcha_type'] == 'recaptcha') ? '' : 'fcode',
            'mess' => ($module_config[$module_name]['captcha_type'] == 'recaptcha') ? $lang_global['securitycodeincorrect1'] : $lang_global['securitycodeincorrect']
        ]);
    }
  • Sửa ở khu vực quản lý hiển thị captcha, thường ở trong các file kiểu như modules/ten_module/theme.php Chỗ nào có:
    if ($global_config['captcha_type'] == 2) {
        ...
        $xtpl->parse('main.recaptcha');
    }

Thay bằng:

    // Thêm vào global 3 biến toàn cục này (nếu chưa có)
    global $global_config, $module_config, $module_name;

    // Xác định có áp dụng reCaptcha hay không
    $reCaptchaPass = (!empty($global_config['recaptcha_sitekey']) and !empty($global_config['recaptcha_secretkey']) and ($global_config['recaptcha_ver'] == 2 or $global_config['recaptcha_ver'] == 3));

    // Nếu dùng reCaptcha v3
    if ($module_config[$module_name]['captcha_type'] == 'recaptcha' and $reCaptchaPass and $global_config['recaptcha_ver'] == 3) {
        $xtpl->parse('main.recaptcha3');
    }
    // Nếu dùng reCaptcha v2
    elseif ($module_config[$module_name]['captcha_type'] == 'recaptcha' and $reCaptchaPass and $global_config['recaptcha_ver'] == 2) {
        ...
        $xtpl->parse('main.recaptcha');
    }
  • Sửa ở các file tpl hiển thị captcha, ví dụ: themes/default/module/users/login_form.tpl. Tìm đến FORM có chứa các mã hiển thị captcha, ví dụ:
<form action="{USER_LOGIN}" method="post" onsubmit="return login_validForm(this);" autocomplete="off" novalidate>

Thay bằng:

<form action="{USER_LOGIN}" method="post" onsubmit="return login_validForm(this);" autocomplete="off" novalidate<!-- BEGIN: recaptcha3 --> data-recaptcha3="1"<!-- END: recaptcha3 -->>

Tìm đến đoạn kiểu như:

<!-- BEGIN: recaptcha -->
...
<div id="{RECAPTCHA_ELEMENT}"></div>
...
<!-- END: recaptcha -->

div có chứa id="{RECAPTCHA_ELEMENT}" thay bằng:

<div id="{RECAPTCHA_ELEMENT}" data-toggle="recaptcha" data-pnum="4" data-btnselector="[type=submit]"></div>

Trong đó giá trị của data-pnum bằng số bước ngược lên kể từ phần tử này đến khi gặp thẻ FORM (chính là pnum của nv_recaptcha_elements.push ngay dưới), data-btnselector là selector nhận diện nút submit của FORM. Xóa toàn bộ đoạn mã javascript ở dưới (<script type="text/javascript">...</script>)

5. Thay NV_BASE_SITEURL thành NV_STATIC_URL

(Không bắt buộc làm việc này nếu code của bạn chỉ có 1 hosting duy nhất)

Tìm tất cả:

NV_BASE_SITEURL . NV_ASSETS_DIR

Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:

NV_STATIC_URL . NV_ASSETS_DIR

Tìm tất cả:

NV_BASE_SITEURL . 'themes

Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:

NV_STATIC_URL . 'themes

Tìm tất cả:

NV_BASE_SITEURL . NV_EDITORSDIR

Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:

NV_STATIC_URL . NV_EDITORSDIR

Tìm tất cả:

{NV_BASE_SITEURL}{NV_ASSETS_DIR}

Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:

{NV_STATIC_URL}{NV_ASSETS_DIR}

Tìm tất cả:

{NV_BASE_SITEURL}{NV_EDITORSDIR}

Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:

{NV_STATIC_URL}{NV_EDITORSDIR}

Tìm tất cả:

{NV_BASE_SITEURL}themes

Nếu đó là đường dẫn đến file tĩnh (js, css, jpg, png, gif...) thay bằng:

{NV_STATIC_URL}themes

6. rel="noopener noreferrer nofollow"

Vì lý do bảo mật, hệ thống tự động thêm rel="noopener noreferrer nofollow" vào các link chuyển hướng đến một site khác. Để tránh việc thêm này bạn cần tự thêm vào link đoạn sau:

rel="dofollow"

7. Thêm cấu hình bình luận

Nếu module của bạn có chức năng bình luận, tức trong file action_mysql.php có dòng này

$sql_create_module[] = 'INSERT INTO ' . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . $lang . "', '" . $module_name . "', 'auto_postcomm', '1')";

Bổ sung vào file action_mysql.php

$sql_create_module[] = 'INSERT INTO ' . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . $lang . "', '" . $module_name . "', 'captcha_area_comm', '1')";
$sql_create_module[] = 'INSERT INTO ' . NV_CONFIG_GLOBALTABLE . " (lang, module, config_name, config_value) VALUES ('" . $lang . "', '" . $module_name . "', 'captcha_type_comm', 'captcha')";
Clone this wiki locally