Netis: Добавить правило блокировки для доменного имени с дефисом

Если открыть настройки роутера Netis N4, а затем попытаться добавить в чёрный список домен с дефисом в имени (например, osb-v2.samsungqbe.com), получим ошибку:

Пожалуйста, введите символы: a-z, A-Z ,0-9

 

Попытаюсь разобраться, как это можно обойти…

Переходим в вэб-интерфейс настроек роутера.
Access ControlDomain FilteringDomain Filtering Rule Settings
Здесь, при нажатии кнопки Add выполняется проверка корректности введённых данных. На кнопке висит ивент из скрипта skk.js.
В следующем скрипте, в строке 3767 идёт инициализация констант, среди которых регулярное выражение проверки URL:

skk.js
/****************** 正则表达式验证 *************************/
// *********** Regular expression verification ************/
var regMap = {
// ...
    url			:/^([A-Za-z\d\.]+)$/,
// ...
};

Как видно, здесь нет дефиса. Чтобы проверка принимала имя домена с дефисом, нам нужна была бы такая константа с регулярным выражением:

url			:/^([A-Za-z\d\.\-]+)$/,

Эти константы используются в строчке 4281

skk.js
// 检查DNS过滤关键字合法性
// Check the legitimacy of DNS filtering keywords
function check_url(ch){
	var str = ch.data;
	var reg = new RegExp(regMap.url);
	flag = reg.test(str);
	if(!flag){
		ch.info=$.CommonLan["string_url_err"];return;
	}
	ch.val = true;
}

Что странно, в файле с сообщением об ошибке для русского языка такие строчки:

squashfs-root\home\web.tar.gz\web.tar\web\config\language_ru.js
Пожалуйста, введите символы: a-z, A-Z ,0-9

При этом в файле с сообщением об ошибке для английского языка уже другие:

squashfs-root\home\web.tar.gz\web.tar\web\config\language_us.js
Please enter the characters: a-z, A-Z ,0-9,.-

Получается, что в принципе допускалось использование дефиса…

Проблема в том, что я не знаю, как исправить этот скрипт не перепрошивая роутер модифицированной прошивкой.
Значит пока попробую другой путь… При нажатии на кнопку Add, на сервер (роутер) отправляется запрос. Мы можем его исправить и отправить уже исправленный. Нам всё ещё необходимо быть авторизованным на роутере, но это не такая проблема, т.к. всё равно я всё буду привязывать скрипт к странице панели администрирования. Через Web Developer Tools (панель инструментов разработчика) браузера можно отловить вот такой запрос:

http://192.168.2.254/cgi-bin/skk_set.cgi?mode_name=skk_set&dns_des=DOMAIN_DESCRIPTION&dns_rule=0&dns_key=DOMAIN_NAME&dns_day=127&dns_time=all&dns_filter_set=add&wl_link=0&app=dns_filter

Здесь у нас участвуют такие значения:

192.168.2.254 // ip-адрес роутера
mode_name=skk_set // ?
dns_des=DOMAIN_DESCRIPTION // Domain Filtering Rule Settings -> Description (Описание)
dns_rule=0 // Domain Filtering Rule Settings -> Rule = Deny
dns_key=DOMAIN_NAME // Domain Filtering Rule Settings -> DNS Keywords (Доменное имя)
dns_day=127 // Domain Filtering Rule Settings -> Day = Everyday
dns_time=all // Domain Filtering Rule Settings -> Time = All day
dns_filter_set=add // Domain Filtering Rule Settings -> ? ADD action (наверное действие типа удалить правили или добавить)
wl_link=0 // Domain Filtering Rule Settings -> ?
app=dns_filter // Domain Filtering Rule Settings -> Domain Filtering menu

При удалении правила, запрос отправляется такой:

{
	"mode_name": "skk_set",
	"id": "1",
	"dns_des": "tvx.adgrx.com",
	"dns_rule": "0",
	"dns_key": "tvx.adgrx.com",
	"dns_day": "127",
	"dns_time": "all",
	"dns_filter_set": "del",
	"wl_link": "0",
	"app": "dns_filter"
}

