Thiết kế website Nukeviet 4.6 - Module Nukeviet - Giao Diện Nukeviet - Themes Nukeviet - Block Nukeviet - Diễn đàn Nukeviet

https://nukevietnam.com

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

Do đó bạn cần tìm và đổi tên các nút submit của form, và tìm các thẻ input của form nếu có [name=submit] cần đổi sang giá trị khác
Hướng dẫn nâng cấp module từ NukeViet 4.5.00 lên NukeViet 4.5.02

Chỉnh sửa để chức năng lọc mã html nguy hiểm hoạt động trước khi submit form

Lưu ý 2 vấn đề:

  • input[type=submit] của các html-form không được có thuộc tính [name=submit]
  • Trong html-form không được có Element có [name=submit]

Do đó bạn cần tìm và đổi tên các nút submit của form, và tìm các thẻ input của form nếu có [name=submit] cần đổi sang giá trị khác

Lưu ý: Phần này không bắt buộc phải thực hiện

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')";
  •  
Bạn đã không sử dụng site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây