Если открыть настройки роутера Netis N4, а затем попытаться добавить в чёрный список домен с дефисом в имени (например, osb-v2.samsungqbe.com), получим ошибку:
Попытаюсь разобраться, как это можно обойти…
Переходим в вэб-интерфейс настроек роутера.
▶ ▶
Здесь, при нажатии кнопки выполняется проверка корректности введённых данных. На кнопке висит ивент из скрипта skk.js.
В следующем скрипте, в строке 3767 идёт инициализация констант, среди которых регулярное выражение проверки URL:
/****************** 正则表达式验证 *************************/
// *********** Regular expression verification ************/
var regMap = {
// ...
url :/^([A-Za-z\d\.]+)$/,
// ...
};
Как видно, здесь нет дефиса. Чтобы проверка принимала имя домена с дефисом, нам нужна была бы такая константа с регулярным выражением:
url :/^([A-Za-z\d\.\-]+)$/,
Эти константы используются в строчке 4281
// 检查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; }
Что странно, в файле с сообщением об ошибке для русского языка такие строчки:
Пожалуйста, введите символы: a-z, A-Z ,0-9
При этом в файле с сообщением об ошибке для английского языка уже другие:
Please enter the characters: a-z, A-Z ,0-9,.-
Получается, что в принципе допускалось использование дефиса…
Проблема в том, что я не знаю, как исправить этот скрипт не перепрошивая роутер модифицированной прошивкой.
Значит пока попробую другой путь… При нажатии на кнопку , на сервер (роутер) отправляется запрос. Мы можем его исправить и отправить уже исправленный. Нам всё ещё необходимо быть авторизованным на роутере, но это не такая проблема, т.к. всё равно я всё буду привязывать скрипт к странице панели администрирования. Через 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 будет выполнять те же действия, что и скрипт на кнопке, но дефис уже проходит проверку. Для его запуска нужно будет открыть раздел настроек ▶ , заполнить поля Description и DNS Keywords, после чего вызвать контекстное меню ▶ . Скрипт для Tampermonkey приведён ниже:
/* 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}`);
}
});
})();
- Не приходит СМС для авторизации на сайте Госуслуги - 01.11.2024
- VSCode: Найти и удалить элементы xml - 29.10.2024
- WordPress: Ошибка в плагине WpDiscuz - 08.10.2024