Запускать из контекстного меню

// @run-at       context-menu

Данный скрипт для Tampermonkey будет выполнять те же действия, что и скрипт на кнопке, но дефис уже проходит проверку. Для его запуска нужно будет открыть раздел настроек Access ControlDomain Filtering, заполнить поля Description и DNS Keywords, после чего вызвать контекстное меню TampermonkeyPost Block DNS rule (Netis router). Скрипт для Tampermonkey приведён ниже:

Post Block DNS rule (Netis router).js
/* global $ */
// ==UserScript==
// @name         Post Block DNS rule (Netis router)
// @namespace    http://tampermonkey.net/
// @require      http://code.jquery.com/jquery-3.x-git.min.js
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        http://192.168.2.254/index.htm
// @run-at       context-menu
// @icon         https://www.google.com/s2/favicons?sz=64&domain=2.254
// ==/UserScript==
(function() {
    'use strict';
    // Your code here...
    var description = document.getElementById("dns_des_t");
    var MODE_NAME = "skk_set";
    var DNS_DES = description.value;
    var rule = document.getElementById("dns_rule");
    var DNS_RULE = rule.getAttribute("selected");
    var key = document.getElementById("dns_key_t");
    var DNS_KEY = key.value;
    let DNS_DAY = "127"; // will not change it (Everyday)
    let DNS_TIME = "all"; // will not change it (All Day)
    let DNS_FILTER_SET = "add"; // Adding the rule
    let WL_LINK = "0"; // ???
    let APP = "dns_filter"; // ???

    console.log(`DNS_DES.length = ${DNS_DES.length}`);
    if (DNS_DES.length > 20)
    {
        alert(`Description length must be 20 letters or less! (Default max length = 31)\nCurrent length = ${DNS_DES.length}`);
        return;
    }
    console.log(`DNS_DES.length = ${DNS_KEY.length}`);
    if (DNS_KEY.length > 31)
    {
        alert(`DNS Keywords length must be 31 letters or less!\nCurrent length = ${DNS_KEY.length}`);
        return;
    }
    const regMapUrl = /^([A-Za-z\d\.\-]+)$/;
    var reg = new RegExp(regMapUrl);
    var flag = reg.test(DNS_KEY);
    if(!flag)
    {
      alert(`Please enter the characters: a-z, A-Z ,0-9,.-`);
      return;
    }

    var requestData = "mode_name=" + MODE_NAME + "&dns_des=" + DNS_DES + "&dns_rule=" + DNS_RULE + "&dns_key=" + DNS_KEY + "&dns_day=" + DNS_DAY + "&dns_time=" + DNS_TIME + "&dns_filter_set=" + DNS_FILTER_SET + "&wl_link=" + WL_LINK + "&app=" + APP;
    console.log(requestData);
    $.ajax({ // add /* global $ */ at header to avoid error
      //   http://192.168.2.254/cgi-bin/skk_set.cgi/mode_name=skk_set&dns_des=ya-4.ru&dns_rule=0&dns_key=ya-4.ru&dns_day=127&dns_time=all&dns_filter_set=add&wl_link=0&app=dns_filter
      url: '/cgi-bin/skk_set.cgi',
      data: requestData,
      processData: false,
      contentType: false,
      type: 'POST',
      success: function(data) {
        alert(`Result: ${data}`);
      }
    });
})();
Здесь я не делал чтение чекбоксов дней недели, времени работы правила и других настроек. Скрипт просто заносит адрес в чёрный список с опциями ежедневно, весь день, запретить. У нас есть ограничение в 20 символов для поля описания и в 31 символ для доменного имени. Эти ограничения зашиты ещё глубже, так что даже если разрешить вводить домен из 32 символов и больше, то роутер выдаст ошибку Result: 87. Так что это ограничения я не стал снимать.

 



Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments