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.4.02 lên NukeViet 4.5.02

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:
Hướng dẫn nâng cấp module từ NukeViet 4.4.02 lên NukeViet 4.5.02

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, chuyển captcha về quản lý tập trung

Bước này cần xác định xem module của bạn dùng duy nhất một cấu hình captcha hay có nhiều khu vực, mỗi khu vực có một cấu hình captcha độc lập nhau. Sau đó bạn làm theo một trong hai cách sau

Nếu dùng chung một cấu hình captcha duy nhất

  • Thêm vào cơ sở dữ liệu
INSERT INTO `nv4_config` (`lang`, `module`, `config_name`, `config_value`) VALUES ('vi', 'tên_module', 'captcha_type', 'captcha');
  • Xóa toàn bộ phần cấu hình captcha của module (Nếu có)
  • Ở khu vực kiểm tra captcha (khu vực kiểm tra submit form có chứa captcha) chỉnh lại dạng như sau:
unset($fcaptcha);if ($module_captcha == 'recaptcha') {    // 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_captcha == '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ỗiif (isset($fcaptcha) and !nv_capcha_txt($fcaptcha, $module_captcha)) {    // Xử lý khi lỗi captcha. Code bên dưới là một ví dụ (tùy hướng xử lý ở module của bạn)    nv_jsonOutput([        'status' => 'error',        'input' => ($module_captcha == 'recaptcha') ? '' : 'fcode',        'mess' => ($module_captcha == 'recaptcha') ? $lang_global['securitycodeincorrect1'] : $lang_global['securitycodeincorrect']    ]);    // Hoặc    $error = ($module_captcha == 'recaptcha') ? $lang_global['securitycodeincorrect1'] : $lang_global['securitycodeincorrect'];}

Lưu ý: Nếu đoạn code xử lý nằm ở trong hàm cần gọi biến toàn cục global $module_captcha;

  • Ở function hiển thị captcha (thường ở trong file modules/tên_module/theme.php) cần chỉnh sửa dạng như sau
if ($module_captcha == 'recaptcha' and $global_config['recaptcha_ver'] == 3) {    // Nếu dùng reCaptcha v3    // Xuất recaptcha v3 ví dụ    $xtpl->parse('main.recaptcha3');} elseif ($module_captcha == 'recaptcha' and $global_config['recaptcha_ver'] == 2) {    // Nếu dùng reCaptcha v2    // Đoạn code cũ của bạn dùng để xuất recaptcha v2, ví dụ    $xtpl->assign('RECAPTCHA_ELEMENT', 'recaptcha' . nv_genpass(8));    $xtpl->assign('N_CAPTCHA', $lang_global['securitycode1']);    $xtpl->parse('main.recaptcha');} elseif ($module_captcha == 'captcha') {    // Nếu dùng captcha hình    // Code xuất captcha hình (captcha mặc định cũ của bạn) ví dụ    $xtpl->assign('GFX_WIDTH', NV_GFX_WIDTH);    $xtpl->assign('GFX_HEIGHT', NV_GFX_HEIGHT);    $xtpl->assign('NV_BASE_SITEURL', NV_BASE_SITEURL);    $xtpl->assign('CAPTCHA_REFRESH', $lang_global['captcharefresh']);    $xtpl->assign('NV_GFX_NUM', NV_GFX_NUM);    $xtpl->parse('main.captcha');}

Lưu ý: Nếu đoạn code xử lý nằm ở trong hàm cần gọi biến toàn cục global $module_captcha;

Nếu có nhiều khu vực, mỗi khu vực có một cấu hình captcha độc lập nhau

Cách này khó, bạn cần đọc thật kỹ để hiểu và làm. Chúng tôi cũng không khuyến khích bạn dùng cách này trừ khi bạn thực sự am hiểu. Một module chỉ cần một cấu hình captcha chung là đã đủ.

Viết phần cấu hình captcha

  • Thêm vào cơ sở dữ liệu:

Nếu cấu hình trong bảng nv4_config thì thêm các khóa cấu hình ví dụ:

INSERT INTO `nv4_config` (`lang`, `module`, `config_name`, `config_value`) VALUES ('vi', 'ten-module', 'captcha1_type', 'captcha');INSERT INTO `nv4_config` (`lang`, `module`, `config_name`, `config_value`) VALUES ('vi', 'ten-module', 'captcha2_type', 'captcha');INSERT INTO `nv4_config` (`lang`, `module`, `config_name`, `config_value`) VALUES ('vi', 'ten-module', 'captcha3_type', 'captcha');...

Nếu cấu hình trong bảng riêng giả sửa nv4_vi_download_config thì thêm các khóa ví dụ:

INSERT INTO nv4_vi_download_config (config_name, config_value) VALUES ('captcha1_type', 'captcha');INSERT INTO nv4_vi_download_config (config_name, config_value) VALUES ('captcha2_type', 'captcha');INSERT INTO nv4_vi_download_config (config_name, config_value) VALUES ('captcha3_type', 'captcha');...

Giá trị cấu hình này sẽ được lập trình nằm vào một trong 3: captcha/recaptcha/rỗng

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

Mục đích bước này là lập trình phần quản lý bật/tắt hoặc chọn loại captcha hình/recaptcha cho từng khóa cấu hình. Bạn cần đọc hiểu và sửa module của bạn, không phải copy các thay đổi ví dụ bên trên là chạy được

  • 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 biến $reCaptchaPass trước khi lập trình code xác thực:
// 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ỗiif (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']    ]);}

Chú ý: Trong ví dụ trên bạn cần thay biến $module_config[$module_name]['captcha_type'] bằng biến chứa cấu hình captcha tương ứng ví dụ

$module_config[$module_name]['captcha1_type']$module_config[$module_name]['captcha2_type']$global_array_config['captcha1_type']$global_array_config['captcha2_type']

tùy kiểu bạn quản lý.

  • 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));if ($module_config[$module_name]['captcha_type'] == 'recaptcha' and $reCaptchaPass and $global_config['recaptcha_ver'] == 3) {    // Nếu dùng reCaptcha v3    $xtpl->parse('main.recaptcha3');} elseif ($module_config[$module_name]['captcha_type'] == 'recaptcha' and $reCaptchaPass and $global_config['recaptcha_ver'] == 2) {    // Nếu dùng reCaptcha v2    $xtpl->parse('main.recaptcha');}

Sửa ở các file tpl hiển thị captcha (áp dụng chung cho cả trường hợp dùng chung cấu hình tập trung hay cấu hình riêng)

Tìm đến FORM có chứa các mã hiển thị captcha bổ sung <!-- BEGIN: recaptcha3 --> data-recaptcha3="1"<!-- END: recaptcha3 --> vào trong thẻ <form>. Ví dụ:

<form action="{USER_LOGIN}">

Sửa lại thành:

<form action="{USER_LOGIN}"<!-- 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>) ví dụ xóa

<script type="text/javascript">nv_recaptcha_elements.push({    id: "{RECAPTCHA_ELEMENT}",    <!-- BEGIN: smallbtn -->size: "compact",<!-- END: smallbtn -->    btn: $('[type="submit"]', $('#{RECAPTCHA_ELEMENT}').parent().parent().parent().parent()),    pnum: 4,    btnselector: '[type="submit"]'})</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')";

8. 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

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