• Как отклонить соединение при 10 и более запросов TTL 58?

    karabanov
    @karabanov
    Системный администратор
    Устанавливаешь ipset (возможно уже установлен) и добавляешь список:
    sudo ipset -N BANNED_IP nethash

    Добавляешь правила:
    # Отбрасываем пакет если TTL 58 и IP есть в списке BANNED_IP
    sudo iptables -A INPUT -m ttl --ttl-eq 58 -m set --match-set BANNED_IP src -j DROP
    
    # Надо как-то добавлять IP отвечающие критериям в список BANNED_IP, для этого
    # Добавляем кастомную цепочку RATE-LIMIT
    sudo iptables -N RATE-LIMIT
    
    # Если TTL 58 передаём пакет на обработку в цепочку RATE-LIMIT
    sudo iptables -A INPUT -m ttl --ttl-eq 58 -j RATE-LIMIT
    
    # Если количество пакетов не превышает 2 в секунду, то пропускаем
    sudo iptables -A RATE-LIMIT -m limit --limit 2/second -j ACCEPT
    
    # Когда лимит превышен добавляем в лог запись об этом событии
    sudo iptables -A RATE-LIMIT -j LOG --log-prefix "LIMIT_EXCEEDED: "
    
    # Затем добавляем IP в список BANNED_IP
    sudo iptables -A RATE-LIMIT -m ttl --ttl-eq 58 -j SET --add-set BANNED_IP src
    
    # Не обязательно, но отбрасываем пакет
    sudo iptables -A RATE-LIMIT -j DROP


    Посмотреть, кто попался sudo ipset list BANNED_IP
    Удалить из списка если надо sudo ipset del BANNED_IP <Забаненый IP>

    Проверить, что работает sudo ping -i 0,1 -t 58 <IP сервера>
    Посмотреть лог tail -F /var/log/syslog | grep LIMIT_EXCEEDED
    Или так dmesg | tail | grep LIMIT_EXCEEDED

    PS
    Себя только не забань. Убедись, что при любом раскладе ты сможешь подключиться к серверу по IPMI или физически присутствуя рядом с ним с монитором и клавиатурой.
    Ответ написан
    1 комментарий
  • Как защитить контент от парсинга с помощью Nginx?

    @rPman
    Основная защита от парсинга - только при доступе к данным по авторизации и установка лимитов на данные (объем, доступный пользователю либо за какой то период времени, например сутки/месяц).

    Анонимно доступные данные, в общем случае, защитить от выгрузки пользователями - невозможно. Все что пользователь видит на экране можно тупо скопировать и проанализировать.

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

    Можно поставить 'палки в колеса', сделав этот процесс сложнее (и дороже), в основном это запутывание/шифрование данных, доступных напрямую (по api) с бакэнда и обфускация кода, его преобразования в видимый пользователю контент, чтобы классические (дешевые) инструменты не работали. Как всегда стоимость защиты (затрат на разработку) должна быть сравнима затрат граберов на получение данных (обычно им проще).
    К сожалению вместе с контент-грабером, в заблуждение будут введены роботы поисковых систем, ведь их основная работа - грабить контент.
    spoiler
    * api не должен быть простым и интуитивно понятным, идентификаторы могут вообще не быть постоянными (их можно преобразовывать на бакэнде на основе данных в сессии)
    * код javascipt, например получения ссылки на объект должен быть нетривиальным, т.е. чтобы получить следующую ссылку на требуемый граберу объект, потребовалось бы использовать сам браузер (а не простенький скрипт парсер html)
    * верстка может быть непостоянной, изменяющиеся, простые гуляющие наименования классов и идентификаторов уже могут создать кучу проблем (я такое встречал), а уж постоянное изменение структуры должно совсем запудрить голову даже опытным граберам (не встречал)
    * шрифт может не являться правильным (видимые символы могут не соответствовать их кодам), при этом генерируемый каждый раз новый под конкретную сессию пользователя. Простая подстановка, сильно усложнит (но не сделает невозможной) получение данных через буфер или document.innerText в консоли браузера, оставив граберу только вариант распознавание экрана скринридером (а не тривиальная верстка потребует от пользователя сложную настройку и автоматизацию и эти инструменты)
    * типовые javascript методы браузера должны быть замещены на 'неправильно работающие', чтобы граберу пришлось использовать внешние скрипты а не простой инжект javascript (обычно это сильно упрощает).
    Ответ написан
    3 комментария
  • Как по всему документу скрыть значения которые имеют undefined?

    0xD34F
    @0xD34F Куратор тега JavaScript
    То есть, вместо того, чтобы изначально не пытаться показывать то, чего нет, вы хотите заметать мусор под ковёр.

    Умно, ничего не скажешь.

    А главное - это будет ни разу не костыль.
    /*
     * надеюсь, хотя бы вместо "по всему документу" вы сумеете подобрать
     * какой-нибудь вменяемый селектор, чтобы не проверять реально всё,
     * а только те элементы, где ваш "undefined" действительно может случиться
     */
    document.querySelectorAll('*').forEach(n => {
      const text = n.innerText?.trim();
      if (text === 'undefined') {
        n.hidden = true;
      }
    });
    Ответ написан
    4 комментария