SthephanShinkufag / Dollchan-Extension-Tools

The best way to browse imageboards
https://dollchan.net/extension/
MIT License
368 stars 67 forks source link

[iichan.hk] automatic check for StormWall AntiDDoS protection. #1372

Closed f2d closed 3 years ago

f2d commented 4 years ago

Ваш запрос на улучшение функционала связан с проблемой?

Да.

В последнее время на Ычане постоянно активен антиддос-экран, который спустя каждые несколько (десятков?) минут требует проверку, чтобы обновить печеньки. Получая проверочную заглушку при обновлении постов, куклоскрипт выдаёт результат как errCorruptData.

Вроде как при наличии активного логина в гугле или ещё при каких-то условиях проверка проходится полностью автоматом, показывая галочку, но не перезагружая страницу с заглушкой (у меня так в браузере с куклой). Остаётся добавить ссылку или айфрейм на любой урл сайта, загрузить его и закрыть.

При отсутствии нужных условий требует проходить рекапчу и отмечать на фотках автобусы с мотоциклами, после успеха перезагружает само (у меня так в другом браузере без куклы).

Опишите ваше решение, которое вы хотели бы увидеть в реализаци

Вероятно, имеет смысл сделать это отключаемой настройкой, возможно на 3 варианта:

  1. Отключено.
  2. В баннере в углу, который пишет про сломанные данные, при обнаружении в ответе известных элементов заглушки писать предложение пройти проверку на любой странице, и ссылку на что-нибудь, например просто / (главную страницу сайта).
  3. Добавлять айфрейм например с /robots.txt и убирать через десяток секунд полностью автоматически.

Для себя я решил вопрос так (вариант 3 по сути):

function ajaxLoad(url, returnForm = true, useCache = false) {
    return AjaxCache.runCachedAjax(url, useCache).then(xhr => {
        var el, text = xhr.responseText;
        if (text.includes('</html>')) {
            el = returnForm ? $q(aib.qDForm, $DOM(text)) : $DOM(text);
        }

// вставка изменений отсюда:
        if (!el && text.includes('<script src="https://static.stormwall.pro/')) {
            // console.log('Got response:\n' + text);

            setTimeout(ajaxLoadAntiDDoSCheck, 3000);
        } else {
            ajaxLoadAntiDDoSCheckClose();
        }
// досюда;

        return el ? el : CancelablePromise.reject(new AjaxError(0, Lng.errCorruptData[lang]));
    }, err => err.code === 304 ? null : CancelablePromise.reject(err));
}

// далее своё содержимое:

const antiDDoSCheckElementID = 'de-check-antiDDoS';

function ajaxLoadAntiDDoSCheckClose() {
    var el = $id(antiDDoSCheckElementID);

    if (el) {
        console.log((el.src || el.href) + ' closed.');

        el.remove();
    }
}

function ajaxLoadAntiDDoSCheck() {
    var useIFrame = true;
    var checkPath = '/#' + (+new Date) + '#' + new Date;
    var a = $id(antiDDoSCheckElementID);

    if (!a) {
        var container = $id('de-thread-buttons') || $q('.de-thread-buttons') || document.body;

        if (useIFrame) {
            a = document.createElement('iframe');
            a.width = 500;
            a.height = 500;
        } else {
            a = document.createElement('a');
            a.target = '_blank';
        }

        a.title = a.id = antiDDoSCheckElementID;

        container.appendChild(a);
    }

    if (a) {
        console.log(checkPath + ' opened for antiDDoS check.');

        if (useIFrame) {
            a.src = checkPath;
        } else {
            a.href = checkPath;
            a.click();
        }
    }
}

Может быть пригодится, хотя код довольно-таки отсебятен, да ещё и под старый форк, да и в прошлый раз мой пул-реквест практически целиком выкинули, позаимствовав лишь идею.

Вот сэмпл странички-заглушки на всякий случай, с заменой ключей на дутые строки:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link rel="stylesheet" href="https://static.stormwall.pro/captcha.css">
</head>
<body>
<!-- Header -->
<div class="header">
    <div id="errorCode" class="error-code"></div>
</div>
<!-- Content -->
<div class="content">

<div id="validation-frame" class="infoblock action-description invisible">
    <img class="loader" src="https://static.stormwall.pro/ajax-loader.gif" />
</div>

<div id="successful-frame" class="infoblock action-description invisible">
    <img src="https://static.stormwall.pro/ok-icon-128.png" />
</div>

<div id="youshellnotpass-frame" class="infoblock action-description invisible">
    <form id="recaptcha2" class="captcha-container" action="" method="POST">
        <div class="captcha">
            <div class="left-col">
                <p>Your browser cannot be verified automatically, please confirm you are not a robot.</p>
                <div class="g-recaptcha" data-sitekey="DUMMY_SITEKEY" data-callback="recaptcha2CB"></div>
                <input type="hidden" name="swp_sessionKey" value="DUMMY_SESSIONKEY">
            </div>
            <div class="right-col">
                <img src="https://static.stormwall.pro/error-icon-128.png" />
                <p id="redirecting"></p>
            </div>
        </div>
    </form>
</div>

</div>
<!-- Scripting -->
<script>
var recaptcha3key = 'DUMMY_RECAPTCHA3KEY';
var sessionKey = 'DUMMY_SESSIONKEY';
</script>

<script src="https://static.stormwall.pro/jquery-3.2.1.min.js"></script>
<script id="recaptcha3-source" src="https://www.google.com/recaptcha/api.js?render=DUMMY_RECAPTCHA3KEY"></script>
<script src="https://static.stormwall.pro/captcha1.1.js"></script>

</body>
</html>

P.S. Вместо /robots.txt можно с тем же успехом тыкать /favicon.ico, с тем отличием, что если он таки покажется сам собой, то не будет пугать пользователя.

P.S.2. Сегодня запрос /robots.txt перестал помогать, обычные страницы сайта помогают (например, главная), иконку не пробовал. Поправил свой код выше.

SthephanShinkufag commented 3 years ago

Сейчас этой фигни уже нет?

f2d commented 3 years ago

@SthephanShinkufag всё ещё есть, обновлялка добавлением главной страницы в айфрейме всё ещё работает. Получаемые печеньки довольно давно устаканились на сроке в 12 часов.

SthephanShinkufag commented 3 years ago

летчик.жпг На ычан почти не заходил последний год, но вот сейчас никаких проверок и гуглокапч нема. Заходил месяц назад где-то, посидел в куклотреде, тоже ничего такого не было. Нужно ждать?

f2d commented 3 years ago

Печенька называется swp_token, можно посмотреть её наличие или удалить, наверняка была получена при заходе незаметно, с авторедиректом. Через скрипты вроде пхп без печенья сайт отдаёт заглушку на полкилобайта.

Основная проблема в том, что кукла перестанет обновлять посты при протухании печенья, требуя телодвижений пользователя (открыть что-нибудь, что покажет заглушку, исполнит жаваскрипт на ней, получит куку и пропустит дальше).

SthephanShinkufag commented 3 years ago

Ага. Печенька. Спасибо друже, что разъяснили, а то я савсэм отупел касаемо бордотематики, очень тяжко въезжать сейчас в это всё.

f2d commented 3 years ago

Кстати только что проверил /favicon.ico, удалив токен. Иконка не даёт печенья и не требует его для просмотра.

Главная страница мне кажется нормальным выходом, но где её лучше показывать и в каком размере, я не придумал. У себя сделал просто снизу треда, рядом с кнопкой обновления. В качестве предложения - наверно лучше так, чтобы в айфрейме-"бойнице" пользователю было видно страницу-ошибку (типа 404 или 500), если такая возникнет.

SthephanShinkufag commented 3 years ago

Проверяйте.

SthephanShinkufag commented 3 years ago

Будет совсем кошерно, ежели вы мне скажете, как добиться появления рекапчи, ибо я поведения с рекапчей не тестировал, может нужно будет доработать.

f2d commented 3 years ago

@SthephanShinkufag Проверил в /d/. Ридонли автообновление токена работает, показывает в углу сообщение о проверке, которое закрывается само. Отправка поста с рабочим токеном и свежей капчей работает.

Отправка поста без токена не работает, показывает в углу спиннер штормвола в панельке примерно 130х200пх, который так и висит там, не пропадая, пока не закроешь крестиком. При этом сразу же под спиннером отдельно показывает в углу сообщение о проверке, которое обновляет токен и закрывается само. Пост не отправлен, форма не закрыта, спиннер висит, печенька получена.

Обновление капчи без токена не работает, показывает иконку битой картинки на месте капчи.

P.S.

Я лично считаю указанные проблемы некритичными, потому что при отправке поста за компьютером сидит человек и может обновить посты и отправить свой со второй попытки.

SthephanShinkufag commented 3 years ago

Я тестировал только обновление треда, отправку постов и прочее не тестировал.

SthephanShinkufag commented 3 years ago

Отправка поста без токена не работает, показывает в углу спиннер штормвола в панельке примерно 130х200пх, который так и висит там, не пропадая, пока не закроешь крестиком. При этом сразу же под спиннером отдельно показывает в углу сообщение о проверке, которое обновляет токен и закрывается само. Пост не отправлен, форма не закрыта, спиннер висит, печенька получена.

Обновление капчи без токена не работает, показывает иконку битой картинки на месте капчи.

Исправлено, проверяйте.

f2d commented 3 years ago

@SthephanShinkufag Теперь всё работает, насколько я могу видеть. Ещё работает например сначала ввод капчи, потом удаление токена, потом отправка поста. Иногда я получал ответ, что капча неправильная (в /d/ она перечёркнутая и буквы можно понять не так), но скорее всего скрипт в этом не виноват.

Насчёт вызова гуглокапчи, я вообще давно её там не видел, и может быть она теперь не появляется. Или это зависит (авто?)настройки тяжести защиты штормвола под ДДОС-нагрузками. Я не очень в курсе, как он работает.