Skip to content

Commit f4fef89

Browse files
VINADES.,JSChoaquynhtim99
VINADES.,JSC
authored andcommitted
Anti CSRF and Cors config
1 parent af2a066 commit f4fef89

File tree

22 files changed

+336
-200
lines changed

22 files changed

+336
-200
lines changed

admin/seotools/sitemapPing.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ function nv_sitemapPing($module, $link)
6161
}
6262

6363
if (! $result and nv_function_exists('fsockopen')) {
64-
$url_parts = @parse_url($link);
64+
$url_parts = parse_url($link);
6565
if (! $url_parts) {
6666
return $lang_module['searchEngineFailed'];
6767
}

admin/settings/admin.menu.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* @Createdate 07/30/2013 10:27
99
*/
1010

11-
if (! defined('NV_ADMIN')) {
11+
if (!defined('NV_ADMIN')) {
1212
die('Stop!!!');
1313
}
1414

admin/settings/security.php

+58-30
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,7 @@
4444
$selectedtab = 0;
4545
}
4646

47-
$array_config_global = [];
48-
$array_config_define = [];
49-
$array_config_site = [];
47+
$array_config_global = $array_config_define = $array_config_cross = [];
5048

5149
$checkss = md5(NV_CHECK_SESSION . '_' . $module_name . '_' . $op . '_' . $admin_info['userid']);
5250
// Xử lý các thiết lập cơ bản
@@ -56,8 +54,8 @@
5654
$array_config_global['proxy_blocker'] = $proxy_blocker;
5755
}
5856

59-
$array_config_global['str_referer_blocker'] = (int)$nv_Request->get_bool('str_referer_blocker', 'post');
60-
$array_config_global['is_login_blocker'] = (int)$nv_Request->get_bool('is_login_blocker', 'post', false);
57+
$array_config_global['str_referer_blocker'] = (int) $nv_Request->get_bool('str_referer_blocker', 'post');
58+
$array_config_global['is_login_blocker'] = (int) $nv_Request->get_bool('is_login_blocker', 'post', false);
6159
$array_config_global['login_number_tracking'] = $nv_Request->get_int('login_number_tracking', 'post', 0);
6260
$array_config_global['login_time_tracking'] = $nv_Request->get_int('login_time_tracking', 'post', 0);
6361
$array_config_global['login_time_ban'] = $nv_Request->get_int('login_time_ban', 'post', 0);
@@ -223,43 +221,72 @@
223221

224222
$lang_module['two_step_verification_note'] = sprintf($lang_module['two_step_verification_note'], $lang_module['two_step_verification0'], NV_BASE_ADMINURL . 'index.php?' . NV_LANG_VARIABLE . '=' . NV_LANG_DATA . '&' . NV_NAME_VARIABLE . '=users&' . NV_OP_VARIABLE . '=groups');
225223

226-
// Xử lý thiết lập CORS
224+
// Xử lý thiết lập CORS, Anti CSRF
227225
if ($nv_Request->isset_request('submitcors', 'post') and $checkss == $nv_Request->get_string('checkss', 'post')) {
228-
$array_config_site['cors_restrict_domains'] = (int)$nv_Request->get_bool('cors_restrict_domains', 'post', false);
229-
$cors_valid_domains = $nv_Request->get_textarea('cors_valid_domains', '', NV_ALLOWED_HTML_TAGS, true);
230-
$cors_valid_domains = explode('<br />', strip_tags($cors_valid_domains, '<br>'));
231-
232-
$array_config_site['cors_valid_domains'] = [];
233-
foreach ($cors_valid_domains as $domain) {
234-
if (!empty($domain)) {
235-
$domain = parse_url($domain);
236-
if (is_array($domain)) {
237-
if (sizeof($domain) == 1 and !empty($domain['path'])) {
238-
$domain['host'] = $domain['path'];
226+
$array_config_cross['crosssite_restrict'] = (int) $nv_Request->get_bool('crosssite_restrict', 'post', false);
227+
$array_config_cross['crossadmin_restrict'] = (int) $nv_Request->get_bool('crossadmin_restrict', 'post', false);
228+
229+
// Lấy các request domain
230+
$cfg_keys = ['crosssite_valid_domains', 'crossadmin_valid_domains'];
231+
foreach ($cfg_keys as $cfg_key) {
232+
$domains = $nv_Request->get_textarea($cfg_key, '', NV_ALLOWED_HTML_TAGS, true);
233+
$domains = explode('<br />', strip_tags($domains, '<br>'));
234+
235+
$array_config_cross[$cfg_key] = [];
236+
foreach ($domains as $domain) {
237+
if (!empty($domain)) {
238+
$domain = parse_url($domain);
239+
if (is_array($domain)) {
240+
if (sizeof($domain) == 1 and !empty($domain['path'])) {
241+
$domain['host'] = $domain['path'];
242+
}
243+
if (!isset($domain['scheme'])) {
244+
$domain['scheme'] = 'http';
245+
}
246+
$domain_name = nv_check_domain($domain['host']);
247+
if (!empty($domain_name)) {
248+
$domain = $domain['scheme'] . '://' . $domain_name . ((isset($domain['port']) and $domain['port'] != '80') ? (':' . $domain['port']) : '');
249+
$array_config_cross[$cfg_key][] = $domain;
250+
}
239251
}
240-
if (!isset($domain['scheme'])) {
241-
$domain['scheme'] = 'http';
242-
}
243-
$array_config_site['cors_valid_domains'][] = $domain['scheme'] . '://' . $domain['host'] . ((isset($domain['port']) and $domain['port'] != '80') ? (':' . $domain['port']) : '');
244252
}
245253
}
254+
$array_config_cross[$cfg_key] = empty($array_config_cross[$cfg_key]) ? '' : json_encode(array_unique($array_config_cross[$cfg_key]));
246255
}
247-
$array_config_site['cors_valid_domains'] = empty($array_config_site['cors_valid_domains']) ? '' : json_encode($array_config_site['cors_valid_domains']);
248256

249-
$sth = $db->prepare("UPDATE " . NV_CONFIG_GLOBALTABLE . " SET config_value = :config_value WHERE lang = 'sys' AND module = 'site' AND config_name = :config_name");
250-
foreach ($array_config_site as $config_name => $config_value) {
257+
// Lấy các request IPs
258+
$cfg_keys = ['crosssite_valid_ips', 'crossadmin_valid_ips'];
259+
foreach ($cfg_keys as $cfg_key) {
260+
$str_ips = $nv_Request->get_textarea($cfg_key, '', NV_ALLOWED_HTML_TAGS, true);
261+
$str_ips = explode('<br />', strip_tags($str_ips, '<br>'));
262+
263+
$array_config_cross[$cfg_key] = [];
264+
foreach ($str_ips as $str_ip) {
265+
if ($ips->isIp4($str_ip) or $ips->isIp6($str_ip)) {
266+
$array_config_cross[$cfg_key][] = $str_ip;
267+
}
268+
}
269+
$array_config_cross[$cfg_key] = empty($array_config_cross[$cfg_key]) ? '' : json_encode(array_unique($array_config_cross[$cfg_key]));
270+
}
271+
272+
$sth = $db->prepare("UPDATE " . NV_CONFIG_GLOBALTABLE . " SET config_value=:config_value WHERE lang='sys' AND module='global' AND config_name=:config_name");
273+
foreach ($array_config_cross as $config_name => $config_value) {
251274
$sth->bindParam(':config_name', $config_name, PDO::PARAM_STR, 30);
252275
$sth->bindParam(':config_value', $config_value, PDO::PARAM_STR);
253276
$sth->execute();
254277
}
255278

256-
nv_insert_logs(NV_LANG_DATA, $module_name, 'LOG_CHANGE_CORS_SETTING', $global_config['cors_restrict_domains'] . ': ' . $array_config_site['cors_valid_domains'], $admin_info['userid']);
257-
$nv_Cache->delMod($module_name);
279+
nv_insert_logs(NV_LANG_DATA, $module_name, 'LOG_CHANGE_CORS_SETTING', json_encode($array_config_cross), $admin_info['userid']);
280+
nv_save_file_config_global();
258281

259282
nv_redirect_location(NV_BASE_ADMINURL . 'index.php?' . NV_LANG_VARIABLE . '=' . NV_LANG_DATA . '&' . NV_NAME_VARIABLE . '=' . $module_name . '&' . NV_OP_VARIABLE . '=' . $op . '&selectedtab=' . $selectedtab . '&rand=' . nv_genpass());
260283
} else {
261-
$array_config_site['cors_restrict_domains'] = $global_config['cors_restrict_domains'];
262-
$array_config_site['cors_valid_domains'] = empty($global_config['cors_valid_domains']) ? '' : implode("\n", $global_config['cors_valid_domains']);
284+
$array_config_cross['crosssite_restrict'] = $global_config['crosssite_restrict'];
285+
$array_config_cross['crosssite_valid_domains'] = empty($global_config['crosssite_valid_domains']) ? '' : implode("\n", $global_config['crosssite_valid_domains']);
286+
$array_config_cross['crosssite_valid_ips'] = empty($global_config['crosssite_valid_ips']) ? '' : implode("\n", $global_config['crosssite_valid_ips']);
287+
$array_config_cross['crossadmin_restrict'] = $global_config['crossadmin_restrict'];
288+
$array_config_cross['crossadmin_valid_domains'] = empty($global_config['crossadmin_valid_domains']) ? '' : implode("\n", $global_config['crossadmin_valid_domains']);
289+
$array_config_cross['crossadmin_valid_ips'] = empty($global_config['crossadmin_valid_ips']) ? '' : implode("\n", $global_config['crossadmin_valid_ips']);
263290
}
264291

265292
$xtpl = new XTemplate($op . '.tpl', NV_ROOTDIR . '/themes/' . $global_config['module_theme'] . '/modules/' . $module_file);
@@ -509,9 +536,10 @@
509536
$xtpl->parse('main.error_save');
510537
}
511538

512-
$array_config_site['cors_restrict_domains'] = empty($array_config_site['cors_restrict_domains']) ? '' : ' checked="checked"';
539+
$array_config_cross['crosssite_restrict'] = empty($array_config_cross['crosssite_restrict']) ? '' : ' checked="checked"';
540+
$array_config_cross['crossadmin_restrict'] = empty($array_config_cross['crossadmin_restrict']) ? '' : ' checked="checked"';
513541

514-
$xtpl->assign('CONFIG_SITE', $array_config_site);
542+
$xtpl->assign('CONFIG_CROSS', $array_config_cross);
515543

516544
$xtpl->assign('IS_FLOOD_BLOCKER', ($array_config_flood['is_flood_blocker']) ? ' checked="checked"' : '');
517545
$xtpl->assign('MAX_REQUESTS_60', $array_config_flood['max_requests_60']);

includes/core/admin_functions.php

+15-6
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,9 @@ function nv_save_file_config_global()
100100

101101
$content_config = "<?php" . "\n\n";
102102
$content_config .= NV_FILEHEAD . "\n\n";
103-
$content_config .= "if (!defined('NV_MAINFILE'))\n die('Stop!!!');\n\n";
103+
$content_config .= "if (!defined('NV_MAINFILE')) {\n die('Stop!!!');\n}\n\n";
104104

105-
$config_variable = array();
105+
$config_variable = [];
106106
$allowed_html_tags = '';
107107
$sql = "SELECT module, config_name, config_value FROM " . NV_CONFIG_GLOBALTABLE . " WHERE lang='sys' AND (module='global' OR module='define') ORDER BY config_name ASC";
108108
$result = $db->query($sql);
@@ -145,6 +145,7 @@ function nv_save_file_config_global()
145145
$config_variable['error_send_email'] = $config_variable['error_send_email'];
146146

147147
$config_name_array = ['file_allowed_ext', 'forbid_extensions', 'forbid_mimes', 'allow_sitelangs', 'allow_request_mods', 'config_sso'];
148+
$config_name_json = ['crosssite_valid_domains', 'crosssite_valid_ips', 'crossadmin_valid_domains', 'crossadmin_valid_ips'];
148149

149150
foreach ($config_variable as $c_config_name => $c_config_value) {
150151
if (in_array($c_config_name, $config_name_array)) {
@@ -153,7 +154,15 @@ function nv_save_file_config_global()
153154
} else {
154155
$c_config_value = '';
155156
}
156-
$content_config .= "\$global_config['" . $c_config_name . "']=array(" . $c_config_value . ");\n";
157+
$content_config .= "\$global_config['" . $c_config_name . "']=[" . $c_config_value . "];\n";
158+
} elseif (in_array($c_config_name, $config_name_json)) {
159+
$c_config_value = empty($c_config_value) ? [] : ((array) json_decode($c_config_value, true));
160+
if (empty($c_config_value)) {
161+
$c_config_value = '';
162+
} else {
163+
$c_config_value = "'" . implode("','", array_map('trim', $c_config_value)) . "'";
164+
}
165+
$content_config .= "\$global_config['" . $c_config_name . "']=[" . $c_config_value . "];\n";
157166
} else {
158167
if (preg_match('/^(0|[1-9][0-9]*)$/', $c_config_value) and $c_config_name != 'facebook_client_id') {
159168
$content_config .= "\$global_config['" . $c_config_name . "']=" . $c_config_value . ";\n";
@@ -175,15 +184,15 @@ function nv_save_file_config_global()
175184
while ($row = $result->fetch()) {
176185
$c_config_value[] = $row['lang'];
177186
}
178-
$content_config .= "\$global_config['setup_langs']=array('" . implode("','", $c_config_value) . "');\n";
187+
$content_config .= "\$global_config['setup_langs']=['" . implode("','", $c_config_value) . "'];\n";
179188

180189
//allowed_html_tags
181190
if (!empty($allowed_html_tags)) {
182191
$allowed_html_tags = "'" . implode("','", array_map('trim', explode(',', $allowed_html_tags))) . "'";
183192
} else {
184193
$allowed_html_tags = '';
185194
}
186-
$content_config .= "\$global_config['allowed_html_tags']=array(" . $allowed_html_tags . ");\n";
195+
$content_config .= "\$global_config['allowed_html_tags']=[" . $allowed_html_tags . "];\n";
187196

188197
//Xac dinh cac search_engine
189198
$engine_allowed = (file_exists(NV_ROOTDIR . '/' . NV_DATADIR . '/search_engine.xml')) ? nv_object2array(simplexml_load_file(NV_ROOTDIR . '/' . NV_DATADIR . '/search_engine.xml')) : array();
@@ -218,7 +227,7 @@ function nv_save_file_config_global()
218227
}
219228
$content_config .= "\$nv_plugin_area=" . nv_var_export($nv_plugin_area) . ";\n\n";
220229

221-
$return = file_put_contents(NV_ROOTDIR . "/" . NV_DATADIR . "/config_global.php", trim($content_config), LOCK_EX);
230+
$return = file_put_contents(NV_ROOTDIR . "/" . NV_DATADIR . "/config_global.php", trim($content_config) . "\n", LOCK_EX);
222231
$nv_Cache->delAll();
223232

224233
//Resets the contents of the opcode cache

includes/core/rpc.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ function nv_getRPC($url, $data)
2222
$rand = array_rand($userAgents);
2323
$agent = $userAgents[$rand];
2424

25-
$url_info = @parse_url($url);
25+
$url_info = parse_url($url);
2626
$url_info['port'] = isset($url_info['port']) ? intval($url_info['port']) : 80;
2727
if (isset($url_info['path'])) {
2828
if (substr($url_info['path'], 0, 1) != '/') {

includes/functions.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -1766,7 +1766,7 @@ function nv_is_url($url)
17661766

17671767
$url = nv_strtolower($url);
17681768

1769-
if (!($parts = @parse_url($url))) {
1769+
if (!($parts = parse_url($url))) {
17701770
return false;
17711771
}
17721772

@@ -1813,7 +1813,7 @@ function nv_check_url($url, $is_200 = 0)
18131813
if (nv_function_exists('get_headers') and $allow_url_fopen == 1) {
18141814
$res = get_headers($url);
18151815
} elseif (nv_function_exists('curl_init') and nv_function_exists('curl_exec')) {
1816-
$url_info = @parse_url($url);
1816+
$url_info = parse_url($url);
18171817
$port = isset($url_info['port']) ? intval($url_info['port']) : 80;
18181818

18191819
$userAgents = array(

includes/language/en/admin_settings.php

+11-5
Original file line numberDiff line numberDiff line change
@@ -274,11 +274,17 @@
274274
$lang_module['cron_interval_type'] = 'Repeat type (if available)';
275275
$lang_module['cron_interval_type0'] = 'After the launch time in the database';
276276
$lang_module['cron_interval_type1'] = 'After the actual launch time';
277-
$lang_module['cors'] = 'CORS Setting';
278-
$lang_module['cors_help'] = 'Enable this feature to restrict CORS request from other domains to the website';
279-
$lang_module['cors_restrict_domains'] = 'Domain limit';
280-
$lang_module['cors_valid_domains'] = 'Valid domains';
281-
$lang_module['cors_valid_domains_help'] = 'Enter each one-line domain name (please enter the full form http://yourdomain.com). CORS request from these domains are allowed';
277+
$lang_module['cors'] = 'Cross-Site config';
278+
$lang_module['cors_site_restrict'] = 'Protect the user area';
279+
$lang_module['cors_site_restrict_help'] = 'Enable this option to block all external post request to the user area';
280+
$lang_module['cors_site_valid_domains'] = 'Valid domain for the user area';
281+
$lang_module['cors_site_valid_ips'] = 'Valid IP for the user area';
282+
$lang_module['cors_admin_restrict'] = 'Protect the admin area';
283+
$lang_module['cors_admin_restrict_help'] = 'Enable this option to block all external post request to the admin area';
284+
$lang_module['cors_admin_valid_domains'] = 'Valid domain for the admin area';
285+
$lang_module['cors_admin_valid_ips'] = 'Valid IP for the admin area';
286+
$lang_module['cors_valid_domains_help'] = 'Enter one domain per line (please enter the full form http://yourdomain.com), post request from these domains are allowed';
287+
$lang_module['cors_valid_ips_help'] = 'Enter one IP per line, post request from these IPs are allowed';
282288
$lang_module['admin_2step_opt'] = 'Two-step verification methods are allowed in administration';
283289
$lang_module['admin_2step_default'] = 'The default two-step verification method in administration';
284290
$lang_module['admin_2step_appconfig'] = 'Set up the application here';

includes/language/fr/admin_settings.php

+11-5
Original file line numberDiff line numberDiff line change
@@ -274,11 +274,17 @@
274274
$lang_module['cron_interval_type'] = 'Répéter le type (si disponible)';
275275
$lang_module['cron_interval_type0'] = 'Après l\'heure de lancement dans la base de données';
276276
$lang_module['cron_interval_type1'] = 'Après l\'heure de lancement réelle';
277-
$lang_module['cors'] = 'CORS Setting';
278-
$lang_module['cors_help'] = 'Activer cette fonctionnalité pour limiter la demande CORS des autres domaines au site Web';
279-
$lang_module['cors_restrict_domains'] = 'Limite de domaine';
280-
$lang_module['cors_valid_domains'] = 'Domaines valides';
281-
$lang_module['cors_valid_domains_help'] = 'Entrez chaque nom de domaine en une ligne (veuillez saisir le formulaire complet http://votredomaine.com). Les demandes CORS de ces domaines sont autorisées';
277+
$lang_module['cors'] = 'Cross-Site config';
278+
$lang_module['cors_site_restrict'] = 'Protégez l\'espace utilisateur';
279+
$lang_module['cors_site_restrict_help'] = 'Activez cette option pour bloquer toutes les demandes de publication externes dans la zone utilisateur';
280+
$lang_module['cors_site_valid_domains'] = 'Domaine valide pour la zone utilisateur';
281+
$lang_module['cors_site_valid_ips'] = 'IP valide pour la zone utilisateur';
282+
$lang_module['cors_admin_restrict'] = 'Protéger la zone d\'administration';
283+
$lang_module['cors_admin_restrict_help'] = 'Activez cette option pour bloquer toutes les demandes de publication externes dans la zone d\'administration';
284+
$lang_module['cors_admin_valid_domains'] = 'Domaine valide pour la zone d\'administration';
285+
$lang_module['cors_admin_valid_ips'] = 'IP valide pour la zone d\'administration';
286+
$lang_module['cors_valid_domains_help'] = 'Entrez un domaine par ligne (veuillez entrer le formulaire complet http://votredomaine.com), les demandes de publication de ces domaines sont autorisées';
287+
$lang_module['cors_valid_ips_help'] = 'Entrez une adresse IP par ligne, la demande de publication de ces adresses IP est autorisée';
282288
$lang_module['admin_2step_opt'] = 'Les méthodes de vérification en deux étapes sont autorisées dans l\'administration';
283289
$lang_module['admin_2step_default'] = 'La méthode de vérification en deux étapes par défaut dans l\'administration';
284290
$lang_module['admin_2step_appconfig'] = 'Configurez l\'application ici';

includes/language/vi/admin_settings.php

+11-5
Original file line numberDiff line numberDiff line change
@@ -291,8 +291,14 @@
291291
$lang_module['noflood_ip_edit'] = 'Sửa IP bỏ qua kiểm tra flood';
292292
$lang_module['noflood_ip_list'] = 'Các IP bỏ qua kiểm tra flood';
293293

294-
$lang_module['cors'] = 'Thiết lập CORS';
295-
$lang_module['cors_help'] = 'Bật tính năng này để hạn chế các truy vấn CORS từ các tên miền khác đến website';
296-
$lang_module['cors_restrict_domains'] = 'Giới hạn tên miền';
297-
$lang_module['cors_valid_domains'] = 'Tên miền hợp lệ';
298-
$lang_module['cors_valid_domains_help'] = 'Nhập mỗi tên miền một dòng (vui lòng nhập đầy đủ dạng http://yourdomain.com). Các truy vấn CORS từ các tên miền này được phép thực hiện';
294+
$lang_module['cors'] = 'Thiết lập Cross-Site';
295+
$lang_module['cors_site_restrict'] = 'Bảo vệ ngoài site';
296+
$lang_module['cors_site_restrict_help'] = 'Kích hoạt chức năng này để chặn toàn bộ truy vấn từ bên ngoài vào khu vực ngoài site';
297+
$lang_module['cors_site_valid_domains'] = 'Tên miền hợp lệ ngoài site';
298+
$lang_module['cors_site_valid_ips'] = 'IP hợp lệ ngoài site';
299+
$lang_module['cors_admin_restrict'] = 'Bảo vệ khu vực quản trị';
300+
$lang_module['cors_admin_restrict_help'] = 'Kích hoạt chức năng này để chặn toàn bộ truy vấn từ bên ngoài vào khu vực quản trị';
301+
$lang_module['cors_admin_valid_domains'] = 'Tên miền hợp lệ trong quản trị';
302+
$lang_module['cors_admin_valid_ips'] = 'IP hợp lệ trong quản trị';
303+
$lang_module['cors_valid_domains_help'] = 'Nhập mỗi tên miền một dòng (vui lòng nhập đầy đủ dạng http://yourdomain.com), truy vấn từ các tên miền này được phép thực hiện';
304+
$lang_module['cors_valid_ips_help'] = 'Nhập mỗi IP một dòng, truy vấn từ các IP này được phép thực hiện';

includes/mainfile.php

-8
Original file line numberDiff line numberDiff line change
@@ -352,14 +352,6 @@
352352
}
353353
define('UPLOAD_CHECKING_MODE', $global_config['upload_checking_mode']);
354354

355-
// CORS handler
356-
if (!empty($global_config['cors_valid_domains'])) {
357-
$global_config['cors_valid_domains'] = json_decode($global_config['cors_valid_domains'], true);
358-
} else {
359-
$global_config['cors_valid_domains'] = [];
360-
}
361-
$nv_Request->CORSHandle($global_config);
362-
363355
if (defined('NV_ADMIN')) {
364356
if (!file_exists(NV_ROOTDIR . '/includes/language/' . NV_LANG_DATA . '/global.php')) {
365357
if ($global_config['lang_multi']) {

0 commit comments

Comments
 (0)